键删除机制
用定时器监视key,如果键过期了,则直接执行删除
优点:对内存友好,可以及时删除过期键避免占用内存
缺点:对CPU不友好,在处理高并发请求时,CPU应该尽量处理请求而不是删除过期键
每次获取键时,判断是不是过期了,如果过期了就执行删除
优点:对CPU友好
缺点:对内存不友好,过期键不会及时删除,占用内存
每100ms随机抽取检查是否有过期的key,有过期的key则删除。
优点:同时节省CPU和内存
缺点:会导致很多key到时间没有删除,也就是使用定时删除会导致删除不完全
Redis是采用定期删除+惰性删除策略
内存淘汰策略
内存淘汰机制就能保证在redis内存占用过高的时候,进行内存淘汰,也就是删除一部分key,保证redis的内存占用率不会过高。
Redis6.0.x版本的配置文件关于内存淘汰的说明:
翻译成中文就是
#MAXMEMORY策略:当达到MAXMEMORY时,Redis将如何选择要删除的内容。您可以从以下行为中选择一种:
- volatile-lru-> 从设置了过期时间的key中使用LRU算法,选出最近使用最少的数据淘汰。
- allkeys lru-> 从所有key中使用LRU算法,选出最近使用最少的数据淘汰。
- volatile-lfu-> 从设置了过期时间的key中使用LFU算法,选出使频率最低的数据淘汰。
- allkeys-lfu-> 从所有key中使用LFU算法,选出使频率最低的数据淘汰。
- volatile-random-> 从设置了过期时间的key中,随机选出数据淘汰。
- allkeys-random-> 从所有的key中,随机选出数据淘汰。
- volatile-ttl-> 从设置了过期时间的key中,选出即将过期的数据淘汰。
- noeviction-> 禁止淘汰数据,写入操作报错。
LRU表示最近使用的最少
LFU表示使用频率最低
LRU、LFU和volatile-ttl均使用近似随机算法实现。
注意:对于上述任何策略,当没有合适的键进行逐出时,Redis将在写操作时返回错误。
默认值为:maxmemory策略无受害者
前缀为volatile-和allkeys-的区别在于二者选择要清除的键时的字典不同:
- volatile-前缀的策略代表从redisDb中的expire字典(过期字典)中选择键进行清除;
- allkeys-开头的策略代表从dict字典中选择键进行清除;