### Redis内存过期策略详解 #### 一、引言 Redis作为一款高性能的键值存储系统,在实际应用中经常被用作缓存解决方案。为了确保内存的有效利用与系统的稳定性,Redis设计了一套高效的内存管理机制,其中包括了针对键过期处理的策略。本文将详细介绍Redis中的内存过期策略,包括其基本原理、工作方式以及相关的配置选项。 #### 二、Redis内存过期策略概述 Redis提供了多种机制来处理过期键,主要分为两大类:过期键的删除策略和内存达到上限时的处理策略。这两种机制确保了Redis能够在内存资源有限的情况下仍然保持良好的性能和服务质量。 #### 三、过期键的删除策略 Redis在处理过期键时采用的是**惰性删除**和**定时任务删除**相结合的方式。 ##### 3.1 惰性删除 **定义**:当客户端尝试访问一个已过期的键时,Redis会在该时刻执行删除操作,并返回空结果给客户端。这种方式能够节省CPU资源,避免了频繁地检查和删除过期键的操作。 **优点**: - 节省CPU资源; - 只在访问时进行检查,减少不必要的开销。 **缺点**: - 如果过期键长时间未被访问,可能会占用内存较长时间,导致内存泄漏问题。 ##### 3.2 定时任务删除 Redis还通过**定时任务**的方式来检查和删除过期键,以弥补惰性删除可能存在的问题。这一机制基于自适应算法,根据过期键的比例和频率自动调整删除的速度。 **快慢模式**: - **快模式**:当定时任务检测到大量过期键时,会以较快的速度进行删除操作,直到过期键的比例降至一定阈值以下或者达到超时时间。快模式下的超时时间为1毫秒,且每2秒内最多只能运行一次。 - **慢模式**:在正常情况下,定时任务会以较慢的速度运行,每次检查一小部分键(默认20个),当检测到过期键时将其删除。如果检测到的过期键比例超过25%,则继续执行删除操作,直到比例低于25%或者达到25毫秒的超时时间。 通过这种方式,Redis既保证了内存的有效回收,又避免了过度消耗CPU资源。 #### 四、内存达到上限时的处理策略 当Redis使用的内存达到配置的最大值(maxmemory)时,需要采取措施来释放内存,防止服务崩溃。Redis提供了多种内存溢出控制策略: ##### 4.1 noeviction 这是默认策略。当Redis检测到内存已满时,它将拒绝所有的写入操作,并向客户端返回错误信息。此时Redis仅能响应读操作。 ##### 4.2 volatile-lru 根据LRU(Least Recently Used)算法删除设置了超时属性的键,直至有足够的内存空间。如果没有可以删除的过期键,则退回到noeviction策略。 ##### 4.3 allkeys-lru 同样基于LRU算法,但删除的对象不限于设置了超时属性的键。这种策略适用于希望根据访问频率来决定哪些数据应该被保留的情况。 ##### 4.4 allkeys-random 随机删除任意键,直至有足够的内存空间。这种方法较为简单粗暴,适用于对数据没有特别要求的情况。 ##### 4.5 volatile-random 随机删除设置了超时属性的键,直至有足够的内存空间。如果找不到符合条件的键,则退回到noeviction策略。 ##### 4.6 volatile-ttl 根据键的TTL(Time To Live)属性来删除即将过期的数据,若找不到符合条件的键,则退回到noeviction策略。 #### 五、总结 通过以上介绍可以看出,Redis提供了一系列灵活且高效的内存管理策略,能够满足不同的应用场景需求。合理配置这些策略,不仅可以有效提升Redis的性能表现,还能保证系统的稳定运行。在实际部署和使用过程中,建议根据具体的业务场景选择合适的内存管理策略,并适时调整配置以优化性能。
Redis的内存回收机制主要体现在以下两个方面:
(1)删除到达过期时间的键对象:Redis所有键都可以设置过期属性,内部保存在过期字典中。
由于进程内保存大量的键,维护每隔键精确的过期删除机制会导致消耗大量的CPU,对于
单进程的Redis来说成本过高,因此Redis采用惰性删除和定时任务删除机制实现过期键
的内存回收。
☆ 惰性删除:当客户端读取带有超时属性的键时,如果已经超过键设置的过期时间,会
执行删除操作并返回空,这种策略是出于节省CPU成本考虑,不需要单独维护TTL链表
来处理过期键的删除。但是单独用这种方式存在内存泄露的问题,当过期键一直没有访
问将无法得到及时删除,从而导致内存不能及时释放。
☆ 定时任务删除:Redis内部维护一个定时任务,默认每秒运行10次(通过配置hz控制)
。定时任务中删除过期键逻辑采用了自适应算法,根据键过期比例、使用快慢两种速率
模式回收键。
快慢模式:定时任务在每个数据库空间随机检查20个键,当发现过期时删除对应的键。
如果超过检查数25%的键过期,循环执行回收逻辑直到不足25%或运行超时位置,慢
模式下超时时间为25毫秒。如果之前回收键逻辑超时,则在Redis触发内部事件之前
再次以快模式运行回收过期键任务,快模式下超时时间为1毫秒且2秒内只能运行1次。
快慢模式内部删除逻辑相同,只是执行的超时时间不同。
(2)内存达到使用到maxmemory上限时触发内存溢出控制策略
☆ noeviction:默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信
息(error)OOM command not allowed when used memory,此时Redis只响应读
操作。
☆ volatile-lru:根据LRU算法删除设置了超时属性(expire)的键,直到腾出足够空间
为止。如果没有可删除的键对象,回退到noeviction策略。
☆ allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性,直到腾出足够空
间为止。
☆ allkeys-random:随机删除所有键,直到腾出足够空间为止。
☆ volatile-random:随机删除过期键,直到腾出足够空间为止。
☆ volatile-ttl:根据键值对象的ttl属性,删除最近将要过期数据。如果没有,回退到
voeviction策略。
- 粉丝: 4
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- ta-lib-0.5.1-cp311-cp311-win32.whl
- ta-lib-0.5.1-cp311-cp311-win-arm64.whl
- ta-lib-0.5.1-cp311-cp311-win-amd64.whl
- 微信小程序开发-地图定位.zip
- ta-lib-0.5.1-cp310-cp310-win32.whl
- ta-lib-0.5.1-cp313-cp313-win32.whl
- ta-lib-0.5.1-cp313-cp313-win-amd64.whl
- 这是一个基于html的心形代码.zip
- 安卓系统开发的全部教程
- ta-lib-0.5.1-cp312-cp312-win32.whl