您的位置:首頁(yè) > 軟件教程 > 教程 > Python中不同緩存組件的使用場(chǎng)景和樣例

Python中不同緩存組件的使用場(chǎng)景和樣例

來(lái)源:好特整理 | 時(shí)間:2024-06-26 15:49:27 | 閱讀:114 |  標簽: T Python   | 分享到:

全文速覽 python的不同緩存組件的使用場(chǎng)景和使用樣例 cachetools的使用 項目背景 代碼檢查項目,需要存儲每一步檢查的中間結果,最終把結果匯總并寫(xiě)入文件中 在中間結果的存儲中 可以使用context進(jìn)行上下文的傳遞,但是整體對代碼改動(dòng)比較大,違背了開(kāi)閉原則 也可以利用緩存存儲,處理完成之

在項目開(kāi)發(fā)中,我們經(jīng)常需要存儲每一步檢查的中間結果,并最終將結果匯總并寫(xiě)入文件。在中間結果的存儲中,我們需要權衡不同方案,以選擇最適合的緩存組件。以下是Python中可用的緩存組件以及它們的使用場(chǎng)景和樣例。

Python中的緩存分類(lèi)包括內存緩存、本地文件緩存和分布式緩存。根據具體需求和使用場(chǎng)景,選擇合適的緩存組件對于項目的性能和效率至關(guān)重要。

內存緩存是最簡(jiǎn)單的一種緩存方法,適用于小規模的數據緩存。使用 functools.lru_cache 可以對函數結果進(jìn)行緩存。例如:

from functools import lru_cache

@lru_cache(maxsize=128)
def expensive_function(param1, param2):
    # 進(jìn)行一些耗時(shí)的操作
    return result

如果緩存的數據較大,或者需要跨進(jìn)程共享緩存,可以使用文件系統緩存庫,例如 diskcache 。示例:

import diskcache as dc

cache = dc.Cache('/tmp/mycache')

@cache.memoize(expire=3600)
def expensive_function(param1, param2):
    # 進(jìn)行一些耗時(shí)的操作
    return result

對于需要跨多個(gè)應用實(shí)例共享緩存的數據,可以使用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 = # 進(jìn)行一些耗時(shí)的操作
    r.set(key, pickle.dumps(result), ex=3600)  # 設置緩存過(guò)期時(shí)間為1小時(shí)
    return result

根據具體需求和使用場(chǎng)景選擇合適的內存緩存組件。對于簡(jiǎn)單的緩存需求,可以使用 functools.lru_cache cachetools 。對于Web應用, django.core.cache Flask-Caching 是不錯的選擇。對于HTTP請求緩存,可以使用 requests_cache 。對于科學(xué)計算, joblib.Memory 是一個(gè)好選擇。

在項目中,綜合考量最終決定選擇 作為緩存組件。以下是 的使用示例:

1. 安裝

pip install cachetools

2. 實(shí)現緩存工具類(lèi)

from cachetools import LRUCache
from cachetools import Cache
from siada.cr.logger.logger import logger

class CacheUtils:
    """
    緩存工具類(lèi)
    """

    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 如果后續生成過(guò)程改為多線(xiàn)程并發(fā),需考慮數據競爭問(wèn)題
cache = CacheUtils()

在項目中使用 作為緩存組件,可以更好地管理中間結果的存儲,提高項目的性能和效率。

如果您對本文感興趣,還將定期分享最新互聯(lián)網(wǎng)資訊、AI前沿新聞、技術(shù)分享與職業(yè)發(fā)展以及程序員生活趣事。關(guān)注回復【1024】,驚喜等您來(lái)拿!

敬請關(guān)注【程序員世杰】

Python中不同緩存組件的使用場(chǎng)景和樣例

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認同期限觀(guān)點(diǎn)或證實(shí)其描述。

相關(guān)視頻攻略

更多

掃二維碼進(jìn)入好特網(wǎng)手機版本!

掃二維碼進(jìn)入好特網(wǎng)微信公眾號!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權,請發(fā)郵件admin@haote.com

湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2024 haote.com 好特網(wǎng)