Redis过期清理策略和内存淘汰机制
Redis过期清理策略
Redis 通过设置键的过期时间来实现自动删除过期键。当键的过期时间到达时,Redis 会自动将该键删除。Redis 过期清理策略主要有以下两种:
-
惰性删除:Redis 在获取键时会检查键是否过期,如果过期则删除。惰性删除可以确保了过期键不会被返回给客户端,但是可能导致内存占用较高,因为不会主动回收过期键的内存空间。在惰性删除策略下,如果过期键一直没有被访问,那么它将永远不会被删除。所以Redis还有下面一种清理策略
-
定期删除:当一个key设置了过期时间之后,Redis会将这个key放入一个过期字典中,并设置对应的过期时间。然后,Redis会启动一个定时器,定时检查过期字典是否有过期的key。如果有,Redis会将这个key从数据中删除。这种策略可以保证内存被尽快释放,但在CPU时间紧张的情况下,可能需要花时间去删除这些key
Redis 定时扫描策略
Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是
采用了一种简单的贪心策略。
- 从过期字典中随机 20 个 key;
- 删除这 20 个 key 中已经过期的 key;
- 如果过期的 key 比率超过 1/4,那就重复步骤 1;
同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时
间的上限,默认不会超过 25ms。
Redis内存淘汰机制
当已用内存超过maxmemory限定时,Redis会触发内存淘汰机制。内存淘汰机制包括对设置了过期时间的key进行处理的几种方式,如volatile-ttl(根据过期时间的先后进行删除,越早过期的越先被删除)、volatile-random(随机删除设置了过期时间的键值对)等。
maxmemory配置指定了Redis可以使用的内存,你可以在redis.conf文件进行设置
例如,要配置100兆的内存限制,可以在redis.conf文件中添加以下指令:
maxmemory 100 mb
以下是Redis的内存淘汰机制的几种策略:
- noeviction:这是默认策略,当内存不足以容纳新写入数据时,新写入操作会报错,无法写入新数据。
- allkeys-random:在所有键中,随机选择并删除数据。
- volatile-random:在设置了过期时间的键中,随机选择并删除数据。
- volatile-ttl:在设置了过期时间的键中,优先删除剩余生存时间最短的键值对。
- allkeys-lru:在所有键中,删除最近最少使用的键。
- volatile-lru:在设置了过期时间的键中,删除最近最少使用的键。
- allkeys-lfu:在所有键中,删除最不经常使用(访问次数最少)的键。
- volatile-lfu:在设置了过期时间的键中,删除最不经常使用访问次数最少)的键。
注: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 的值可能会更好地捕捉键的热度变化。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!