Redis的数据淘汰策略
什么是数据淘汰策略
数据过期策略是 redis 中设置了 TTL 的数据过期的时候 Redis 的处理策略。数据淘汰策略是 Redis 内存不够的时候,
数据的淘汰策略:当 Redis 中的内存不够用时,此时在向 Redis 中添加新的 key, 那么 Redis 就会按照某一种规则将内存中的数据删除掉,这种数据的删除规测被称之为内存的淘汰策略。
redis 的内存删除策略有:
·noeviction: 不会淘汰任何键值对,而是直接返回错误信息。
·allkeys-lru: 从所有 key 中选择最近最少使用的那个 key 并删除。
·volatile-lru: 从设置了过期时间的 key 中选择最近最少使用的那个 key 并删除。
·allkeys-random: 从所有 key 中随机选择一个 key 并删除。
·volatile-random: 从设置了过期时间的 key 中随机选择一个 key 并删除。
·volatile-ttl: 从设置了过期时间的 key 中选择剩余时间最短的 key 并删除。
·volatile-lfu: 淘汰的对象是带有过期时间的键值对中,访问频率最低的那个。
·allkeys-lfu: 淘汰的对象则是所有键值对中,访问频该最低的那个。
大概可以分为几类分别是:LRU,LFU,random 等。
Random 没什么好说的随机就是了。接下来详细谈一下 LRU 和 LFU 算法。
LRU 算法
LRU 算法的思想是:如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。
因此,当空间满时,最久没有访问的数据最先被淘汰。
算法的流程是以一个链表实现:
- 当我们新插入缓存中的数据添加到链表的头部。
- 当我们使用的缓存也放到链表的头部。
- 当内存不足需要 Redis 内存淘汰的时候,淘汰链表尾部的缓存(最近访问最少的)即可。
LFU 算法
LFU (Least Frequently Used, 最近最不常用)
顾名思义,LFU 算法的思想是:如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被淘汰。
LFU 的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排
序。
算法流程:
- 当我们新添加的缓存计数为 1 然后添加到队列尾部(按照计数排序)
- 每使用一次的数据计数+1
- 淘汰队列最后的元素。
推荐使用的方案
Redis 中默认使用的是:noeviction,也就是当内存满的时候不添加新的元素,不删除元素,新添加的元素报错。
当然这不是最优解,上述我们介绍了两种淘汰算法:
- 当 Redis 作为缓存使用的时候,推荐使用 allkeys-lru 淘汰策略。该策略会将最近最少使用的 Key 淘汰。默认情况下,选择最近最少使用的那个 key 并删除。
- 当 Redis 作为半缓存半持久化使用时,可以使用 volatile-ru。但因为 Redis 本身不建议保存持久化数据,所以只作为备选方案。