Redis 过期键删除策略和内存淘汰机制

320 阅读3分钟

过期键删除策略

1、定时删除
在某些键设置过期的同时,创建一个定时任务。过期键在定时任务跑到的时刻,立即删除。
优点:能够保证 key(过期键)一旦过期立马就会被删除。
缺点:如果过期键比较多的时候,删除时候会抢占 CPU 的资源。

2、定期删除
每隔一段时间,随机的对设置的一些过期键进行扫描,如果已经过期,则删除过期键。
优点:能减少删除时对 CPU 抢占资源的影响,同时也能删除过期键。
缺点:因为是随机扫描,所以不能删除所有过期的键。

3、惰性删除
对于设置的过期键,在使用的时候检测是否过期,如果过期,则删除。否则,返回该key(键)。
优点:不会抢占 CPU 资源,因为只有在使用的时候才会去检测。
缺点:对于已经过期的 key(键),如果一直不使用的话,那么会一直存在不会删除,内存也不会释放。从而出发内存淘汰机制

默认删除方式:定期删除+惰性删除

内存淘汰策略

前面提到,如果一些过期键一直没有删除,那么内存也不会释放。但是当 Redis 的内存超过允许的最大值后,就会触发内存淘汰策略

1、noeviction:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就返回error,然后啥也不干

2、allkeys-lru:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会扫描所有的key,淘汰一些最近未使用的key

3、volatile-lru:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,扫描那些设置里过期时间的key,淘汰一些最近未使用的key

4、allkeys-random:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会扫描所有的key,随机淘汰一些key

5、volatile-random:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,扫描那些设置里过期时间的key,随机淘汰一些key

6、volatile-ttl:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,扫描那些设置里过期时间的key,淘汰一些即将过期的key

7、volatile-lfu:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会淘汰一些设置了过期时间的,并且最近最少使用的key

8、allkeys-lfu:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会扫描所有的key,淘汰一些最近最少使用的key