簡體   English   中英

燒瓶緩存:基於模式列出鍵?

[英]flask cache: list keys based on a pattern?

我使用 Flask Cache 插件和 Redis 作為后端來緩存我的 API 響應。 假設我有 API 來獲取用戶並創建這樣的用戶:

/api/users?page=1  GET
/api/users         POST

GET 結果將以完整 URL 為鍵進行緩存。 創建新用戶時,我想刪除所有以/api/users開頭的鍵 - 目前我正在執行cache.clear()但似乎幾乎沒有必要。

但是,我似乎找不到用於獲取密鑰列表的 API。 使用redis-py ,有一個用於此目的的keys(*pattern) API。 Flask Cache 有類似的 API 嗎?

Flask-Cache 看起來已經過時了。 您可以切換到Flask-Caching ,它是 Flask-Cache 的維護分支。

按模式刪除Redis鍵

你有兩個選擇:

  1. 使用redis包單獨連接到 Redis。 使用包提供的核心命令根據模式搜索鍵,並刪除它們。
  2. 使用 Flask-Cache / Flask-Caching 的protected 方法來訪問底層 Redis 對象,並在該對象上使用核心命令根據模式搜索鍵,並刪除它們。

選項 1:單獨連接到 Redis

# python utility for redis
import redis

r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB, password=REDIS_PASSWORD)

def delete_pattern(pattern: str) -> int:
    """Remove all keys matching pattern.
    """
    count = 0
    for key in r.scan_iter(pattern):
        r.delete(key)
        count += 1
    return count

# pass pattern to delete
CACHE_URL_PAT = "flask_cache*auth*"
delete_pattern(CACHE_URL_PAT)

選項 2:使用受保護的方法來訪問底層 Redis 連接對象

⚠️ 盡管這工作正常,但這些是未記錄的方法。 我瀏覽了 GitHub 上的源代碼來創建這個函數。 僅針對 CACHE_TYPE = 'redis' 進行測試

# initialised cache object stored in extensions file
from app.extensions import cache

def delete_pattern(pattern):
    status = False
    binary_keys = cache.cache._read_clients.keys(pattern)
    keys = [k.decode("utf-8", errors="ignore") for k in binary_keys if k]
    if keys:
        status = cache.cache._write_client.delete(*keys)
    return status

# pass pattern to delete
CACHE_URL_PAT = "flask_cache*auth*"
delete_pattern(CACHE_URL_PAT)


注意: flask_cache_是 Flask-Caching 中的默認CACHE_KEY_PREFIX 如果您為CACHE_KEY_PREFIX使用了其他值,請使用它(而不是flask_cache_ )作為搜索模式的前綴。

Flask 緩存插件不提供原始 redis 命令的任何訪問點。 您可以使用 redis-py 連接到相同的 redis 實例和數據庫以按模式刪除鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM