上一篇
想象一下这个场景:你的电商平台正在经历促销活动,Redis缓存中堆积了大量临时商品数据和用户会话信息,活动结束后,这些数据就像派对结束后散落一地的彩带和气球,不仅占用宝贵的内存空间,还可能因为过期数据导致业务逻辑出错,更糟的是,你的Redis采用主从架构,手动清理既繁琐又容易出错...
这就是为什么我们需要一套自动化、可靠的Redis主从缓存清理方案,下面我将详细介绍几种实用方法,帮你解决这个运维痛点。
# 设置键的过期时间(单位:秒) 127.0.0.1:6379> SET coupon:user123 "50%OFF" EX 86400
特点:
Redis默认每10秒随机检查20个键,发现过期立即删除
配置调整(redis.conf):
# 调整主动删除频率(默认10hz即每秒10次)
hz 20
# 每次扫描的键数量(默认20)
active-expire-effort 50
适用场景:
#!/bin/bash # 清理匹配特定模式的键(主节点执行) REDIS_MASTER="127.0.0.1" PORT=6379 PASSWORD="yourpassword" PATTERN="temp:*" # 使用SCAN避免阻塞(生产环境建议在低峰期执行) redis-cli -h $REDIS_MASTER -p $PORT -a $PASSWORD --scan --pattern "$PATTERN" | \ xargs -L 100 redis-cli -h $REDIS_MASTER -p $PORT -a $PASSWORD del
注意事项:
-- cleanup.lua local pattern = KEYS[1] local batchSize = tonumber(ARGV[1]) local cursor = "0" local deleted = 0 repeat local reply = redis.call("SCAN", cursor, "MATCH", pattern, "COUNT", batchSize) 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-cli -h master_host --eval cleanup.lua "session:*" , 500
标记阶段(低峰期执行):
# 为待清理键添加标记 redis-cli --scan --pattern "cache:*" | xargs -L 100 redis-cli EXPIRE 3600
删除阶段(次日执行):
# 清理前一天标记的键 redis-cli SCAN 0 MATCH "cache:*" COUNT 1000 | \ awk '{print "redis-cli TTL "$1}' | \ grep "^-1$" | \ awk '{print "redis-cli DEL "$1}'
import redis def safe_clean_slave(master_host, slave_host, pattern): # 步骤1:提升从节点为临时主节点 slave = redis.Redis(host=slave_host) slave.config_set('slaveof', 'no', 'one') # 步骤2:在新主节点执行清理 keys_deleted = 0 cursor = '0' while cursor != 0: cursor, keys = slave.scan(cursor=cursor, match=pattern, count=1000) if keys: slave.delete(*keys) keys_deleted += len(keys) # 步骤3:恢复主从关系 slave.config_set('slaveof', master_host, '6379') return keys_deleted
redis-cli info replication
redis-cli info memory | grep ratio
redis-cli --scan --pattern "temp:*" | wc -l
MEMORY PURGE
(Redis 4.0+)used_memory
和evicted_keys
监控项# 遍历所有主节点执行清理 for node in $(redis-cli cluster nodes | grep master | awk '{print $2}' | cut -d@ -f1); do redis-cli -h ${node%:*} -p ${node#*:} --scan --pattern "temp:*" | \ xargs -L 100 redis-cli -h ${node%:*} -p ${node#*:} del done
# 查找大于1MB的Key redis-cli --bigkeys # 渐进式删除大Hash redis-cli hscan big_hash 0 | \ awk '{if(NR>1){print $0}}' | \ xargs -L 2 | \ awk '{print "redis-cli hdel big_hash "$1}'
选择合适的Redis清理方案就像选择打扫工具——小范围用"鸡毛掸子"(惰性删除),日常维护用"扫地机器人"(定期删除),大扫除就得用"高压水枪"(批量清理),主从架构下切记:所有写操作必须通过主节点,从节点会自动同步。
根据2025年最新的Redis最佳实践,建议组合使用:
没有放之四海皆准的方案,关键是根据业务特点找到平衡点——既不让缓存变成垃圾场,也不因过度清理导致缓存穿透。
本文由 公西初蓝 于2025-08-01发表在【云服务器提供商】,文中图片由(公西初蓝)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/501920.html
发表评论