Redis 缓存过期处理与内存淘汰机制

本文深入探讨了Redis的缓存过期策略,包括定时删除与惰性删除机制,以及当内存满载时的缓存淘汰策略,如LRU、随机删除和基于过期时间的策略。了解这些机制对于优化Redis性能至关重要。

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

引子

计算机内存有限,越大越贵,Redis的高并发高性能都是基于内存的,用硬盘的话GG。

已过期的key如何处理?

设置了expire的key缓存过期了,但是服务器的内存还是会被占用,这是因为redis所基于的两种删除策略
redis有两种策略:

  • (主动)定时删除
    定时随机的检查过期的key,如果过期则清理删除。(每秒检查次数在redis.conf中的hz配置)
  • (被动)惰性删除
    当客户端请求一个已经过期的key的时候,那么redis会检查这个key是否过期,如果过期了,则删除,然后返回一个nil。这种策略对cpu比较友好,不会有太多的损耗,但是内存占用会比较高。
    所以,虽然key过期了,但是只要没有被redis清理,那么其实内存还是会被占用着的。
那么如果内存被Redis缓存占用满了咋办?

内存占满了,可以使用硬盘来保存,但是没意义,因为硬盘没有内存快,会影响redis性能。
所以当内存占用满了以后,redis提供了一套缓存淘汰机制:MEMORY MANAGEMENT

  • maxmemory:当内存已使用率到达,则开始清理缓存
  • noeviction:旧缓存永不过期,新缓存设置不了,返回错误
  • allkeys-lru:清除最少用的旧缓存,然后保存新的缓存(推荐使用)
  • allkeys-random:在所有的缓存中随机删除(不推荐)
  • volatile-lru:在那些设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存
  • volatile-random:在那些设置了expire过期时间的缓存中,随机删除缓存
  • volatile-ttl:在那些设置了expire过期时间的缓存中,删除即将过期的
### Redis Key 生存时间淘汰机制 #### 设置键的过期时间 Redis 提供多种方式来设定键的有效期限。通过 `EXPIRE` 或者在创建键的时候使用带有有效时间参数的命令,可以为键设置生存时间。例如: ```python import redis r = redis.Redis(host='localhost', port=6379, db=0) # Set a key with an expiration time (in seconds) r.setex('my_key', 60, 'value') # Sets my_key to expire after 60 seconds. ``` 当一个键被设置了过期时间之后,一旦到达这个时间点,该键就会自动消失[^1]。 #### 淘汰策略 随着存储的数据量增加,可能会遇到内存不足的情况。此时就需要采用一定的淘汰政策来释放空间。Redis 支持几种不同的淘汰策略,可以通过配置文件中的 `maxmemory-policy` 参数来进行选择。常见的有如下几种: - **volatile-lru**: 使用LRU算法移除具有有效期且最近最少使用的键。 - **allkeys-lru**: 不考虑是否有有效期,直接按照 LRU 移除非活跃最久未使用的键。 - **volatile-random**: 随机删除即将到期的键。 - **allkeys-random**: 完全随机地删除任意键。 - **volatile-ttl**: 删除那些剩余存活时间较短的键。 - **no-eviction**(默认): 当达到最大内存限制时不主动驱逐任何数据项;如果尝试写入新数据,则返回错误给客户端[^2]。 这些策略允许管理员根据实际应用场景灵活调整如何管理有限资源下的缓存命中率和服务质量。 #### 解决缓存问题的方法 对于可能出现的各种缓存难题,比如冷启动、雪崩效应等问题,有一些通用的技术手段可以帮助缓解这些问题的影响: - 实施合理的预热计划,在应用上线前预先加载一部分热点数据到缓存里去; - 对于重要业务逻辑所依赖的关键路径上的查询结果实施持久化保存,并定期更新其副本; - 利用分布式锁控制并发读取同一份缓存内容的操作次数,防止瞬间大量请求涌入造成服务器压力过大; - 设定合适的超时重试机制应对临时性的网络波动或节点故障带来的影响; - 结合异步任务队列处理耗时较长的任务,减少对实时响应的要求。 此外,还可以利用 Lua 脚本来批量操作多个 keys ,尽管这并不适用于跨 Keys 的原子性事务[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值