redis的过期策略,内存淘汰机制LRU

redis 过期策略

redis 过期策略是:定期删除+惰性删除。

所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。

问题1

假设 redis 里放了 10w 个 key,都设置了过期时间,你每隔几百毫秒,就检查 10w 个 key,那 redis 基本上就死了,cpu 负载会很高的,消耗在你的检查过期 key 上了。注意,这里可不是每隔 100ms 就遍历所有的设置过期时间的 key,那样就是一场性能上的灾难。

实际上 redis 是每隔 100ms 随机抽取一些 key 来检查和删除的

惰性删除 这就是说,在你获取某个 key 的时候,redis 会检查一下 ,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。

获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西

问题2

如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,咋整?

答:内存淘汰机制

内存淘汰机制

noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了

allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。

allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。

volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。

volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。

volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

 

Redis 的删除策略内存淘汰机制是确保其在有限内存环境中高效运行的关键组成部分。以下将从两个方面进行详细说明。 ### 删除策略 Redis 使用两种主要的删除策略来处理键的过期:**惰性删除(Lazy Expire)** 和 **定期删除(Active Expire)**。 - **惰性删除** 是一种延迟处理的方式,只有当某个键被访问时,才会检查该键是否已过期。如果键已过期,则立即删除它。这种方式的优点是对 CPU 友好,因为它只在必要时执行清理操作;缺点是可能导致内存中存在大量未被访问但已经过期的键,从而造成内存浪费[^4]。 - **定期删除** 则是由 Redis 自动周期性地检查并删除部分过期键。默认情况下,Redis 每秒会尝试执行 10 次这样的检查。具体过程包括随机选取一些键,并检查它们是否过期,若过期则删除。这一过程会持续到满足一定条件为止,例如删除的过期键比例低于某个阈值。这种方法能够在一定程度上减少内存泄漏的风险,同时保持对 CPU 资源的合理利用。 ### 内存淘汰机制Redis内存使用达到配置的最大限制时,就需要通过内存淘汰机制来释放空间,以容纳新的数据。Redis 提供了多种淘汰策略,可以根据实际需求选择最合适的策略: - **noeviction**:当内存不足以容纳新写入的数据时,拒绝所有写操作,并返回错误。 - **allkeys-lru**:在所有键中使用 LRU(Least Recently Used,最近最少使用)算法移除键。 - **volatile-lru**:仅在设置了过期时间的键中使用 LRU 算法移除键。 - **allkeys-random**:在所有键中随机移除。 - **volatile-random**:在设置了过期时间的键中随机移除。 - **volatile-ttl**:优先移除那些剩余时间较短的键。 每种策略都有其适用场景,例如,在希望尽可能保留更多数据的情况下,可以选择 `allkeys-lru` 或 `volatile-lru`;而在需要快速释放内存的情况下,可能更适合使用 `allkeys-random` 或 `volatile-random`。正确选择淘汰策略对于优化 Redis 性能至关重要[^3]。 ```python # 示例代码展示如何设置 Redis 键的过期时间和查看当前使用的淘汰策略 import redis r = redis.StrictRedis(host='localhost', port=6379, db=0) # 设置一个键值对,并为其设置过期时间为 60 秒 r.set('mykey', 'myvalue', ex=60) # 查看当前 Redis 实例的淘汰策略 eviction_policy = r.config_get('maxmemory-policy') print(f"Current eviction policy: {eviction_policy['maxmemory-policy']}") ``` 以上代码演示了如何使用 Python 客户端与 Redis 进行交互,包括设置带有过期时间的键以及获取当前 Redis 配置中的内存淘汰策略
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值