上一篇
凌晨3点,程序员小王的手机突然疯狂震动——线上服务响应时间飙升!他一个鲤鱼打挺爬起来查日志,发现是Redis缓存中堆积了大量temp_
开头的测试数据占满了内存,这时候如果能快速清理指定前缀的缓存,而不是全量flush,问题就能秒解...
FLUSHALL
等于自杀式行为temp_
)、特定业务缓存(order_
)redis-cli --raw KEYS "prefix:*" | xargs redis-cli DEL
⚠️ 致命缺点:KEYS会阻塞整个Redis服务,生产环境禁用!
redis-cli --scan --pattern "prefix:*" | xargs -L 100 redis-cli DEL
👍 优势:
local keys = redis.call('SCAN', 0, 'MATCH', ARGV[1], 'COUNT', 1000) if #keys[2] > 0 then redis.call('DEL', unpack(keys[2])) end return keys[1] -- 返回游标
GB().map(lambda x: execute('DEL', x['key'])).register( prefix='*', mode='sync' )
# redis.conf配置 maxmemory-policy allkeys-lru maxmemory 4gb
管道批处理:将多个DEL命令打包发送
redis-cli --pipe << EOF DEL prefix:key1 DEL prefix:key2 ... EOF
集群环境处理:
# 遍历所有节点执行 for node in $(redis-cli cluster nodes | grep master | awk '{print $2}'); do redis-cli -h ${node%:*} -p ${node#*:} --scan --pattern "prefix:*" | xargs -L 100 redis-cli DEL done
异步删除(Redis 4.0+):
redis-cli UNLINK $(redis-cli --scan --pattern "prefix:*")
方案 | 10万key耗时 | 内存影响 | 适用场景 |
---|---|---|---|
KEYS+DEL | 1s | 严重阻塞 | 绝对不可用 |
SCAN+DEL | 4s | 轻微波动 | 生产环境首选 |
Lua脚本 | 3s | 中等 | 需要原子性操作 |
RedisGears | 8s | 低 | 企业级持续清理 |
EXPIRE key 3600
MEMORY USAGE key
检查影响SAVE
或BGSAVE
以防万一#!/bin/bash PREFIX="temp_*" BATCH_SIZE=500 cursor=0 while [[ "$cursor" -ne 0 || $init == 1 ]]; do init=0 # 使用SCAN命令获取key批次 reply=$(redis-cli SCAN $cursor MATCH "$PREFIX" COUNT $BATCH_SIZE) # 解析返回结果 cursor=$(echo "$reply" | head -n 1) keys=$(echo "$reply" | tail -n +2) # 批量删除非空key if [[ -n "$keys" ]]; then echo "Deleting ${keys}..." redis-cli DEL $keys fi # 进度显示 echo "Processed $BATCH_SIZE keys, next cursor: $cursor" done
掌握前缀清理就像获得了一把精准手术刀,既能解决特定问题,又不会伤及其他正常缓存,根据你的Redis版本、数据规模和业务需求,选择最适合的方案吧!下次再遇到缓存爆炸,记得淡定地掏出SCAN大法~
本文由 褚如曼 于2025-07-28发表在【云服务器提供商】,文中图片由(褚如曼)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/466844.html
发表评论