redis

一、redis非关系型基础数据结构

  1. 字符串string
  2. 列表list
  3. 集合set
  4. 有序集合sort set
  5. 散列hash

二、基本命令

  1. dbsize 获取存储数据个数
  2. exists key 判断是否存在key
  3. del key 删除指定数据
  4. scan 0 match key count 10 从0下标开始查找key,查找10条数据
  5. type key 返回key的数据类型
  6. expire key 1000 设置key1000秒过期时间
  7. ttl key 返回整数表示剩余时间,-1表示永久有效,-2已经失效过期

二、string基本命令

  1. set key value 设置单个key值
  2. set key value xx 存在key值才设置成功,相当于存在数据才修改
  3. set key value nx 不存在key值才设置成功,相当于不存在数据才添加
  4. set key value EX 100 设置key值,并设置过期时间100秒
  5. set key value EX 100 nx 结合3,4可以实现不存在key才添加成功且设置过期时间100秒,命令为原子性操作
  6. set key value EX 100 xx 结合2,4可以实现存在key才修改key值且设置过期时间100秒,命令为原子性操作
  7. get key 获取单个key值
  8. mset key1 value1 key2 value 设置多个key值
  9. mget key1 key2 获取多个key值
  10. incr key 使key自增1并返回自增后的值
  11. incrby key 10 使key自增指定值10
  12. decr key 使key自减1
  13. decrby key 10 使key自减指定值10
  14. setnx key value 如果key不存在则添加成功,否则添加失败
  15. setex key 100 value 设置key值,并设置过期时间100秒
  16. getset key value 设置key值并返回旧的value

三、hash基本命令,结构为key-value

  1. hset key field value 设置key为键值对
  2. hsetnx key name dp 如果key只不存在设置key值为键值对
  3. hmset key name dp sex man 批量设置
  4. hget key field 获取值
  5. hmget key field1 field2 批量获取值
  6. hexists key field 是否存在field
  7. hvals key 返回key下键值对所有的value
  8. hkeys key 返回key下键值对所有的field

四、list基本命令

五、set基本命令,数据无序且不可重复

  1. sadd key value1 value2 value3 添加元素无序,如果添加单个元素存在则添加失败,添加多个元素有一个不存在则添加成功,否则添加失败。返回添加成功的个数
  2. srem key value1 value2 删除多个元素,返回删除成功元素的个数
  3. smembers key 获取所有元素的集合

六、zset基本命令,数据有序且不可重复

七、缓存雪崩

出现场景:

  1. 某个时刻redis出现问题,请求全部访问数据库,导致数据库崩溃。redis设置主从架构,或者集群来解决问题
  2. 缓存的过期时间相同,缓存失效后,大量请求访问数据库重新设置缓存,导致数据库崩溃。缓存时间添加随机值来解决问题

七、缓存击穿

出现场景:请求的数据在缓存大量不命中,导致访问数据库
解决方案:

  1. 请求前加一层布隆过滤器,拦截不存在的请求,不合法则不请求到数据库
  2. 根据业务场景,设置缓存对象为空。但可能出现缓存为空后,数据被添加进去,在缓存时间内任然查出为空。

八、Redis的过期策略和内存淘汰机制

过期策略: 如果一批key设置了过期时间,达到了过期时间后怎么删除。定期删除+惰性删除

定期删除: 没过一段时间随机抽取key来检查和删除

惰性删除: 获取某个key的时候,检查key是否过期,如果过期则就会删除不会返回任何值。

内存淘汰机制: 如果redis的内存占用过多的时候,此时会进行内存淘汰,有如下一些策略:

  1. noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧
  2. allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
  3. allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般没人用吧
  4. volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key这个一般不太合适
  5. volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
  6. volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

九、rdb,aof

  1. rdb是redis默认持久化方案,在指定时间内,达到指定的写操作次数。则会触发bgsave将内存中的数据写到磁盘中,生成一个dump.rdb文件。redis重启会加载dump.rdb文件恢复数据
  2. save保存数据,直接调用 rdbSave ,阻塞 Redis主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。
  3. bgsave保存数据,则是fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。 Redis 服务器在bgsave执行期间仍然可以继续处理客户端的请求。
  4. aof 会将收到的每个命令追加到文件中,当aof文件是上次重写后大小的一倍或者大于配置文件的64M(建议设置为3G)会触发重写,根据当前内存的数据重写一个新的aof文件。rdb和aof同时开启时,会优先使用aof。
    appendonly yes 开启aof
    appendfsync always 每条命令都保存
    appendfsync everysec 每秒保存一次
    appendfsync no 从不保存
  5. rdb全量备份,非常适用于备用和灾难恢复
  6. rdb在恢复大数据时的数据比aof速度要快
  7. aof配置每隔一秒保存一次命令,redis出问题时可能会丢失最后一秒的数据。且aof的日志文件通常比rdb大
  8. aof非常使用误删缓存数据恢复,只需要清除删除命令即可

十、从数据库加载100W条到redis

  1. 分批次查询数据
  2. 使用pipleLine保存到redis

十一、主从复制

  1. 配置3台机器:
    主:127.0.0.1 6379
    从:127.0.0.2 6380
    从:127.0.0.3 6381
    在从机的conf文件中,配置slaveof 127.0.0.1 6379
    如果主机挂掉后,登录从机127.0.0.2 执行slaveof no one就变成主机,然后在127.0.0.3中执行命令slaveof 127.0.0.2 6380变成他的从机
    设置从节点只读:slave-read-only yes

十二、哨兵模式

  1. 三个定时任务

一.每10秒每个 sentinel 对master 和 slave 执行info 命令:该命令第一个是用来发现slave节点,第二个是确定主从关系.
  二.每2秒每个 sentinel 通过 master 节点的 channel(名称为_sentinel_:hello) 交换信息(pub/sub):用来交互对节点的看法(后面会介绍的节点主观下线和客观下线)以及自身信息.
  三.每1秒每个 sentinel 对其他 sentinel 和 redis 执行 ping 命令,用于心跳检测,作为节点存活的判断依据.

  1. 主观下线
    当前sentinel实例认为某个redis服务不可用
  2. 客观下线,如果sentinel集群中超过quonum(配置)数量的节点认为该redis节点主观下线,则该redis客观下线。如果节点是丛节点则操作到此为止,如果是主节点则执行故障转移
  3. 选举sentinel Leader
    如果某个sentinel投票数 > sentinel数/2 + 1(表示超过半数),则认为是sentinel Leader否则重新选举
  4. sentinel Leader选择一个redis节点作为主节点
    过滤故障节点
    选择优先级slave-priority最大的节点作为主节点,如果不存在则继续
    选择复制偏移量最大的节点作为主节点,当主从的偏移量一致则数据是完全同步的,如果不存在则继续
    选择runid最小的节点作为主节点,随机生成的

参考

  1. https://juejin.cn/post/6844903990212165645
  2. https://www.cnblogs.com/warrior4236/p/12724937.html
  3. https://www.cnblogs.com/mengchunchen/p/10039467.html
  4. https://www.cnblogs.com/codingmode/p/12633261.html
  5. https://www.cnblogs.com/zhangfengshi/p/13292190.html
  6. https://blog.csdn.net/ysvae/article/details/106417485
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值