本文目录导读:

- 使用
functools.lru_cache(函数级缓存) - 使用
cachetools库(支持多种缓存策略) - 使用
redis作为本地缓存 - 使用
diskcache(文件系统缓存) - 自定义字典缓存统计
- 监控缓存使用情况
- 选择建议
在Python中统计本地缓存存储数量,具体取决于你使用的缓存方式,以下是几种常见场景的实现方法:
使用 functools.lru_cache(函数级缓存)
from functools import lru_cache
@lru_cache(maxsize=128)
def expensive_function(n):
return n * n
# 调用函数触发缓存
for i in range(10):
expensive_function(i)
# 获取缓存信息
cache_info = expensive_function.cache_info()
print(f"缓存命中次数: {cache_info.hits}")
print(f"缓存未命中次数: {cache_info.misses}")
print(f"当前缓存大小: {cache_info.currsize}")
print(f"最大缓存容量: {cache_info.maxsize}")
使用 cachetools 库(支持多种缓存策略)
from cachetools import LRUCache, TTLCache
# 创建LRU缓存
cache = LRUCache(maxsize=100)
# 添加数据
cache['key1'] = 'value1'
cache['key2'] = 'value2'
# 统计缓存数量
cache_count = len(cache)
print(f"缓存中项目数量: {cache_count}")
# 或使用currsize属性
print(f"当前缓存大小: {cache.currsize}")
# 带过期时间的缓存
ttl_cache = TTLCache(maxsize=100, ttl=300)
ttl_cache['key1'] = 'value1'
print(f"TTL缓存数量: {len(ttl_cache)}")
使用 redis 作为本地缓存
import redis
# 连接本地Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 设置缓存
r.set('user:1', 'data1')
r.set('user:2', 'data2')
# 统计键数量(所有缓存)
cache_count = r.dbsize()
print(f"Redis缓存总数: {cache_count}")
# 统计特定模式的键数量
keys = r.keys('user:*')
print(f"用户缓存数量: {len(keys)}")
# 使用SCAN命令(推荐,不会阻塞)
cursor = 0
count = 0
while cursor != 0 or count == 0:
cursor, data = r.scan(cursor=cursor, match='user:*', count=1000)
count += len(data)
print(f"用户缓存数量(scan方式): {count}")
使用 diskcache(文件系统缓存)
import diskcache as dc
# 创建文件缓存
cache = dc.Cache('/tmp/my_cache')
# 添加缓存
cache['key1'] = 'value1'
cache['key2'] = 'value2'
# 统计缓存数量
cache_count = len(cache)
print(f"磁盘缓存数量: {cache_count}")
# 或使用volume方法获取详情
stats = cache.volume()
print(f"缓存统计: {stats}")
自定义字典缓存统计
class CacheStats(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.hits = 0
self.misses = 0
def get(self, key, default=None):
if key in self:
self.hits += 1
else:
self.misses += 1
return super().get(key, default)
def stats(self):
return {
'size': len(self),
'hits': self.hits,
'misses': self.misses,
'hit_rate': self.hits / (self.hits + self.misses) if (self.hits + self.misses) > 0 else 0
}
# 使用示例
cache = CacheStats()
cache['user1'] = 'data1'
cache['user2'] = 'data2'
cache.get('user1') # 命中
cache.get('user3') # 未命中
print(f"缓存统计: {cache.stats()}")
监控缓存使用情况
import time
from collections import defaultdict
class CacheMonitor:
def __init__(self):
self.caches = defaultdict(dict)
def register_cache(self, name, cache_obj):
self.caches[name] = {
'cache': cache_obj,
'last_check': time.time()
}
def monitor_all(self):
results = {}
for name, info in self.caches.items():
cache = info['cache']
if hasattr(cache, 'currsize'):
size = cache.currsize
elif hasattr(cache, '__len__'):
size = len(cache)
else:
size = 'N/A'
results[name] = {
'size': size,
'time_since_check': time.time() - info['last_check']
}
info['last_check'] = time.time()
return results
# 使用示例
monitor = CacheMonitor()
monitor.register_cache('lru_cache', expensive_function)
monitor.register_cache('dict_cache', {'a': 1, 'b': 2})
print(monitor.monitor_all())
选择建议
- 函数级缓存:使用
functools.lru_cache或cachetools - 进程内缓存:使用字典或
cachetools - 持久化缓存:使用
diskcache或sqlite - 分布式缓存:使用
redis - 需要监控:自定义包装器或使用现有库的统计功能
根据你的具体需求选择合适的缓存方式,并结合 len()、currsize 等属性进行数量统计。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播