您的位置:首頁 > 軟件教程 > 教程 > Python中不同緩存組件的使用場景和樣例

Python中不同緩存組件的使用場景和樣例

來源:好特整理 | 時間:2024-06-26 15:49:27 | 閱讀:156 |  標簽: T Python   | 分享到:

全文速覽 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()

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

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

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

Python中不同緩存組件的使用場景和樣例

小編推薦閱讀

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

相關(guān)視頻攻略

更多

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

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

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]

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