Django筆記三十三之緩存操作

来源:https://www.cnblogs.com/hunterxiong/archive/2023/04/29/17364424.html
-Advertisement-
Play Games

本文首發於公眾號:Hunter後端 原文鏈接:Django筆記三十三之緩存操作 這一節介紹一下如何在 Django 中使用 redis 做緩存操作。 在 Django 中可以有很多種方式做緩存,比如資料庫,比如伺服器文件,或者記憶體,這裡介紹用的比較多的使用 redis 作為緩存。 這篇筆記主要內容如 ...


本文首發於公眾號: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://:[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/

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • .Net Core在調用其他服務時,調用通常使用HttpClient,而HttpClient預設使用HTTP/1.1 。 配置 HttpClient 以使用 HTTP/2 h2 連接 自 .NET Core 3.0 發佈以來, .NET 開發人員可以使用 HttpClient 啟用 HTTP/2 。 ...
  • 本文為大家介紹使用 .NET Core部署到Linux伺服器的方法,通過本文你將瞭解到Linux在虛擬機下的安裝、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的發佈與運行全過程,本文皆在總結了一些經驗與筆記在部署過程中遇到的一些問題,同時分享給... ...
  • 最近在開發用的台式機上啟用了 Windows 的 Hyper-V 虛擬化功能,利用虛擬機運行了一臺 Windows Server 2022 和 一臺 Ubuntu Server,為了方便別的機器直接訪問這兩台虛擬機,所以網路採用了外部網路橋接的模式,讓虛擬機和物理機保持在了同一網段。 為了實現在這一 ...
  • ==資料庫==1、創建資料庫create database [IF NOT EXISTS] 資料庫名; 2、刪除資料庫drop database [IF EXISTS] 資料庫名; 3、切換資料庫select database(); 4、查詢資料庫show databases; —————————— ...
  • 1、四層結構 viewer --> datasources(DataSourceCollection類型) --> datasource --> entities(EntityCollection類型) --> entity 需要學習的方向是:只需要註意每個層與層之間的關係和entity實例如何創建 ...
  • 簡介 模板方法模式(Template Method Pattern)也叫模板模式,是一種行為型模式。它定義了一個抽象公開類,包含基本的演算法骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變演算法的結構,只是重定義該演算法的某些特定步驟。不同的子類以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不 ...
  • 轉載請註明 來源:http://www.eword.name/ Author:eword Email:[email protected] 安裝Python 一、查詢是否安裝了Python及安裝路徑 #查看當前Python版本 python --version Python 2.7.16 #查看當前所有 ...
  • B/S結構系統的會話機制(session) 每博一文案 你跑得快,22歲有個家,身邊全是贊嘆,你跑得慢,30歲還在路上追求夢想。有的人為了車,房拼了一輩子, 有的人買輛摩托車走遍了大好江山。你想成為怎樣的人,過怎樣的生活,只要你不後悔就行。 並不是所有人都能在早上七點鐘起床的,也別拿一碗飯來衡量一個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...