首页/数据/Redis 进阶速查/UNLINK:非阻塞删除大键
内存与管理99 条

UNLINK:非阻塞删除大键

UNLINK 与 DEL 语义相同但把内存释放工作交给后台线程,删除超大集合时用它替代 DEL 可明显降低阻塞。

Redis 进阶速查数据更新于 2026-10-13

UNLINK 非阻塞删除大键

UNLINK 与 DEL 的语义相同(把键从键空间移除),区别在于内存释放:UNLINK 把释放工作交给后台线程异步完成,因此删除包含数百万元素的集合时不会卡住主线程。Redis 4.0 引入它,主要针对「删一个巨大 zset 停顿数秒」这类问题。命令返回时键已经从键空间消失,其他客户端立刻查不到,但进程占用的内存要过一段时间才真正回落。

基本信息

语法UNLINK key [key ...]
引入版本Redis 4.0 起
与 DEL 的差别内存释放异步
键空间可见性返回时即已摘除
返回值被删除的键数量
观测方式used_memory 回落存在延迟
相关配置lazyfree-lazy-user-del

典型使用场景

  • 清理业务滚动的超大集合,避免删除操作阻塞其他请求
  • 缓存重建前批量移除旧数据结构,控制单次阻塞时长
  • 运维脚本批量删除过期明细键,需要平滑化负载
  • 排查删除大键导致的延迟尖峰,用 UNLINK 验证因果
  • 与 FLUSHALL ASYNC 配合做环境清理,保持主线程可用
  • 自动化治理流程中删除大键,避免定时任务触发业务抖动

使用与验证

使用与验证
redis-cli MEMORY USAGE big:zset            # 先评估键的规模
redis-cli UNLINK big:zset                  # 异步删除,不阻塞主线程
redis-cli EXISTS big:zset                  # 立即返回 0,键空间已摘除
redis-cli UNLINK stale:set:1 stale:set:2   # 多键一次传入
redis-cli INFO memory | grep -E 'used_memory:'  # 内存回落有延迟
redis-cli CONFIG GET lazyfree-lazy-user-del     # 确认 DEL 是否也异步

UNLINK 与 DEL 对照

对比项DELUNLINK
语义删除键删除键
内存释放主线程同步完成后台线程异步完成
大键阻塞可能明显基本消除
键空间可见性返回即可见已删除返回即可见已删除
版本要求全版本Redis 4.0 及以上
把 lazyfree-lazy-user-del 打开后,DEL 本身也会走异步释放路径,但显式使用 UNLINK 的语义更清楚,脚本里优先写 UNLINK。
删除之后马上查看内存可能看不到回落,这不代表删除失败,先看键是否存在,再看趋势曲线。

易错点

  • 以为 UNLINK 能立刻把内存还给系统,看到内存未回落就重复删除,浪费操作
  • 在旧版本实例上使用 UNLINK,命令不被识别导致脚本报错
  • 批量删除海量键时一次传入过多,异步线程成为新的压力来源
  • 删除后立刻做容量判断,把尚未释放的内存当成泄漏
  • 监控不到异步释放进度,延迟抖动排查时误判为其他原因

数据来源与参考

  • Redis 官方文档:UNLINK 命令说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