redis服务器的内存大小是有限的,如何保证数据不会占满整个内存,这就需要数据过期和数据淘汰策略。
什么是数据过期策略?
我们可以给redis中的数据设置有效时间,当redis中的数据过期以后如何删除redis中的数据是立即删除吗?
答案是否,在redis中有两种数据过期策略:
第一种是惰性删除
例如设置一个key的过期时间以后,不去管它,当需要该key时查询该key是否过期,如果过期则删除,没有过期则返回它对应的值。
惰性删除策略的好处是:只会在需要用到该key时才会去检查是否过期,对于很多一直不会使用的key就不需要浪费cpu和时间去进行过期检查了。
惰性删除策略的缺点是:如果一个key已经过期但是一直没有使用那么该key就会一直存在于内存中,内存一直得不到释放。
第二种是定期删除
每隔一段时间我们就从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key。
定期删除有两种模式:
Slow模式:
这种模式是定时任务,执行频率为10hz,每次不超过25ms,也就是每秒钟执行10次,每次不超过25毫秒。我们可以在redis的配置文件redis.conf中修改该配置。
Fast模式:
这种模式执行频率不固定,但是两次之间的间隔不低于2ms,每次执行不超过1ms。
定期删除模式可以通过设置执行频率和执行时长来减少删除操作对CPU的影响,也能有效的释放过期key的内存空间,但是确定它的执行频率和时长本身是一件比较困难的事。
在实际应用中我们一般会结合惰性删除和定期删除这两种数据过期策略。
再来看一下数据淘汰策略:
当redis中的内存不够时再向redis中添加数据redis就会按照某种规则将内存中的数据删掉,这种数据的删除规则就是数据淘汰策略。
redis支持8种数据淘汰策略:
noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,如果写入就报错,默认就是这种策略。
volatile-ttl: 对设置了TTL(过期时间)的key,比较key的剩余TTL(过期时间)值,TTL(过期时间)越小越先被淘汰。
allkeys-random:对全体key ,随机进行淘汰。
volatile-random:对设置了TTL的key ,随机进行淘汰
allkeys-lru: 对全体key,基于LRU算法进行淘汰
什么是LRU算法:
LRU(Least Recently Used)最近最少使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰
allkeys-lfu: 对全体key,基于LFU算法进行淘汰
什么是LFU算法:
LFU(Least Frequently Used)最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。
volatile-lfu: 对设置了TTL的key,基于LFU算法进行淘汰
在实际应用中如果没有特殊情况我们可以优先选择allkeys-lru这种策略,把最近最常访问的数据留在缓存中。