1.Redis数据淘汰策略
在4.0之前,Redis提供了6种策略
volatile-lru
根据LRU算法选择设置了超时属性(expire)的数据,选择距离当前时间最长时间未访问的数据进行删除,如果没有可删除的键对象,回退到no-enviction策略,无法写入新的数据。
volatile-ttl
根据设置了超时属性(expire)的键,删除最近将要过期数据。如果没有可删除的键对象,回退到no-enviction策略,无法写入新的数据。
volatile-random
根据设置了超时属性(expire)的键,任意选择数据淘汰。如果没有可删除的键对象,回退到no-enviction策略,无法写入新的数据。
allkeys-lru
从所有数据中选择距离当前时间最长时间未访问的数据进行删除。
allkeys-random
从所有数据中任意选择数据淘汰。
no-enviction
默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息。此时只响应读操作。
在4.0开始添加了2个策略
volatile-lfu
根据LFU算法选择设置了超时属性(expire)的数据选择使用频率最少的数据进行删除,如果没有可删除的键对象,回退到no-enviction策略,无法写入新的数据。
allkeys-lfu
从所有数据中选择使用频率最少的数据进行删除。
2.淘汰算法
在版本变更中Redis主要出现了2种缓存淘汰算法即2.8开始使用LRU(最近最少使用算法)和4.0才开始使用的LFU(最少使用频率算法)。
2.1 LRU
LRU算法是基于文件历史访问记录,从缓存中剔除离当前时间最近一次访问最早的数据,其本质认为最近会被访问的数据,未来短时间也会进行访问。而在Redis中并没有使用完全的LRU算法,在2.8中使用的是近似LRU,根据maxmemory-samples选取符合的数据,再从里面执行LRU算法,在3.0中对算法进行优化,新算法会维护一个数据经过排序的淘汰池,后面只会进入比淘汰池频率最高的数据低的数据进入淘汰池,当淘汰池满的时候就淘汰池中访问频率最低的数据,插入新待淘汰数据。
2.2 LFU
LFU基于文件的访问频率,从缓存中删去过去一段时间访问次数最少的数据。
3.策略选用场景
当访问数据拥有明显的热门和冷门数据趋势的时候我们可选择allkeys-lru策略。
当访问数据没有明显趋势,类似均匀分布访问的时候,我们可以allkeys-random策略。
当我们知道哪些数据常用,哪些数据不常用的时候,我们可以手动设定不同的TTL,让Redis使用volatile-ttl策略来进行数据淘汰。
当访问数据拥有明显的周期性,如年月日周的时候,我们可以选择allkeys-lfu策略。
官方文档:redis-doc/lru-cache.md at master · redis/redis-doc · GitHub