全文速览 python的不同缓存组件的使用场景和使用样例 cachetools的使用 项目背景 代码检查项目,需要存储每一步检查的中间结果,最终把结果汇总并写入文件中 在中间结果的存储中 可以使用context进行上下文的传递,但是整体对代码改动比较大,违背了开闭原则 也可以利用缓存存储,处理完成之
在项目开发中,我们经常需要存储每一步检查的中间结果,并最终将结果汇总并写入文件。在中间结果的存储中,我们需要权衡不同方案,以选择最适合的缓存组件。以下是Python中可用的缓存组件以及它们的使用场景和样例。
Python中的缓存分类包括内存缓存、本地文件缓存和分布式缓存。根据具体需求和使用场景,选择合适的缓存组件对于项目的性能和效率至关重要。
内存缓存是最简单的一种缓存方法,适用于小规模的数据缓存。使用
functools.lru_cache
可以对函数结果进行缓存。例如:
from functools import lru_cache
@lru_cache(maxsize=128)
def expensive_function(param1, param2):
# 进行一些耗时的操作
return result
如果缓存的数据较大,或者需要跨进程共享缓存,可以使用文件系统缓存库,例如
diskcache
。示例:
import diskcache as dc
cache = dc.Cache('/tmp/mycache')
@cache.memoize(expire=3600)
def expensive_function(param1, param2):
# 进行一些耗时的操作
return result
对于需要跨多个应用实例共享缓存的数据,可以使用Redis这样的分布式缓存系统。示例:
import redis
import pickle
r = redis.StrictRedis(host='localhost', port=6379, db=0)
def expensive_function(param1, param2):
key = f"{param1}_{param2}"
cached_result = r.get(key)
if cached_result:
return pickle.loads(cached_result)
result = # 进行一些耗时的操作
r.set(key, pickle.dumps(result), ex=3600) # 设置缓存过期时间为1小时
return result
根据具体需求和使用场景选择合适的内存缓存组件。对于简单的缓存需求,可以使用
functools.lru_cache
或
cachetools
。对于Web应用,
django.core.cache
和
Flask-Caching
是不错的选择。对于HTTP请求缓存,可以使用
requests_cache
。对于科学计算,
joblib.Memory
是一个好选择。
在项目中,综合考量最终决定选择
1. 安装
pip install cachetools
2. 实现缓存工具类
from cachetools import LRUCache
from cachetools import Cache
from siada.cr.logger.logger import logger
class CacheUtils:
"""
缓存工具类
"""
def __init__(self, cache: Cache = None):
self.cache = cache if cache else LRUCache(maxsize=100)
def get_value(self, cache_key: str):
value = self.cache.get(cache_key, None)
if value is not None:
logger.info(f"Cache hit for key: {cache_key}")
else:
logger.info(f"Cache miss for key: {cache_key}")
return value
def set_key_value(self, cache_key: str, value):
self.cache[cache_key] = value
logger.info(f"Set cache key: {cache_key} with value: {value}")
def set_key_list(self, cache_key: str, value):
v = self.cache.get(cache_key, None)
if v is not None:
v.append(value)
else:
self.cache[cache_key] = [value]
def clear_cache(self):
self.cache.clear()
# TODO 如果后续生成过程改为多线程并发,需考虑数据竞争问题
cache = CacheUtils()
在项目中使用
如果您对本文感兴趣,还将定期分享最新互联网资讯、AI前沿新闻、技术分享与职业发展以及程序员生活趣事。关注回复【1024】,惊喜等您来拿!
敬请关注【程序员世杰】
小编推荐阅读