Redis被动键过期是否会阻塞触发该操作的客户端命令?
Redis被动过期的阻塞问题解析
被动过期是否会阻塞触发它的客户端命令?
会阻塞。当客户端尝试访问已超时的键时,Redis会先执行该键的删除操作,再返回结果给客户端。如果这个键是包含M条记录的大型ZSET这类复杂结构,删除操作的时间复杂度为O(M),这段耗时会直接同步阻塞当前客户端的命令,直到删除完成。
大型过期键的删除对Redis主事件循环的影响
除了阻塞触发的客户端,这个同步删除操作也会阻塞Redis的主事件循环。因为Redis采用单线程模型处理核心请求,主事件循环在执行O(M)的删除操作时,无法处理其他客户端的请求、后台任务等,会导致整个Redis服务在这段时间内出现响应延迟,甚至短时间无法处理其他请求。
优化方案
从Redis 4.0版本开始,提供了两种方式避免这种阻塞:
- 使用
UNLINK命令替代DEL,它会将键的删除操作放到后台线程异步执行; - 开启配置
lazyfree-lazy-expire,让过期键的删除操作自动走异步后台线程,不会阻塞主事件循环和触发的客户端命令。
内容的提问来源于stack exchange,提问作者tomato
相关产品推荐
相关产品推荐

