Redis 学习记录
Redis 学习记录
一、应用场景
缓存
分布式锁:setnx(不存在则设置)
限流:单线程
发布/订阅
二、数据结构
String
Hash
List
Set
zSet(Sorted Set)
三、持久化
RDB(Redis DataBase)
AOF(Append Only File)
四、部署模式
- 主从模式
优点:主从复制,读写分离
缺点:无法自动完成故障转移;写瓶颈,存储瓶颈;无法实现动态扩容。
- 哨兵模式
优点:主节点故障,可以完成故障转移
缺点:写瓶颈,存储瓶颈;无法实现动态扩容。
- 集群模式
优点:高可用,可扩展
核心:Hash虚拟槽分区;CRC16 - 循环冗余校验算法
五、Redis集群选举原理
当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master。由于挂掉的master可能会有多个slave,从而存在多个slave竞争成为master节点的过程, 其过程如下:
1.slave发现自己的master变为FAIL
2.将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST信息
3.其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack
4.尝试failover的slave收集FAILOVER_AUTH_ACK
5.超过半数后变成新Master
6.广播Pong通知其他集群节点。
从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票
延迟计算公式:
DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms
SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方式下,持有最新数据的slave将会首先发起选举(理论上)。
六、Redis 键销毁机制
1、被动删除
当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
2、主动删除
由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
3、当前已用内存超过maxmemory限定时,触发主动删除策略
七、Redis内存回收算法
1、引用计数算法
2、LRU算法
LRU是Least Recently Used的缩写,即最近最少使用。
八、Redis 穿透,雪崩
1、缓存雪崩
数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。
解决思路:
缓存高可用,缓存降级,预热
2、缓存穿透
缓存穿透是指查询一个一不存在的数据。例如:从缓存redis没有命中,需要从mysql数据库查询,查不到数据则不写入缓存,
这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决思路:
如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库。
设置一个过期时间或者当有值的时候将缓存中的值替换掉即可。
可以给key设置一些格式规则,然后查询之前先过滤掉不符合规则的Key。
3、缓存并发
这里的并发指的是多个redis的client同时set key引起的并发问题。其实redis自身就是单线程操作,多个client并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。
当然,另外的解决方案是把redis.set操作放在队列中使其串行化,必须的一个一个执行。
4、缓存预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。
这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!
解决思路:
4.1、直接写个缓存刷新页面,上线时手工操作下;
4.2、数据量不大,可以在项目启动的时候自动进行加载;
目的就是在系统上线前,将数据加载到缓存中。
以上就是缓存雪崩、预热、降级等的介绍。
九、Redis 脑裂
redis的集群脑裂是指因为网络问题,导致redis master节点跟redis slave节点和sentinel集群处于不同的网络分区,
此时因为sentinel集群无法感知到master的存在,所以将slave节点提升为master节点。
此时存在两个不同的master节点,就像一个大脑分裂成了两个。
解决方案
min-slaves-to-write 3
min-slaves-max-lag 10
第一个参数表示连接到master的最少slave数量
第二个参数表示slave连接到master的最大延迟时间
按照上面的配置,要求至少3个slave节点,且数据复制和同步的延迟不能超过10秒,否则的话master就会拒绝写请求,配置了这两个参数之后,如果发生集群脑裂,原先的master节点接收到客户端的写入请求会拒绝,就可以减少数据同步之后的数据丢失。
注意:较新版本的redis.conf文件中的参数变成了
min-replicas-to-write 3
min-replicas-max-lag 10
参考资料
详解Redis中两种持久化机制RDB和AOF(面试常问,工作常用)
redis 主从模式,哨兵模式,cluster(集群)模式 简介
Redis进阶实践之十一 Redis的Cluster集群搭建
Redis进阶实践之十二 Redis的Cluster集群动态扩容
Redis 学习笔记(十四)Redis Cluster介绍与搭建
redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比
redis学习及实践3---Jedis、JedisPool、Jedis分布式实例介绍
redis 工具类 单个redis、JedisPool 及多个redis、shardedJedisPool与spring的集成配置
Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