redis 过期策略
前提知识:redis中所有的key-value组成一个hash字典。其中,带有过期时间的key-value也单独组成一个字典(这对过期和淘汰重要,甚至,zset中的value和score的映射关系也是通过字典保存的。
redis过期策略有两种:
- 定时删除(贪心):每秒10次扫描,每次扫描在过期池中中随机选出20个key,删除已经过期的,如果过期key超过四分之一,则继续下次循环。扫描时会阻塞客户端的请求 ,但是最大不会超过25ms。
- 惰性删除:操作此rediskey的时候,如果过期,直接删除。
说明:上述过期策略只会针主节点。从节点则会根据主节点的aof文件进行删除。
淘汰策略
redis会设置一个maxmemory来限制内存的大小。超过这个值时就会开发淘汰策略。
- noeviction : 拒绝写请求
- volatile-lru:只针对设置了过期时间的key,采取近似lru策略
- volatile-ttl:只针对设置了过期时间的key,比较key的剩余时间
- volatile-random:只针对设置了过期时间的key,随机过期
- allkeys-lru: 针对所有的key
- allkeys-random:针对所有的key
近似lru策略:
随机选取5个key,淘汰最旧的值。循环如此,直到内存小于maxmemory。
异步操作
虽说redis时单线程的,只是说接收到请求处理数据时是单线程的。其内部有几个异步线程专门处理一些耗时比较严重的任务。
如:
- 删除大key
- flushDB、flushAll
- aof刷盘
- 等lo
本文详细阐述了Redis的过期删除机制,包括定时扫描与惰性删除策略,并介绍了内存不足时的LRU淘汰策略。同时讨论了生产环境和测试环境的不同内存配置。
776





