Redis里头怎么用多线程来管过期,感觉还能更灵活点吧?
- 问答
- 2025-12-25 12:36:47
- 3
你问Redis怎么用多线程来管过期键,感觉还能更灵活,这个问题确实点到了Redis演进中的一个核心变化,以前的老版本Redis,也就是6.0之前,在处理过期键这件事上,可以说是典型的“单线程硬扛”,它主要靠两种方式,但这两种方式都挺被动的,有点像房间里有个定时炸弹,但你只在特定时候或者不小心碰到它的时候才去检查它会不会炸。
(根据Redis官方文档和社区关于过期机制的讨论)以前的做法主要是两种策略的结合:一种叫“被动过期”,另一种叫“定期过期”。
“被动过期”最简单,就是当客户端试图访问一个键的时候,Redis才会顺便去检查一下这个键有没有过期,你执行一个GET mykey的命令,Redis在给你返回值之前,会先看一眼这个mykey的过期时间到了没,如果到了,它就直接把这个键删掉,然后告诉你这个键不存在,这个方法的好处是省资源,不访问的键我就不管它,但坏处也特别明显:如果一个键永远没人访问,那即使它早过期了,也会一直像个幽灵一样占着内存,直到天荒地老,这显然不够灵活,内存利用率不高。
为了补救这个问题,Redis又引入了“定期过期”机制,这个就主动一点了,Redis会每隔一段时间(默认是每秒10次),随机从设置了过期时间的键里面抽出一小部分(比如20个)进行检查,如果发现有过期的,就删掉,如果这一批里面过期的比例很高,说明过期键很多,Redis就会再抽一批接着检查,直到过期比例降下来,这个方法的目的是清理那些“僵尸”键,但问题在于,它依然是主线程在干活,如果服务器上同时有海量的键过期,这个检查过程可能会有点耗时,虽然Redis会控制每次检查的时长,但理论上还是有可能对主线程处理正常命令造成一点点延迟的,这种随机抽查的方式,总让人觉得清理得不够及时、不够彻底,有点“碰运气”的感觉。

就像你感觉的那样,这种方式确实有提升空间,不够灵活,Redis自己也意识到了,在6.0版本这个大更新里,它终于引入了多线程,不过这里要特别说明一下(根据Antirez和Redis核心团队发布的6.0版本特性说明),Redis的多线程设计非常谨慎,它并不是用多线程来处理所有命令——那样会引入复杂的锁问题,违背了Redis设计的简单美学,它的多线程,主要是用来处理一些慢速的I/O操作,比如网络数据的读写和解析。
这对过期键的管理有什么影响呢?乍一看,好像过期键的删除逻辑本身(就是在内存里找到并释放)还是由主线程来做的,多线程并没直接插手,多线程的引入间接地、极大地改善了过期键管理的“生态环境”。
想象一下:在没有多线程之前,主线程是个光杆司令,既要接待客户端的请求(读、写命令),又要抽空去打扫房间(定期删除过期键),如果突然来了很多客人(高并发请求),司令忙得脚不沾地,可能就根本没空去打扫了,导致房间(内存)越来越乱(占用高)。

现在有了多线程,相当于给司令配了几个专门的“通信兵”,这些通信兵负责把客户端的请求报文收进来、解析好,然后把需要执行的核心命令排队交给司令;等司令处理完,通信兵再负责把结果打包、发送回去,这样一来,司令(主线程)就从繁琐的通信事务中解放出来了,可以更专注、更及时地处理核心命令,也包括更及时地执行定期扫描和删除过期键的任务,因为主线程的负担减轻了,它执行“定期过期”这个动作的准时性和效率就更高了,被高并发请求拖累的可能性降低了。
但这还不是全部,Redis在后续的版本中,对过期键的清理机制做了更进一步的优化。(根据Redis 7.0版本的更新日志)它引入了一个所谓的“惰性自由列表”(lazy free)机制,并且可以配置异步删除,这是什么意思呢?以前,无论这个键有多大,删除操作(尤其是在定期删除中发现的)都是主线程同步执行的,如果要删除一个包含几百万个元素的超大集合,主线程可能会被这个删除操作“卡住”一小会儿。
可以配置成让主线程在遇到这种可能很耗时的删除任务时(比如删除大键),不再自己亲自干,而是把这个脏活、累活丢给一个专门的“后台线程”(bio线程)去异步处理,主线程只是标记这个键为已删除,然后立刻返回去处理下一个命令,内存的释放工作由后台线程慢慢做,这就让过期键的删除对主线程的延迟影响降到了最低,这无疑是一种更灵活、更智能的策略。
总结一下你的问题“Redis里头怎么用多线程来管过期,感觉还能更灵活点吧?”:Redis并没有简单粗暴地让多个线程同时去争抢着删除过期键,而是通过一种非常巧妙的方式:用多线程分担主线程的网络I/O压力,保证主线程能更顺畅地执行过期清理;对于可能阻塞的删除操作,又提供了异步卸货给后台线程的选项。 这种“主线程轻装上阵 + 后台线程干重活”的组合拳,使得整个过期键的管理变得更加及时、高效,对用户请求的影响更小,也就是你所说的“更灵活”了,它不是在“管理”这件事本身开多线程,而是在整个系统的协作上做了优化,让“管理”这件事进行得更顺畅。
本文由革姣丽于2025-12-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/68166.html
