此篇介绍了
Redis 过期策略
以及Redis 的内存淘汰机制
, 从内存淘汰的 8 种策略
,如何开启内存淘汰策略
到如何选择合适的淘汰策略
, 对 Redis 的内存淘汰机制做了全方位的阐述
Redis 过期策略
Redis
可以对 key
设置过期时间,这是一个非常实用的功能,那 Redis
是如何实现这个机制的呢?答案就是:定期删除 + 惰性删除
- 定期删除,Redis 默认每隔 100ms 会从设置了过期时间的 key 中随机抽取一部分来检查是否过期, 如果过期就删除。
- 惰性删除,定期删除可能会导致很多设置了过期时间的 key 没有被及时删除,所以就有了惰性删除, 即在查询这个 key 时,检查一下是否过期, 如果过期就删除。
Redis 内存淘汰机制
结合 定期删除 + 惰性删除
Redis 实现了 key 的过期时间机制,但还是会有一些 key 会没有被定期删除掉,也没有被查询,就遗留在了内存中,当数据量大到一定程度后,会导致内存的堆积。这就涉及到了 内存淘汰机制
。
当内存容量到达了上限或者 配置的 maxmemory
时,会触发 内存淘汰策略
Redis 提供了 8 种策略供我们选择:
-
volatile-lru
-> Evict using approximated LRU among the keys with an expire set. -
allkeys-lru
-> Evict any key using approximated LRU. -
volatile-lfu
-> Evict using approximated LFU among the keys with an expire set. -
allkeys-lfu
-> Evict any key using approximated LFU. -
volatile-random
-> Remove a random key among the ones with an expire set. -
allkeys-random
-> Remove a random key, any key. -
volatile-ttl
-> Remove the key with the nearest expire time (minor TTL) -
noeviction
-> Don’t evict anything, just return an error on write operations.
先明确一下 LRU
与 LFU
:
- LRU(Least Recently Used) : 淘汰最近最少使用的数据,基于访问时间
- LFU(Least Frequently Used): 淘汰最不经常使用的数据,基于访问次数
怎么开启 Redis 的内存淘汰机制
在redis.conf
中:
- 配置
maxmemory <bytes>
, 设置Redis
的最大内存空间 - 配置
maxmemory-policy noeviction
, 设置淘汰策略,默认为noeviction
如何选择淘汰策略
-
allkeys-lru
和allkeys-lfu
适用于存在热点数据的情况。明确有一部分数据访问频率较高,其余数据访问频率较低或者无法预测使用频率。 -
allkeys-random
适用于所有数据访问概率大致相等 -
volatile-ttl
根据过期时间的先后顺序进行删除 -
volatile-lru
,volatile-lru
和volatile-random
适用于希望一些数据能被保存, 则可以从设置了过期时间的数据中进行删除
至于 LRU 与 LFU 的选择,则需要根据业务权衡到底是选择 淘汰最近最少使用 (LRU)
还是选择 最不经常使用(LFU)
总的来说, 无论是 LRU
LFU
TTL
还是Random
都是几近算法来实现的, 在可靠性和性能上做了一定的平衡。还是应该在业务中主动删除没有价值的数据,或者更新某些 key 的过期时间等来提高 Redis 的性能和空间,不能过分依赖于淘汰策略。
更多资料参考:
Redis-expire- 官方文档
Redis-lru-cache- 官方文档