缓存设计问题
缓存过期和淘汰
2.1 缓存过期
1、定时过期(节约空间、但耗性能)
每个设置过期时间的key都创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源进行计时和处理过期数据,从而影响缓存的响应时间和吞吐量。
2、惰性过期(提高性能,但占用内存空间)
只有当访问一个key时,才会判断该key是否已过期,过期则清除(返回nil)。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
3、定期过期(以上方案的折中)
每隔一定的时间,扫描数据库中一部分设置了有效期的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果
Redis的过期策略
Redis中同时使用了惰性过期(上面的方案2)和定期过期(上面的方案3)两种过期策略。
定期过期: 默认是每100ms检测一次,遇到过期的key则进行删除,这里的检测并不是顺序检测,而是随机检测。
惰性过期: 当我们去读/写一个key时,会触发Redis的惰性过期策略,直接删除过期的key
2.2 缓存淘汰
假定某个key逃过了定期过期, 且长期没有使用(即逃过惰性过期), 那么redis的内存会越来越高。当redis占用的内存达到系统上限时, 就会触发 内存淘汰机制。
所谓内存淘汰机制, 是指 在Redis允许使用的内存达到上限时,如何淘汰已有数据及处理新的写入需求。
Redis自身提供了多种缓存淘汰策略, 最常用的是 LRU 和 LFU