本文首發於公眾號:Hunter後端 原文鏈接:Django筆記三十三之緩存操作 這一節介紹一下如何在 Django 中使用 redis 做緩存操作。 在 Django 中可以有很多種方式做緩存,比如資料庫,比如伺服器文件,或者記憶體,這裡介紹用的比較多的使用 redis 作為緩存。 這篇筆記主要內容如 ...
本文首發於公眾號:Hunter後端
原文鏈接:Django筆記三十三之緩存操作
這一節介紹一下如何在 Django 中使用 redis 做緩存操作。
在 Django 中可以有很多種方式做緩存,比如資料庫,比如伺服器文件,或者記憶體,這裡介紹用的比較多的使用 redis 作為緩存。
這篇筆記主要內容如下:
- 依賴安裝
- settings.py 配置
- 緩存操作用法
- 緩存版本控制
- cache 用作 session backend
- 清除 redis 里全部數據
- 批量查詢與刪除
其中,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://:[email protected]: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/
如果想獲取更多後端相關文章,可掃碼關註閱讀: