redis开源贡献(1)-异步释放从节点过期字典

问题描述

最近给redis和valkey的社区提了一个pr,解决了一个在redis中存在了数年的问题。截止目前,valkey的已经pr通过并合入了主线,redis的还在cr中。

pr链接如下:

该pr解决问题描述如下:

redis的从节点有一个配置开关,可以打开写功能,即可以直接往从节点写入数据。

那么这个会导致一个一致性问题,我们知道redis的从节点是不允许自己删除过期数据的,只能主节点过期删除后,同步del命令给从节点,从节点才能删除。但这样直接往从节点写入的带过期时间的数据,就永远不会被删除了,因为不会有del命令从主节点同步过来。

因此redis内部有一个字典,专门记录属于slave的过期key,用于解决以上问题。

但这个字典在删除时,比如flushall async时,是同步操作,实测每一百万个key,会阻塞一秒主线程,这不符合异步删除的预期。

因此我简单添加了一些异步删除的代码逻辑,解决了此问题。

pr过程

其实在valkey的合并过程中,跟维护者有过一段必要性的探讨。主要是探讨什么场景有可能会大量的往从节点写入数据。因为在redis场景下,是不鼓励往从节点写数据的。

具体的cr comment在链接中有详细的记录,这里不再赘述。https://github.com/valkey-io/valkey/pull/2849