脚本怎样清理过期缓存数据

wen 实用脚本 29

本文目录导读:

脚本怎样清理过期缓存数据

  1. Redis 过期键清理
  2. Memcached 过期键清理
  3. 本地文件缓存清理
  4. 数据库查询结果缓存(如 MySQL 查询缓存)
  5. 通用 HTTP 缓存(如 Varnish)
  6. 注意事项

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"

注意事项

  1. 备份数据:在清理前确认无重要数据。
  2. 压力控制:大量删除可能影响性能,建议分批执行。
  3. 自动调度:可结合 cron 定时执行(如每天凌晨低峰期)。
  4. 日志记录:记录清理数量和时间,便于监控。

如果你的具体缓存实现不同(如自定义 HashMap 缓存、APCu 等),请提供缓存机制,我可以给出更精准的方案。

抱歉,评论功能暂时关闭!