当前位置:首页 > 问答 > 正文

Redis优化 键管理 批量清理Redis无用键,集中批量删除redis键

Redis大扫除:三招教你批量清理无用键

场景:当Redis变成"杂物间"

"小王啊,咱们的Redis响应怎么越来越慢了?" 一大早,技术总监就皱着眉头找上门来,我打开Redis一看,好家伙,800多万个键里至少有三分之一是早已过期的测试数据和废弃缓存,活像个塞满杂物的储物间,这种情况你是不是也遇到过?

KEYS+DEL组合拳(适合小规模清理)

# 先找出所有匹配的键(生产环境慎用KEYS命令!)
redis-cli KEYS "user:session:*" > sessions.txt
# 使用xargs批量删除(每次删除1000个防阻塞)
cat sessions.txt | xargs -L 1000 redis-cli DEL

注意:KEYS命令会阻塞Redis,百万级键库可能导致服务卡顿,建议在低峰期操作,或者改用SCAN...

Redis优化 键管理 批量清理Redis无用键,集中批量删除redis键

SCAN+DEL流水线(安全之选)

# 使用SCAN迭代查询(不阻塞服务)
redis-cli --scan --pattern "temp:cache:*" | while read key
do
  redis-cli DEL "$key"
  echo "已删除: $key"
done

更高效的做法是使用管道:

redis-cli --scan --pattern "order:tmp:*" | xargs -L 500 redis-cli DEL

Lua脚本原子操作(终极方案)

-- delete_keys.lua
local pattern = ARGV[1]
local batch_size = 1000
local cursor = "0"
local deleted = 0
repeat
  local reply = redis.call("SCAN", cursor, "MATCH", pattern, "COUNT", batch_size)
  cursor = reply[1]
  local keys = reply[2]
  if #keys > 0 then
    redis.call("DEL", unpack(keys))
    deleted = deleted + #keys
  end
until cursor == "0"
return deleted

执行脚本:

Redis优化 键管理 批量清理Redis无用键,集中批量删除redis键

redis-cli --eval delete_keys.lua , "cart:expired:*"

实战避坑指南

  1. 备份优先:执行删除前务必redis-cli SAVE备份数据
  2. 分批操作:单次删除不超过5000个键,避免长时间阻塞
  3. 监控内存:删除过程中用redis-cli INFO memory观察变化
  4. 键命名规范:建议采用业务:类型:ID的层级结构,方便管理

进阶技巧:自动过期设计

与其事后清理,不如从源头控制:

# 设置键时直接添加TTL
redis-cli SETEX "promo:2025summer" 86400 "sale_info"
# 或者使用过期时间戳
redis-cli HSET "user:1001" "session" "token123" EXPIREAT 1754006400

记得上个月我们清理了420万无效键后,Redis内存占用从14GB直降到5.8GB,QPS提升了近3倍,定期给Redis做"大扫除",就像定期整理你的办公桌一样,能让整个系统保持清爽高效,下次遇到Redis变慢时,不妨先看看是不是该清理无用键了!

Redis优化 键管理 批量清理Redis无用键,集中批量删除redis键

发表评论