Redis(四):过期删除策略和内存淘汰策略

过期删除策略

定时删除

在设置某个 key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作

优点:定时删除对内存是最友好的,能够保存内存的 key 一旦过期就能立即从内存中删除

缺点:对 CPU 最不友好,在过期键比较多的时候,删除过期键会占用一部分 CPU 时间,对服务器的响应时间和吞吐量造成影响

惰性删除

设置该 key 过期时间后,我们不去管它,当需要该 key 时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该 key

优点:对 CPU 友好,我们只会在使用该键时才会进行过期检查,对于很多用不到的 key 不用浪费时间进行过期检查

缺点:对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放,从而造成内存泄漏

定期删除

每隔一段时间,我们就对一些 key 进行检查,删除里面过期的 key

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存

缺点:难以确定删除操作执行的时长和频率。如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放。另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误

过期删除策略的问题

虽然 Redis 采用了惰性删除和定期删除两种策略,但对于一些永远使用不到的键,并且经过多次定期删除也没有被选定到并删除,那么这些键就会一直驻留在内存中

所以,这时候就需要使用 Redis 的内存淘汰策略来解决了

内存淘汰策略

当使用的内存大于 maxmemory 时,就会触发 Redis 主动淘汰内存方式:

volatile-lru:利用 LRU 算法移除设置过过期时间的 key (LRU:最近使用 Least Recently Used )

allkeys-lru:利用 LRU 算法移除任何key (和上一个相比,删除的 key 包括设置过期时间和不设置过期时间的),通常使用该方式

volatile-random:移除设置过过期时间的随机key 

allkeys-random:无差别的随机移除

volatile-ttl:移除即将过期的 key (minor TTL)

noeviction:不移除任何 key,只是返回一个写错误 ,默认选项,一般不会选用

参考链接

CSDN—【Redis】之过期删除策略和内存淘汰策略

你可能感兴趣的:(Redis(四):过期删除策略和内存淘汰策略)