redis的过期策略有三种
被动删除:当读/写一个已经过期的key时,会发生一个惰性删除,直接删掉这个过期的key。
主动删除:由于惰性删除的策略无法保证过期数据被及时删掉,所以redis会定期主动淘汰一批已经过期的key
当前已用的内存超过maxmemory限定时,触发主动情理策略。
在 Redis 中, 常规操作由 redis.c/serverCron 实现, 它主要执行以下操作
更新服务器的各类统计信息,比如时间、内存占用、数据库占用情况等。
清理数据库中的过期键值对。
对不合理的数据库进行大小调整。
关闭和清理连接失效的客户端。
尝试进行 AOF 或 RDB 持久化操作。
如果服务器是主节点的话,对附属节点进行定期同步。
如果处于集群模式的话,对集群进行定期同步和连接测试。
在redis2.6版本的时候,程序规定serverCron每1秒运行10次,平均每100毫秒运行一次。从redis2.8的时候开始,用户可以通过 修改hz选项来调整serverCron的每秒的执行次数
redis.conf 配置
# The range is between 1 and 500, however a value over 100 is usually not
# a good idea. Most users should use the default of 10 and raise this up to
# 100 only in environments where very low latency is required.
hz 10
该策略不是统计所有的数据,是随机测试一批设置了过期时间的key并进行处理。测试到过期的key将被删除。每10秒做10次如下步骤:
随机测试设置了100个过期时间的key
删除所有已发现的过期的key
若删除的key超过25则重复步骤1
Redis-3.0.0中的默认值是10,代表每秒钟调用10次后台任务。
被动删除(CPU友好,内存不友好)
只有key被操作时候(如get),redis才会检查该key是否过期,如果过期则直接删除并返回NULL。
这种过期策略对cpu是友好的,删除操作只有在调用该key的时候才会进行,不会在其他的expire key上浪费无谓的CPU时间。
但是这种策略对内存是不友好的,一个key已经过期,但是他在操作之前不会被删除的,仍然占据内存空间。
主动删除
先说一下时间事件,对于持续运行的服务器来说,服务器需要定期对自身的资源和状态进行必要的检查和整理,从而服务器维持在一个健康稳定的状态,这类操作统称为常规操作(cron job)
maxmemory
当前已用内存超过maxmemory限定时,会触发主动清除策略
volatile-lru : 只对设置了过期时间的key进行LRU (默认值) (对已经设置了过期时间的数据结构,挑选最少使用的数据淘汰)
allkeys-lru: 删除LRU算法的key(从全部的数据结构,挑选最少使用的数据淘汰)
volatile-random : 随机删除即将过期的key(对已经设置了过期时间的数据,采用随机删除的数据淘汰)
allkeys-random : 随机删除(对所有的数据,采用随机删除的数据淘汰)
volatile-ttl :删除即将过期的(只对设置了过期时间的数据,采用挑选将要过期的数据淘汰)
noeviction :永不过期(这个清理过程是阻塞的)