Redis 数据过期策略
1.Redis中key的的过期时间
通过 expire key seconds
命令来设置数据的过期时间。返回1表明设置成功,返回0表明设置失败。在key上设置了过期时间后key将在指定的秒数后被自动删除。
expire : 过期;期满
注: flushall 清空数据库 ; name不存在,设置过期时间失败
过期时间的其他相关命令:
通过 ttl key
命令来查看数据的过期时间
通过 persist key
命令来可以清除数据的过期时间
persist :存留;保持
注: 返回 -1 表示永不过期;返回 -2 表示已过期
2.Redis过期键删除策略
Redis使用懒惰删除+定期删除相结合的方式处理过期的key。
Redis key过期的方式有三种:
- 惰性删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
- 定期删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key (定期删除策略)
- 当前已用内存超过maxmemory限定时,触发主动清理策略 (内存淘汰机制)
1) 定期删除策略
Redis 启用一个定时器定时监视所有的 key,判断key是否过期,过期的话就删除。这种策略可以保证过期的 key 最终都会被删除,但是也存在严重的缺点:每次都遍历内存中所有的数据,非常消耗 CPU 资源,并且当 key 已过期,但是定时器还处于未唤起状态,这段时间内 key 仍然可以用。
2) 惰性删除策略
在获取 key 时,先判断 key 是否过期,如果过期则删除。这种方式存在一个缺点:如果这个 key 一直未被使用,那么它一直在内存中,其实它已经过期了,会浪费大量的空间。
3) 主动清理策略 (淘汰策略)
淘汰策略分为:
-
当内存不足以容纳新写入数据时,新写入操作会报错。(Redis 默认策略)
-
当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 Key。(LRU推荐使用)
-
当内存不足以容纳新写入数据时,在键空间中,随机移除某个 Key。
-
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 Key。这种情况一般是把 Redis 既当缓存,又做持久化存储的时候才用。
-
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 Key。
-
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 Key 优先移除。