定义: 缓存雪崩指的是当大量的缓存数据同时失效,或者Redis服务器突然宕机,导致后端数据库突然承受大量请求的压力,从而可能导致数据库崩溃的情况。
解决:
1. 分散缓存过期时间:给缓存设置不同的过期时间,避免同时失效。
2. 使用Rdis集群: 如果是Redis服务器突然宕机导致的雪崩,可以使用Redis集群提高服务的可用性,如(哨兵模式或集群模式)
3. 限流降级:在访问量剧增时,采用限流策略,限制数据库的请求频率;或者采用降级策略,返回备选数据或默认值。
定义:缓存穿透指的是查询一个一定不存在的数据,该数据不存在,每次请求都要到数据库去查询取数据并返回空值。
解决:
1. 布隆过滤器(Bloom Filter):预先判断key是否可能存在,如果布隆过滤器判断key不存在,则直接返回,减少无效查询。
2. 缓存空值:对于查询不存在的数据,也设置一个空值缓存,并设置合理的过期时间。
定义:缓存击穿是指缓存中某个key在失效的一瞬间,有大量的并发请求过来,这些请求发现缓存过期,就直接请求数据库,从而给数据库带来很大压力。
解决:
1.互斥锁:使用如Redis的setnx命令或其他方式来实现分布式锁,确保同一时间内只有一个线程去加载数据。
2.设置热点数据永不过期:对于热点数据,可以考虑设置永不过期,或者设置一个逻辑过期时间,如果查询发现数据逻辑过期,返回逻辑过期数据,同时开启互斥锁,另起一个线程更新最新热点数据,更新完毕释放锁。
双写一致性: 当修改了数据库的数据同时也要同时更新redis缓存的数据,缓存好数据库的数据要保持一致
保证双写一致:
1. 延时双删:更新数据前先删除缓存,数据更新完成后,等一会儿再删除一次缓存,但是延时多少不好确定,依然有不一致的可能。
2. 使用读写锁: 当一直性要求较高时,可以使用Redis提供的读写锁。在进行读操作时添加共享锁,可以保证读读不互斥,读写互斥。当进行写操作时,使用排它锁,读写,读读都互斥,来保证双写一致。需要注意的是,读方法和写方法需要使用的是同一把锁。
3. 使用MQ通知:一致性要求不是特别高时,可以使用异步通知的思想。如:数据更新完成之后,使用MQ通知缓存进行删除。保证最终一致。
Redis提供了两种持久化数据的方式,分别是RDB和AOF,实际项目中是两者混用。
RDB: RDB是一个快照文件,将redis存储的数据放到磁盘上,当Redis宕机恢复数据时,方便从RDB的快照文件里面恢复数据。优点是体积小,恢复速度更快,但是有丢失几分钟数据的风险。
AOF: AOF含义是追加文件,他会将redis操作的命令都存储到这个文件中,当Rdis宕机恢复的时候。从这个文件在再次执行一遍命令来恢复数据。优点是丢失数据的风险更小,可以设置刷盘策略,让他每秒批量写入一次命令,这样最多只会丢失一秒的数据。
Rdis对数据设置的有效时间过期之后不会立即删除,会按照不同的过期策略进行删除,过期策略有惰性删除和定期删除两种,一般项目中是混用。
惰性删除: redis的key过期后,不会去管他,当使用key时,检查是否过期,如果过期就删除,反之返回key。
定期删除: 每隔一段时间,对一些key进行检查,删除里面过期的key。(每次检查不会全查,只会随机检查一部分,删除其中过期的key)。定期删除有两种模式,SLOW和FAST模式,SLOW模式默认是定时任务,执行频率是10hz,每次不超过25s。FAST模式频率不固定,两次间隔不低于2ms,每次耗时不超过1ms。
先介绍两个概念:LRU和LFU
LRU(Least Recently Used ): 最近最少使用。用当前时间减去最
后一次访问时间,这个值越大则淘汰优先级越高。
LFU(Least Frequently Used): 最少频率使用。会统计每个kev的
访问频率,值越小淘汰优先级越高。
八种淘汰策略:
主从复制: Redis集群中有一个主节点和多个从节点,主节点只负责写数据然后同步给从节点,从节点只负责读数据。
哨兵模式: 主要负责实现主从集群的自动故障恢复(监控,自动故障恢复,通知)。主从加哨兵可以解决解决高可用,高并发读的问题,不能解决海量数据存储,高并发写。
分片集群: 集群中有多个master,每个master保存不同数据,同时每个master有自己的从节点。
概念介绍: 主从同步是主节点往从节点同步数据的过程,主从同步分全量同步和增量同步两种,全量同步在第一次同步时使用,之后再同步就是增量同步。
1.Replication Id: 简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid
2.offset: 偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。
全量同步:
增量同步:
定义: 集群脑裂是由于主节点和从节点和sentinel(哨兵)处于不同的网络分区,使得sentinel没有能够心跳感知到主节点,所以通过选举的方式提升了一个从节点为主节点,这样就存在了两个主节点,就像大脑分裂了一样,这样会导致客户端还在老的主节点那里写入数据,新节点无法同步数据,当网络恢复后,sentinel会将老的主节点降为从节点,然后再从新masterl同步数据,就会导致老的主节点在网络中断脱离集群到网络恢复加入集群期间写入的的客户端数据丢失。
解决: 我们可以修改rdis的配置,设置最少的能感知到的从节点数量,主节点达不到要求就拒绝客户端请求。同时缩短主从数据同步的延迟时间,避免大量的数据丢失。
名词解释:
socket:客户端的连接
epoll模式: 是指监听Socket,通知的用户socket就绪的一种实现方式,常见实现的有:select,poll,epoll
用户空间:
1.I/O多路复用
是指利用单个线程来同时监听多个Socket,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。目前的I/O多路复用都是采用的epoll模式实现,epoll模式会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间,不需要挨个遍历Socket来判断是否就绪,提升了性能。
2.Redis网络模型
就是使用I/O多路复用结合事件的处理器来应对多个Socket请求