文章目录
- redis的过期淘汰策略
- redis对于过期键有三种清除策略:
- LRU(least recently used)算法
- LFU(least frequently used) 算法
- 具体应用案例
- 对于主从缓存过期
redis的过期淘汰策略
redis对于过期键有三种清除策略:
- 被动删除: 当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key (垃圾key如果没访问,则不会删除)
- 主动删除: 由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批
已过期
的key - 当前已用没存超过maxmemory限定时,触发
主动删除策略
主动删除策略
在Redis 4.0 之前一共实现了6种内存淘汰策略,在 4.0 之后,又增加了2种策略,总共8种
a) 针对设置了过期时间的key做处理
- volatile-ttl: 在筛选时,会针对已设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。
- volatile-random: 在设置了过期时间的键值对中,进行随机删除。
- volatile-lru: 会使用LRU算法筛选设置了过期时间的键值对删除
- volatile-lfu: 会使用LFU算法筛选设置了过期时间的键值对删除。
b) 针对所有的key做处理
- allkeys-random: 所有键值对随机删除
- allkeys-lru: 使用lRU算法在所有数据中筛选删除
- allkeys-lfu: 使用LFU算法在所有数据中筛选删除
c) 不处理
- noeviction: 不会剔除任何数据,拒绝所有写入操作并返回客户端信息(error)OOM command not allowed when used memory,此时redis只响应读操作。
LRU(least recently used)算法
最近最少使用,淘汰很久没有被访问过的数据,以最近一次访问
时间做参考
LFU(least frequently used) 算法
最不经常使用,淘汰最近一段时间被访问最少的数据,以次数
做参考
如何配置
#配置maxmemory
maxmemory 100mb
#配置淘汰策略
maxmemory-policy allkeys-lru
具体应用案例
大多数情况推荐使用volatile-lru
如果Mysql里有 2000W 数据,而Redis中只能存 20W 数据,如何保证redis中的数据都是热点数据?
方案:
只能存储 20w 条数据,那肯定要保证redis存储的都是热点数据
,即:被频繁访问到的数据
;并且要保证Redis的内存能够存放20w数据,要计算出Redis内存的大小。
(1) 保留热点数据:对于保留 Redis 热点数据来说,我们可以设定 Redis 的key过期时间结合内存淘汰策略来实现,比如,使用allkeys-lfu(以次数为准,越高越热
)淘汰策略,该淘汰策略是从 Redis 的数据中挑选最近最少使用的数据删除,这样频繁被访问的数据就可以保留下来了
(2)保证 Redis 只存20w的数据:1个中文占2个字节,假如1条数据有100个中文,则1条数据占200字节,20w数据乘以200个字节 (200000 * 200 = 40000000),约等于4000万个字节,大于等于38M,所以要保证能存20w数据,Redis 需要38M的内存,对应的内存设定之后,一旦数据满了就可以触发我们的数据淘汰策略,保证数据存储满足20w且为热点数据。
对于主从缓存过期
从节点接收到主节点的del命令,从节点删除从库中的键值