Django筆記三十三之快取操作

XHunter發表於2023-04-29

本文首發於公眾號:Hunter後端

原文連結:Django筆記三十三之快取操作

這一節介紹一下如何在 Django 中使用 redis 做快取操作。

在 Django 中可以有很多種方式做快取,比如資料庫,比如伺服器檔案,或者記憶體,這裡介紹用的比較多的使用 redis 作為快取。

這篇筆記主要內容如下:

  1. 依賴安裝
  2. settings.py 配置
  3. 快取操作用法
  4. 快取版本控制
  5. cache 用作 session backend
  6. 清除 redis 裡全部資料
  7. 批次查詢與刪除

其中,redis 的安裝我們在 celery 系列筆記的第一篇已經介紹過了,可以直接使用 docker 來操作,這裡不做贅述了。

1、依賴安裝

Django 連線 redis 這裡用到一個模組,django-redis,接下來我們用 pip 來安裝:

pip3 install django-redis

2、settings.py 配置

然後在 settings.py 裡設定 CACHES 引數即可使用:

# hunter/settings.py

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:123456@127.0.0.1:6380/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

在這裡 redis 的埠我設定成了 6380,密碼我設為了 123456。

如果沒有密碼,LOCATION 的引數為 redis://127.0.0.1:6380/2

當然,如果密碼也可以和 url 分離配置,我們可以放到 OPTIONS 引數裡:

# hunter/settings.py

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6380/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PASSWORD": "123456",
        }
    }
}

3、快取操作用法

在上面的配置都設定好之後,可以正式開始我們的快取操作了。

其實關於快取,我們可以快取檢視,模板等,但是一般來說,都是快取更細粒度的資料,比如某個需要經常被訪問到的、或者需要經過一些時間進行計算得出結果的資料,可以將其存入快取來提高介面的訪問效率。

以下是快取操作的一些用法介紹:

#引入 cache 快取模組
from django.core.cache import cache

#建立一條快取資訊
cache.set("key", "value", 60)
###上述語句釋義:Redis 是一種以 key-value 形式儲存的非關係型資料庫,
###所以上述語句表示的是向 Redis 中存入一條記錄,到期時間是60秒後,以秒為單位

#檢視是否有某條快取資訊
cache.has_key("key")
###返回的結果是布林型 True or False

#如果沒有就建立一條快取資訊
cache.get_or_set("k", 3, 60)
### 返回的是 k 這條記錄的 value 值

#查詢某條快取記錄
cache.get("k")
### 如果沒有這條快取資訊 則不返回

#查詢某條記錄,沒有則返回特定值
cache.get("k", False)

#同時建立多條記錄
cache.set_many({"d":1, "e": 3, "f": 6})
### 輸入引數為一個 字典

#同時查詢多條記錄
cache.get_many(["a", "v", "e"])
### 返回的結果是一個有序字典 OrderedDict

#刪除某條快取記錄
cache.delete("a")
### 輸入引數為該記錄的 key 

#刪除多條快取記錄
cache.delete(["a", "b", "c"])

#清除所有快取記錄
cache.clear()

#對快取value為數字的記錄進行操作
cache.set("num", 1)

#對快取記錄+1
cache.incr("num")

#對快取記錄 +n
cache.incr("num", 5)

#對快取記錄-1
cache.decr("num")

#對快取記錄-n
cache.decr("num", 8)

# 對 key 設定新的過期時間為 20s
cache.touch("num", 20)

# 除了 touch 還有 expire 函式可以設定過期時間
cache.expire("num", 10)

# 設定永不超時,timeout=None
cache.set("a", 1, timeout=None)

# 設定永不過期,還可以使用 persist
cache.persist("a")

# 獲取 key 的剩餘時間,返回的是0 表示已過期或者不存在key,否則返回的是剩餘的秒數,如果返回的是 None 表示該資料永不過期
cache.ttl("a")

4、快取版本控制

如果我們執行 cache.set("a", 1) 這條命令,再去 redis 的命令列透過 keys * 檢視所有資料,可以看到一條 key 為 :1:a 的資料。

但是我們去透過 cache.get("a") 的時候,發現可以直接獲取到資料,這就是後臺為我們自動處理的版本控制,前面的 :1 就表示版本數是 1。

當我們執行 cache.set() 命令時,其實後面還有一個 version 引數,預設為 1,所以下面兩個命令是等效的:

cache.set("a", 1)
cache.set("a", 1, version=1)

所以如果有版本的需求我們可以透過這個引數來控制。

快取版本遞增或遞減

比如對於一個 version=2 的資料,我們可以這樣操作:

cache.set("a", 1, version=2)

# 版本數 +1
cache.incr_version("a")

# 版本數 -1
cache.decr_version("a")

但是注意,當 version 可以減少到 0,但是不能再往下減少了,再減少的話就會報錯了。

5、cache 用作 session backend

在上一節中,我們介紹了預設使用資料庫表作為 session 的儲存形式,我們還可以使用 cache 來用作儲存。

只需要在 settings.py 中加入下面這兩條命令:

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

重新執行系統,使用前一篇筆記的程式碼,呼叫登入介面,然後就可以在 redis 的互動介面,透過 keys * ,就可以看到這條 session 記錄在 redis 裡已經有儲存了。

6、清除 redis 裡全部資料

刪除 redis 中 cache 裡全部 key-value 資料,可以使用下面的命令:

from django_redis import get_redis_connection
get_redis_connection("default").flushall()

7、批次查詢與刪除

我們可以透過萬用字元的方式來查詢或者刪除指定的鍵。

比如我們建立下面幾條資料:

cache.set("a", 1)
cache.set("a_1", 1)
cache.set("a_2", 1)

然後可以透過 a* 的方式來獲取這幾條資料的 key:

cache.keys("a*")
# 返回陣列:["a", "a2", "a3"]

但是官方文件不推薦這種方式,尤其是在 redis 資料量大的情況下,推薦的是 iter_keys() 函式,返回一個迭代器

for key in cache.iter_keys("a*"):
    print(key)

刪除 key

批次刪除的話使用的是 delete_pattern() 函式。

cache.delete_pattern("a*")

以上就是本篇筆記全部內容,來源於兩篇官方文件:

https://django-redis-chs.readthedocs.io/zh_CN/latest/#

https://docs.djangoproject.com/zh-hans/3.2/topics/cache/

如果想獲取更多後端相關文章,可掃碼關注閱讀:
image

相關文章