过期策略指的是ttl到期时的处理策略,淘汰策略指的是内存满了的情况下的策略
1、过期策略(TTL)
- 定期删除,Redis默认每隔100ms会从设置了过期时间的key中随机抽取一部分来检查是否过期,如果过期就删除。
- 惰性删除(有点像是懒加载),定期删除可能会导致很多设置了过期时间的key没有被及时删除,所以就有了惰性删除,即在查询这个key时,检查一下是否过期,如果过期就删除。
2、淘汰策略
内存满后有什么策略,默认的:当内存不足以容纳新写入数据时,新写入操作会报错。
结合定期删除 + 惰性删除
Redis 实现了key的过期时间机制,但还是会有一些key会没有被定期删除掉,也没有被查询,就遗留在了内存中,当数据量大到一定程度后,会导致内存的堆积。这就涉及到了 内存淘汰机制
。
当内存容量到达了上限或者 配置的maxmemory
时,会触发 内存淘汰策略
Redis提供了几种策略供我们选择:
1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
总的来说,无论是 LRU
LFU
TTL
还是Random
都是几近算法来实现的,在可靠性和性能上做了一定的平衡。还是应该在业务中主动删除没有价值的数据,或者更新某些key的过期时间等来提高Redis的性能和空间,不能过分依赖于淘汰策略。