全文速覽 python的不同緩存組件的使用場(chǎng)景和使用樣例 cachetools的使用 項(xiàng)目背景 代碼檢查項(xiàng)目,需要存儲(chǔ)每一步檢查的中間結(jié)果,最終把結(jié)果匯總并寫入文件中 在中間結(jié)果的存儲(chǔ)中 可以使用context進(jìn)行上下文的傳遞,但是整體對(duì)代碼改動(dòng)比較大,違背了開閉原則 也可以利用緩存存儲(chǔ),處理完成之
在項(xiàng)目開發(fā)中,我們經(jīng)常需要存儲(chǔ)每一步檢查的中間結(jié)果,并最終將結(jié)果匯總并寫入文件。在中間結(jié)果的存儲(chǔ)中,我們需要權(quán)衡不同方案,以選擇最適合的緩存組件。以下是Python中可用的緩存組件以及它們的使用場(chǎng)景和樣例。
Python中的緩存分類包括內(nèi)存緩存、本地文件緩存和分布式緩存。根據(jù)具體需求和使用場(chǎng)景,選擇合適的緩存組件對(duì)于項(xiàng)目的性能和效率至關(guān)重要。
內(nèi)存緩存是最簡(jiǎn)單的一種緩存方法,適用于小規(guī)模的數(shù)據(jù)緩存。使用
functools.lru_cache
可以對(duì)函數(shù)結(jié)果進(jìn)行緩存。例如:
from functools import lru_cache
@lru_cache(maxsize=128)
def expensive_function(param1, param2):
# 進(jìn)行一些耗時(shí)的操作
return result
如果緩存的數(shù)據(jù)較大,或者需要跨進(jìn)程共享緩存,可以使用文件系統(tǒng)緩存庫(kù),例如
diskcache
。示例:
import diskcache as dc
cache = dc.Cache('/tmp/mycache')
@cache.memoize(expire=3600)
def expensive_function(param1, param2):
# 進(jìn)行一些耗時(shí)的操作
return result
對(duì)于需要跨多個(gè)應(yīng)用實(shí)例共享緩存的數(shù)據(jù),可以使用Redis這樣的分布式緩存系統(tǒng)。示例:
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 = # 進(jìn)行一些耗時(shí)的操作
r.set(key, pickle.dumps(result), ex=3600) # 設(shè)置緩存過(guò)期時(shí)間為1小時(shí)
return result
根據(jù)具體需求和使用場(chǎng)景選擇合適的內(nèi)存緩存組件。對(duì)于簡(jiǎn)單的緩存需求,可以使用
functools.lru_cache
或
cachetools
。對(duì)于Web應(yīng)用,
django.core.cache
和
Flask-Caching
是不錯(cuò)的選擇。對(duì)于HTTP請(qǐng)求緩存,可以使用
requests_cache
。對(duì)于科學(xué)計(jì)算,
joblib.Memory
是一個(gè)好選擇。
在項(xiàng)目中,綜合考量最終決定選擇
1. 安裝
pip install cachetools
2. 實(shí)現(xiàn)緩存工具類
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 如果后續(xù)生成過(guò)程改為多線程并發(fā),需考慮數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題
cache = CacheUtils()
在項(xiàng)目中使用
如果您對(duì)本文感興趣,還將定期分享最新互聯(lián)網(wǎng)資訊、AI前沿新聞、技術(shù)分享與職業(yè)發(fā)展以及程序員生活趣事。關(guān)注回復(fù)【1024】,驚喜等您來(lái)拿!
敬請(qǐng)關(guān)注【程序員世杰】
小編推薦閱讀
機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對(duì)象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動(dòng)態(tài)代理的對(duì)比分析
閱讀Win11筆記本“自動(dòng)管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)