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