Redis过期删除、内存淘汰策略

Redis采用惰性删除和定期删除策略处理过期键,保证内存的有效利用。当内存达到最大限制,会触发内存淘汰策略,包括noeviction、volatile-lru等不同方式。此外,RDB和AOF持久化过程中也会处理过期键,确保数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis过期删除

redis的过期删除策略是:惰性删除和定期删除配合使用。

1.定期删除

由redis.c/activeExpireCycle 函数实现,函数每秒运行10次,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。可以通过修改配置文件redis.conf 的 hz 选项来调整这个次数,但是不建议将这个值设置超过 100,否则会对CPU造成比较大的压力。
因为key太多,如果全盘扫描所有的key会非常耗性能,所以是随机抽取一些key来删除。这样就有可能删除不完,需要惰性删除配合。

2.惰性删除

Redis的惰性删除策略由 db.c文件下expireIfNeeded 函数实现,所有键读写命令执行之前都会调用 expireIfNeeded 函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;未过期则不作操作,继续执行原有的命令。

我们看到,通过过期删除策略,对于某些永远使用不到的键,并且多次定期删除也没选定到并删除,那么这些键同样会一直驻留在内存中,又或者在Redis中存入了大量的键,这些操作可能会导致Redis内存不够用,这时候就需要Redis的内存淘汰策略了。

redis内存淘汰策略

1.设置redis的最大内存
在配置文件redis.conf 中,可以通过参数 maxmemory 来设定最大内存,不设定该参数默认是无限制的,但是通常会设定其为物理内存的四分之三。

2.设置内存淘汰策略
当现有内存大于 maxmemory 时,便会触发redis主动淘汰内存方式,通过设置 maxmory-policy ,有如下几种淘汰方式:

  • (1).noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。默认策略
  • (2).volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。 (LRU:最近使用 Least Recently Used )
  • (3).allkeys-lru:利用LRU算法移除任何key (和上一个相比,删除的key包括设置过期时间和不设置过期时间的)。通常使用该方式。
  • (4).allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  • (5).volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • (6).volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

持久化时处理过期

Redis的两种持久化策略:RDB和AOF。在持久化和数据恢复阶段,对过期key也有一些特殊的处理。

RDB

从内存数据库持久化数据到RDB文件:持久化key之前,会检查是否过期,过期的key不进入RDB文件 从RDB文件恢复数据到内存数据库:数据载入数据库之前,会对key先进行过期检查,如果过期,不导入数据库。

AOF

从内存数据库持久化数据到AOF文件:当key过期后,还没有被删除,此时进行执行持久化操作(该key是不会进入aof文件的,因为没有发生修改命令)
当key过期后,在发生删除操作时,程序会向aof文件追加一条del命令(在将来的以aof文件恢复数据的时候该过期的键就会被删掉)。

总结

Redis过期删除策略是采用惰性删除和定期删除这两种方式组合进行的,惰性删除能够保证过期的数据我们在获取时一定获取不到,而定期删除设置合适的频率,则可以保证无效的数据及时得到释放,而不会一直占用内存数据。
但是我们说Redis是部署在物理机上的,内存不可能无限扩充的,当内存达到我们设定的界限后,便自动触发Redis内存淘汰策略,而具体的策略方式要根据实际业务情况进行选取。

### Redis过期策略和淘汰策略 #### 过期策略 Redis过期策略主要用于处理设置了生存时间(TTL)的键。当一个键被设置为在某个时间点后自动删除时,Redis 并不会立即删除该键,而是采用惰性删除和定期删除两种机制来管理这些过期键。 - **惰性删除**:只有当客户端尝试访问一个键时,Redis 才会检查该键是否已过期。如果已过期,则删除该键[^1]。 - **定期删除**:Redis 会在后台周期性地检查数据库中是否存在过期键,并主动删除它们。这种机制可以减少内存占用,但也会增加 CPU 负载。定期删除的频率和每次删除的键数量由 Redis 配置决定[^1]。 #### 淘汰策略 Redis淘汰策略用于解决内存不足的问题。当 Redis 内存达到最大限制时,它会根据配置的淘汰策略选择一些键进行删除,以释放内存空间。常见的淘汰策略包括: - **LRU (Least Recently Used)**:删除最近最少使用的键。此策略假设最近未使用的键在未来也不太可能被使用[^2]。 - **LFU (Least Frequently Used)**:删除最不常使用的键。此策略基于访问频率,认为访问频率低的键在未来也不太可能被频繁使用[^3]。 - **TTL (Time To Live)**:删除剩余生存时间最短的键。此策略适用于那些设置了较短生存时间的键[^4]。 - **Random**:随机删除键。此策略简单粗暴,但可能导致重要数据被删除[^5]。 #### 使用场景 不同的淘汰策略适用于不同的使用场景: - **LRU**:适合缓存场景,尤其是当数据访问模式具有明显的局部性时,例如网页缓存、API 响应缓存等[^2]。 - **LFU**:适合需要长期保存某些数据的场景,例如分布式系统中的元数据存储,其中某些数据可能长时间未被访问但仍然重要[^3]。 - **TTL**:适合短期任务或临时数据存储,例如会话管理、验证码存储等[^4]。 - **Random**:适合对数据丢失敏感度较低的场景,例如日志存储、统计分析等[^5]。 #### 示例代码 以下是一个简单的 Redis 配置示例,展示如何设置淘汰策略: ```bash # 设置 Redis 的最大内存限制 maxmemory 100mb # 设置淘汰策略为 LRU maxmemory-policy allkeys-lru ``` #### 注意事项 - 在生产环境中,建议根据实际需求选择合适的淘汰策略,并监控 Redis内存使用情况。 - 对于关键数据,避免使用容易被淘汰的策略,如 Random 或 TTL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值