Redis 通过设置键的过期时间来实现自动删除过期键。当键的过期时间到达时,Redis 会自动将该键删除。Redis 过期清理策略主要有以下两种:
惰性删除:Redis 在获取键时会检查键是否过期,如果过期则删除。惰性删除可以确保了过期键不会被返回给客户端,但是可能导致内存占用较高,因为不会主动回收过期键的内存空间。在惰性删除策略下,如果过期键一直没有被访问,那么它将永远不会被删除。所以Redis还有下面一种清理策略
定期删除:当一个key设置了过期时间之后,Redis会将这个key放入一个过期字典中,并设置对应的过期时间。然后,Redis会启动一个定时器,定时检查过期字典是否有过期的key。如果有,Redis会将这个key从数据中删除。这种策略可以保证内存被尽快释放,但在CPU时间紧张的情况下,可能需要花时间去删除这些key
Redis 定时扫描策略
Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是
采用了一种简单的贪心策略。
同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时
间的上限,默认不会超过 25ms。
当已用内存超过maxmemory限定时,Redis会触发内存淘汰机制。内存淘汰机制包括对设置了过期时间的key进行处理的几种方式,如volatile-ttl(根据过期时间的先后进行删除,越早过期的越先被删除)、volatile-random(随机删除设置了过期时间的键值对)等。
maxmemory配置指定了Redis可以使用的内存,你可以在redis.conf文件进行设置
例如,要配置100兆的内存限制,可以在redis.conf文件中添加以下指令:
maxmemory 100 mb
以下是Redis的内存淘汰机制的几种策略:
注:LFU(Least Frequently Used)策略是在Redis 4.0版本开始加入的
内存淘汰策略设置
内存淘汰策略可以通过maxmemory-policy参数进行设置
我们可以打开 Redis 配置文件 redis.conf,在配置文件中找到 maxmemory-policy 参数,根据你的需求,选择一个合适的策略,并将其设置为对应的值。
例如,如果要使用 LFU 策略,可以将 maxmemory-policy 设置为 volatile-lfu 或 allkeys-lfu。
如果我们使用的是lru或者lfu策略,那么还有一个参数需要我们了解,那就是maxmemory-samples 参数
maxmemory-samples 参数用于设置 Redis 在执行 LFU(Least Frequently Used)和 LRU(Least Recently Used)淘汰策略时所使用的样本数目。
LFU 和 LRU 策略都需要通过近期访问记录来判断键的热度。为了减少计算开销,Redis 会对一部分键进行采样,然后根据这些样本来估计键的访问频率或访问时间。maxmemory-samples 参数指定了采样的样本数目。
较小的样本数目可以减少采样的计算开销,但可能导致对键的访问频率或访问时间估计不准确。而较大的样本数目可以提高估计的准确性,但会增加计算开销。
默认情况下,maxmemory-samples 参数的值为 5。你可以根据实际情况进行调整。通常来说,如果 Redis 实例的键数量很大,适当增加 maxmemory-samples 的值可能会更好地捕捉键的热度变化。