lazy free 机制

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

一、Redis缓存过期管理核心背景

Redis作为高性能内存数据库,缓存键设置过期时间后,若不及时清理过期键会导致内存泄漏,若同步强制清理又会阻塞主线程、影响业务吞吐。为此Redis设计了分层内存回收体系:定期删除+惰性删除是原生过期键基础清理策略,负责常规过期键的同步回收;Lazy Free(惰性释放)是4.0+版本新增的异步优化机制,专门解决大键、批量键清理的阻塞问题,三者配合实现内存回收与性能的平衡。

二、Redis原生过期键清理策略

这两种策略是Redis默认的过期处理逻辑,无需额外配置,针对普通小体积过期键设计,全程由主线程执行。

2.1 定期删除策略(主动清理)

核心定义:Redis主线程通过定时任务,主动周期性扫描过期字典,抽查部分过期键并执行删除,兼顾内存回收效率与CPU开销。

执行细节:默认每秒执行10次(由hz参数控制),每次随机抽取20个过期键校验,删除过期键后若过期键占比超过25%则继续抽查,避免单次扫描耗时过长;采用“限量+随机”模式,防止主线程长时间阻塞。

核心特点:主动清理、覆盖范围广、避免大量过期键堆积,但扫描过程占用主线程资源。

2.2 惰性删除策略(被动清理)

核心定义:仅在客户端访问键时,Redis主线程先校验键是否过期,若过期则立即删除并返回空值,属于被动触发的清理方式。

执行细节:无主动扫描动作,只有GET、HGET等查询命令触发,未被访问的过期键会一直占用内存,直到被访问或被定期删除扫描到。

核心特点:节省CPU资源、无额外扫描开销,但存在过期键内存堆积风险,仅处理被访问的键。

三、Lazy Free惰性释放机制(优化补全)

原生定期/惰性删除针对小键无压力,但清理大体积键(Big Key)、批量键时,同步遍历释放内存会导致主线程长时间阻塞。Lazy Free通过“异步延迟回收”解决该痛点,属于过期/删除策略的高性能升级方案。

3.1 核心定义与设计初衷

Lazy Free(惰性释放/延迟释放):不立即执行内存物理释放,仅做逻辑标记,将耗时的回收任务交给后台BIO线程异步处理,主线程快速响应、无阻塞。

设计初衷:剥离大键、批量数据的回收操作与主线程,解决DEL、FLUSHDB、内存淘汰、过期大键清理导致的业务卡顿、吞吐量暴跌问题。

3.2 核心工作流程

  1. 逻辑标记:收到删除/过期请求时,仅标记键无效,主线程立即返回;
  2. 任务投递:将待回收对象加入后台队列,交由BIO线程池处理;
  3. 异步回收:后台线程异步遍历数据结构、释放物理内存,不影响主线程;
  4. 内存复用:回收后的内存重新纳入空闲池,供后续分配使用。

3.3 Redis核心配置项

  • lazyfree-lazy-eviction:内存超限淘汰时启用异步释放
  • lazyfree-lazy-expire:过期键清理启用异步释放
  • lazyfree-lazy-server-del:DEL命令启用异步释放
  • lazyfree-lazy-flush:FLUSHDB/FLUSHALL启用异步清空

四、三大内存回收机制多维度对比

核心定位

主动批量清理过期小键

被动按需清理访问到的过期键

异步释放大键/批量键,规避主线程阻塞

触发方式

主线程定时任务(主动)

客户端访问键(被动)

删除/过期/淘汰/清空指令触发

执行主体

Redis主线程

Redis主线程

后台BIO线程池

适用对象

普通小体积过期键

访问频率低的过期键

Big Key、批量数据、全库清空场景

阻塞风险

中度(扫描量大时卡顿)

重度(清理过期大键时卡顿)

无(主线程仅做标记,无阻塞)

内存表现

回收及时,无堆积

