本文目录导读:

我来为您介绍几种Python自动清理过期缓存数据的方法:
基于时间的缓存清理
使用字典存储带时间戳的缓存
import time
import threading
class TimeBasedCache:
def __init__(self, default_ttl=300): # 默认5分钟
self.cache = {}
self.default_ttl = default_ttl
self._start_cleanup_thread()
def set(self, key, value, ttl=None):
ttl = ttl or self.default_ttl
self.cache[key] = {
'value': value,
'expire_time': time.time() + ttl
}
def get(self, key):
if key not in self.cache:
return None
item = self.cache[key]
if time.time() > item['expire_time']:
del self.cache[key]
return None
return item['value']
def cleanup(self):
"""清理过期缓存"""
now = time.time()
expired_keys = [
key for key, item in self.cache.items()
if now > item['expire_time']
]
for key in expired_keys:
del self.cache[key]
def _start_cleanup_thread(self):
"""启动后台清理线程"""
def cleanup_loop():
while True:
self.cleanup()
time.sleep(60) # 每分钟检查一次
thread = threading.Thread(target=cleanup_loop, daemon=True)
thread.start()
使用LRU缓存(最近最少使用)
from collections import OrderedDict
class LRUCache:
def __init__(self, capacity=100, ttl=300):
self.cache = OrderedDict()
self.capacity = capacity
self.ttl = ttl
def get(self, key):
if key not in self.cache:
return None
value, timestamp = self.cache[key]
if time.time() - timestamp > self.ttl:
del self.cache[key]
return None
# 移动到最近使用
self.cache.move_to_end(key)
return value
def put(self, key, value):
if key in self.cache:
del self.cache[key]
elif len(self.cache) >= self.capacity:
# 删除最久未使用的
self.cache.popitem(last=False)
self.cache[key] = (value, time.time())
文件系统缓存清理
import os
import shutil
import glob
from datetime import datetime, timedelta
class FileCacheCleaner:
def __init__(self, cache_dir, max_age_days=7, max_size_mb=500):
self.cache_dir = cache_dir
self.max_age = timedelta(days=max_age_days)
self.max_size = max_size_mb * 1024 * 1024
os.makedirs(cache_dir, exist_ok=True)
def clean_by_age(self):
"""按文件年龄清理"""
now = datetime.now()
for root, dirs, files in os.walk(self.cache_dir):
for file in files:
file_path = os.path.join(root, file)
mtime = datetime.fromtimestamp(os.path.getmtime(file_path))
if now - mtime > self.max_age:
os.remove(file_path)
print(f"已删除过期文件: {file_path}")
def clean_by_size(self):
"""按总大小清理"""
total_size = 0
file_list = []
for root, dirs, files in os.walk(self.cache_dir):
for file in files:
file_path = os.path.join(root, file)
size = os.path.getsize(file_path)
mtime = os.path.getmtime(file_path)
file_list.append((mtime, file_path, size))
total_size += size
# 按修改时间排序,删除最旧的文件
if total_size > self.max_size:
file_list.sort()
for mtime, file_path, size in file_list:
if total_size <= self.max_size:
break
os.remove(file_path)
total_size -= size
print(f"已删除文件以释放空间: {file_path}")
def clean_pattern(self, pattern):
"""按模式清理"""
for file_path in glob.glob(os.path.join(self.cache_dir, pattern)):
os.remove(file_path)
print(f"已删除匹配文件: {file_path}")
使用缓存库(带自动清理功能)
使用 cachetools
from cachetools import TTLCache
import time
# 创建自动过期的缓存
cache = TTLCache(maxsize=100, ttl=300) # 最多100个,存活5分钟
# 使用缓存
cache['user_1'] = {'name': 'Alice', 'age': 30}
print(cache.get('user_1')) # 5分钟内有效
# 自定义清理(可配合定时任务)
cache.expire() # 手动触发过期清理
使用 diskcache
import diskcache as dc
# 基于磁盘的缓存
cache = dc.Cache('/tmp/my_cache')
# 设置自动过期时间
cache.set('key', 'value', expire=300) # 5分钟后过期
# 自动清理(后台线程自动执行)
cache.expire() # 运行清理
cache.cull() # 清理过期项和超出容量的项
完整的定时清理方案
import schedule
import time
from functools import wraps
class AutoCleanCache:
def __init__(self, cleanup_interval_minutes=30):
self.cache = {}
self.cleanup_interval = cleanup_interval_minutes
self.start_scheduler()
def cached(self, ttl=300):
"""装饰器:自动缓存并清理"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
key = f"{func.__name__}:{args}:{kwargs}"
now = time.time()
if key in self.cache:
value, expire_time = self.cache[key]
if now < expire_time:
return value
result = func(*args, **kwargs)
self.cache[key] = (result, now + ttl)
return result
return wrapper
return decorator
def cleanup_expired(self):
"""清理过期缓存"""
now = time.time()
expired = [k for k, (v, exp) in self.cache.items() if now > exp]
for k in expired:
del self.cache[k]
print(f"已清理 {len(expired)} 条过期缓存")
def start_scheduler(self):
"""启动定时清理任务"""
schedule.every(self.cleanup_interval).minutes.do(self.cleanup_expired)
def run_scheduler():
while True:
schedule.run_pending()
time.sleep(1)
import threading
thread = threading.Thread(target=run_scheduler, daemon=True)
thread.start()
# 使用示例
cache_manager = AutoCleanCache(cleanup_interval_minutes=15)
@cache_manager.cached(ttl=120) # 缓存2分钟
def get_expensive_data(id):
# 模拟耗时操作
time.sleep(2)
return {"id": id, "data": "expensive data"}
使用建议
- 小规模应用:使用字典 + 时间戳方式
- 大规模应用:考虑 Redis 等外部缓存系统
- 文件缓存:定期扫描文件系统
- Web应用:使用 Flask-Caching、Django缓存框架
- 关键业务:确保清理逻辑不影响正常服务
选择合适的方案取决于您的具体需求和缓存的数据量级。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播