本文目录导读:

Redis 过期键清理
Redis 已内置过期键清理机制,但可使用脚本手动触发清理或检查。
# clean_redis_expired.py
import redis
import time
def clean_expired(host='localhost', port=6379, db=0):
r = redis.StrictRedis(host=host, port=port, db=db)
# 使用 SCAN 分批扫描(避免阻塞)
cursor = '0'
while cursor != 0:
cursor, keys = r.scan(cursor=cursor, count=1000)
for key in keys:
# 检查剩余生存时间(TTL),若 <=0 则已过期
ttl = r.ttl(key)
if ttl == -2: # 键已不存在(被其他进程删除)
continue
elif ttl == -1: # 没有设置过期时间,可选择性跳过或处理
continue
elif ttl == 0: # 正好过期,立即删除
r.delete(key)
print(f"Deleted expired key: {key}")
time.sleep(0.1) # 控制频率
if __name__ == '__main__':
clean_expired()
Memcached 过期键清理
Memcached 自动清理过期数据,但可手动触发 lru_crawler 或使用统计刷新。
# 通过 telnet 手动触发清理(慎用) echo "lru_crawler metadump all" | nc localhost 11211
或使用 Python 脚本(仅统计,不强制删除):
import memcache mc = memcache.Client(['127.0.0.1:11211']) # Memcached 会自动处理,通常无需手动删除 # 可通过 stats 查看 evictions 等指标 stats = mc.get_stats() print(stats)
本地文件缓存清理
清理超过指定时间的缓存文件。
#!/bin/bash # clean_file_cache.sh CACHE_DIR="/var/cache/myapp" EXPIRY_DAYS=7 # 删除 7 天前修改过的文件 find "$CACHE_DIR" -type f -mtime +$EXPIRY_DAYS -delete # 可选:记录日志 LOGFILE="/var/log/clean_cache.log" echo "$(date): Deleted files older than $EXPIRY_DAYS days from $CACHE_DIR" >> $LOGFILE
数据库查询结果缓存(如 MySQL 查询缓存)
MySQL 8.0+ 已废弃查询缓存,可使用以下方式重置:
-- 检查当前查询缓存状态 SHOW VARIABLES LIKE 'query_cache_type'; -- 如果为 ON,可尝试 RESET QUERY CACHE(需 SUPER 权限) RESET QUERY CACHE; -- 或直接禁用(需重启或 SET GLOBAL) SET GLOBAL query_cache_type = 0;
通用 HTTP 缓存(如 Varnish)
使用 varnishadm 清除过期缓存:
# 清除所有缓存(谨慎,可能影响性能) varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 ban req.url ~ . # 或仅清除过期对象(通过强制刷新 TTL) varnishadm -T 127.0.0.1:6082 "ban obj.ttl < 0"
注意事项
- 备份数据:在清理前确认无重要数据。
- 压力控制:大量删除可能影响性能,建议分批执行。
- 自动调度:可结合
cron定时执行(如每天凌晨低峰期)。 - 日志记录:记录清理数量和时间,便于监控。
如果你的具体缓存实现不同(如自定义 HashMap 缓存、APCu 等),请提供缓存机制,我可以给出更精准的方案。