未访问键内存堆积

短期占用偏高,最终正常回收

五、同步操作与异步操作精准划分

区分同步/异步的核心依据:执行线程是否为Redis主线程、是否阻塞业务命令执行,以下是生产环境最直观的分类清单:

✅ 同步操作(主线程执行,存在阻塞风险)

此类操作全程占用主线程资源,清理耗时与键体积正相关,大键场景极易卡顿:

  • 定期删除全流程:主线程定时扫描、校验、删除过期键,同步完成所有动作
  • 惰性删除全流程:访问键时主线程同步校验过期状态、同步删除过期键
  • 未开启Lazy Free的DEL/FLUSH:主线程同步释放内存,无后台调度
  • 常规键查询/写入:核心业务命令均为主线程同步执行

✅ 异步操作(后台线程执行,主线程无阻塞)

此类操作主线程仅做逻辑标记,物理回收由后台线程完成,不影响业务吞吐:

  • 开启Lazy Free后的过期键清理(lazyfree-lazy-expire生效)
  • 开启Lazy Free后的DEL命令(lazyfree-lazy-server-del生效)
  • 开启Lazy Free后的内存淘汰(lazyfree-lazy-eviction生效)
  • 开启Lazy Free后的全库清空(lazyfree-lazy-flush生效)
  • 后台BIO线程的物理内存释放、碎片规整动作

六、实战总结与注意事项

6.1 核心总结

Redis内存回收采用“基础同步+高级异步”的分层策略:定期删除+惰性删除作为基础兜底,解决普通过期键的同步清理问题;Lazy Free作为高阶优化,针对大键场景实现异步回收,彻底规避主线程阻塞。生产环境建议三者配合使用:默认开启定期+惰性删除,针对大键业务启用Lazy Free相关配置,兼顾内存安全与高性能。

6.2 关键注意事项

  • 小体积键无需启用Lazy Free,同步释放开销极低,开启后反而增加线程调度损耗
  • 内存敏感型业务需监控内存使用率,Lazy Free延迟释放可能导致短期内存偏高
  • 禁止盲目调高hz参数(定期删除频率),避免主线程被扫描任务占用导致业务卡顿
  • Lazy Free无法替代定期+惰性删除,仅作为大键场景的优化补充,三者协同才能实现最优效果

ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花

Redis基础 文章被收录于专栏

本专栏带你从零掌握 Redis 核心知识,清晰讲解过期策略、内存淘汰等面试重点。用通俗语言拆解底层原理,搭配实战案例与常见问题总结,兼顾入门理解与面试备考,帮你快速建立完整 Redis 知识体系,轻松应对开发与面试

全部评论
定期删除+惰性删除作为基础兜底,解决普通过期键的同步清理问题
1 回复 分享
发布于 昨天 17:33 湖南
点赞 回复 分享
发布于 昨天 16:40 陕西

相关推荐

