过期键删除策略
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