不愿透露姓名的神秘牛友
昨天 10:38
实力求职者:真的绷不住了,第一张霸总人设,第二张求生欲拉满
点赞 评论 收藏
分享
03-18 22:47
已编辑
香港科技大学 C++
谢谢。那desheng呢?desheng:就是我个人觉得算法岗位和其他岗位不太一样的一个点,就是算法在你一开始接触这份工作的时候,你需要看的特别细,就是你对整个产品,你对整个行业的了解,可能是从非常细的底层的细节开始开始的。就举个例子,像我刚接触广告的时候,那我可能真的会一花一天的时间去看,为什么这个广告主今天花了1000块钱,他本来想买200个转发,但是最终只转只买到了100个转发,那他到底是哪一块出了问题?如果某一个信号不是下午3点钟传回来,是上午10点钟传回来,那这个效果没有多少改善。就是我们会去看一些detail的case,但是就是随随着你的做的事情越来越多,你就你就会对整个事情会有更高的视角的了解,就是可能有像战略或者说运营,他并不需要去一开始就了解很么多细节。但是想做好算法工作或者说做好工程工作,一定是从底层非常细节的地方去开始抠的。那么关于职业发展的方向呢,就是我认为字节它也就是不设限。就是昨天我还在跟我的老板去聊这件事(指绩效沟通),就是说并不是说你是算法,你就只能去做算法相关的工作,那我其实也有也有认识很多人,他其实是从算法转成了产品,包括现在可能整个中国区的增长负责人。那他之前其就是做做算法的,然后我身边也有同事,他从算法出身,他设计了新一代的广告系统。这个广告系统可能现在大家也比较常见,就是我给你一个奖励,比如说一个优惠券,然后你去看一看广告,就是这个广告系统这种广告形式其实是有一个算法同学最初设计出来的。那么就是说,我觉得,大家可能不是说非常非常受限。就是我做了算法,或者我做了工程,那我以后只能做这方面的事。就是更合适的一个思维方式,是说我的算法和思维能力,或者说工程方面的思维能力能够帮助公司去解决什么样的问题。刚刚Weier也提到了他,他可能觉得现在有一个算法leader的是在DS的团队更合适,那这完全也是有可能的。所以就是说在纵向的纵向包括横向的途径上,就是并不是说算法一定以后你只能做算法。其实不是的重点是做算法过程中培养出的这些能力。然后,具体的如果说你真的就是想在算法上一直去发展的,那就可以举一个例子,就是最初级的算法。比如说,大家刚入职或者是做实习生的时候,就有点像一个例子,就是你的Mentor会告诉你有一片树林,这片树林也不是很大,然后里面有一只死兔子。你的工作职责就是去把这只死兔子给解决来就就行了,这里的兔子就是拿到业务收益的意思。然后随着你渐渐的熟了之后呢,你可能能够自己去发现某一地方有一片树林,然后大概百分之八十百分之90的可能性,你能够在里面打猎到兔子,然后你然后你就去思考我怎么去用什么样的猎物更合适呀,什么什么天气过去,你会自己思考一些问题。那随着你在进一步的进阶,你可能就需要去决策。那我这个方向有不同的数理,然后每只树林里面也有可能有不同的猎物种类。我怎么去安排哪一些森林,我要去探索哪一些不去探索,然后我安排什么样的团队组织什么样的猎人去攻打哪一片,哪一片森林更加的合适,而这就是TeamLeader的这个层面需要去解决的问题。以广告为例,那如果说某一个季度的表现不好,那就要去拆解我们下一个优化的卡点到底在哪?是在模型的优先级更高呢,还是说信号归一因做的不好呢,还是说素材有问题呢?这个是到了更高阶的层面需要去考虑的一些问题,就是总之你的视角是会越来越高的。说话人2谢谢desheng,谢谢前面三位。那最后呢,也请zonghao给大家讲讲,而且,很多同学可能就是现在有很多经常在校招的场所都在参加,招职能框架的。然后正好来分享一下。zonghao:我主要分两个方面。其实我还挺怀疑会不会真的会有人问这样的问题的,因为我有一时候跟我同学交流,就说我现在正在做什么,什么,他们都会问说,你一个北大毕业的为什么现在要来做这种事?然后,就我坦白的讲,我说这个其实是跟这个字节整体的人才观是非常相关的。然后,刚才我也有介绍说,我们要穷尽各类领域最优秀的人才。不瞒大家说,就是抛开这个HR、财务还有法务,这个这种专业服务的职能可能会有非常很多名校的毕业生,就即便是在企业服务,可以和大家说字节的企业服务。清华北大的一抓一大把,然后我们还有很多Harvard,Upenn,然后包括南洋理工这类,就是海外名校毕业的同学,也是在校招之后,就硕士或者本科毕业就加入了直接字节跳动的企业服务部。然后为什么这么多人这么多优秀的人才现在会加入我们企业服务部呢?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务