Django緩存框架API

這里寫自定義目錄標題

  • 訪問緩存
    • django.core.cache.caches
    • django.core.cache.cache
  • 基本用法
    • cache.set(key, value, timeout=DEFAULT_TIMEOUT, version=None)
    • cache.get(key, default=None, version=None)
    • cache.add(key, value, timeout=DEFAULT_TIMEOUT, version=None)
    • cache.get_or_set(key, default, timeout=DEFAULT_TIMEOUT, version=None)
    • cache.get_many(keys, version=None)
    • cache.set_many(dict, timeout)
    • cache.delete(key, version=None)
    • cache.delete_many(keys, version=None)
    • cache.clear()
    • cache.touch(key, timeout=DEFAULT_TIMEOUT, version=None)
    • cache.incr/decr(key, delta=1, version=None)
    • cache.close()
  • 緩存前綴
  • 緩存版本控制
  • 緩存鍵轉換

有時,緩存整個渲染頁面并不會帶來太多好處,事實上,這樣會很不方便。比如站點包含一個視圖,它的結果依賴許多費時的查詢,而且結果會隨著時間變化而改變。在這個情況下,使用站點或視圖緩存策略提供的全頁面緩存并不理想,以為不能緩存所有結果(一些數據經常變動),不過仍然可以緩存幾乎沒有變化的結果。
像這樣的情況Django公開了一個底層的緩存API。可以使用這個API以任意級別顆粒度在緩存中存儲對象。可以緩存任何可以安全的pickle的Python對象:模型對象的字符串、字典、列表或其它(大部分通用的Python對象都可以被pickle)。

訪問緩存

django.core.cache.caches

可以通過類似字典一樣的object:django.core.cache.caches對象訪問在CACHES配置的緩存。重復請求同一個線程里的同一個別名將返回同一個對象。

from django.core.cache import caches
cache1 = caches["myalias"]
cache2 = caches["myalias"]
cache1 is cache2  # True

如果鍵名不存在,將會引發InvalidCacheBackendError錯誤。為了支持線程安全,將為每個線程返回緩存后端不同實例。

django.core.cache.cache

作為一種快捷方式,默認緩存可以通過django.core.cache.cache訪問:from django.core.cache import cache,這個對象等價于caches['default']

基本用法

cache.set(key, value, timeout=DEFAULT_TIMEOUT, version=None)

# 設置緩存
cache.set('my_key', 'hello, world!', 30)

key是一個字符串,value可以任何picklable形式的Python對象。
timeout參數是可選的,默認為CACHES中響應后端的timeout參數。它是值存在緩存里的秒數。timeout設置為None時將永久緩存。timeout為0將不緩存值。

cache.get(key, default=None, version=None)

cache.get('my_key')  # hello, world!

如果緩存中不存在該對象,cache.get()返回None:

# Wait 30 seconds for 'my_key' to expire...
cache.get("my_key")  # None

如果需要確定對象是否存在于緩存中,并且您已經存儲了字面值None,可以使用一個特殊的對象作為默認值:

sentinel = object()
cache.get("my_key", sentinel) is sentinel  # False
# Wait 30 seconds for 'my_key' to expire...
cache.get("my_key", sentinel) is sentinel  # True

cahce.get()可以接受一個default參數,用于指定在對象不存在于緩存中時返回的值:

cache.get("my_key", "has expired")  # 'has expired'

cache.add(key, value, timeout=DEFAULT_TIMEOUT, version=None)

如果只在健不存在時才添加鍵,可以使用add()方法。它接受與set()相同的參數,但如果指定的鍵已存在,它不會嘗試更新緩存:

cache.set("add_key", "Initial value")  # True
cache.add("add_key", "New value")  # False
cache.get("add_key")  # 'Initial value'

如果想知道通過add()存儲的值是否存在緩存中,你可以檢查返回值。如果值已保存,將返回True,否則返回False。

cache.get_or_set(key, default, timeout=DEFAULT_TIMEOUT, version=None)

如果要獲取鍵的值,或者如果鍵不再緩存中則設置一個值,可以使用get_or_set()方法。它接受與get()相同的參數,但默認值將作為該鍵的新緩存值設置,而不是返回值:

cache.get("my_new_key")  # returns None
cache.get_or_set("my_new_key", "my new value", 100)  # 'my new value'

還可以將任何可調用對象作為default值傳遞:

import datetime
cache.get_or_set("some-timestamp-key", datetime.datetime.now)  # datetime.datetime(2014, 12, 11, 0, 15, 49, 457920)

cache.get_many(keys, version=None)

get_many()只訪問緩存一次,返回一個字典,其中包含請求的實際存在于緩存中未過期的所有鍵:

cache.set("a", 1)
cache.set("b", 2)
cache.set("c", 3)
cache.get_many(["a", "b", "c"])  # {'a': 1, 'b': 2, 'c': 3}

cache.set_many(dict, timeout)

更高效地設置多個值,可以使用set_many()來傳遞一個鍵值對的字典:

cache.set_many({"a": 1, "b": 2, "c": 3})
cache.get_many(["a", "b", "c"])  # {'a': 1, 'b': 2, 'c': 3}

類似cache.set()set_many()帶有一個可選的timeout參數。在已支持的后端(memcached),set_many()會返回無法插入的鍵列表。

cache.delete(key, version=None)

delete()明確刪除鍵,以清除特定對象的緩存:

cache.delete("a")  # True

如果鍵被成功刪除,將返回True,否則返回False

cache.delete_many(keys, version=None)

如果想一次性清除一組鍵,可以使用delete_manay()方法,并傳入要清除的鍵列表:

cahce.delete_many(['a', 'b', 'c']])

cache.clear()

如果想刪除緩存中所有的鍵,可以使用cache.clear()。注意,clear()會從緩存中刪除所有內容,不僅僅是自己應用程序設置的鍵:

cache.touch(key, timeout=DEFAULT_TIMEOUT, version=None)

設置鍵的新過期時間,例如要將鍵更新為在10秒后過期:

cache.touch('a', 10)  # True

和其他方法一樣,timeout參數是可選的,并且默認是CACHES設置的響應后端的TIMEOUT選項。
如果鍵被成功touch(),將返回True,否則返回False。

cache.incr/decr(key, delta=1, version=None)

可以使用incr()或decr()方法來分別遞增或遞減已存在的鍵。默認情況下現有的緩存值將遞增或遞減1,通過在遞增、遞減調用中提供參數來指定其他遞增、遞減的值。如果嘗試遞增或遞減不存在的鍵,則會引發ValueError:

cache.set("num", 1)
cache.incr("num")  # 2
cache.incr("num", 10)  # 12cache.decr("num")  # 11
cache.decr("num", 5)  # 6

提示:不保證incr()decr()方法是原子的。那些后端支持原子遞增、遞減(最值得注意的時memecached后端),則遞增和遞減操作是原子的,然而如果后端本身沒有提供遞增、遞減方法,則將使用檢索和更新兩步來實現

cache.close()

如果緩存后端已經實現了close()方法,可以關閉緩存的連接。
對于沒有實現close方法的緩存,它將無效操作。

緩存前綴

如果正在服務器之間或者生產、開發緩存之間共享緩存實例,有可能會使得一個服務器使用另一個服務器的緩存數據。如果緩存數據格式是相同的,這會導致一些難以診斷的問題。
為了防止這個問題,Django為單臺服務器提供了為素有緩存鍵提供前綴的方法。當一個特殊的緩存鍵被保存或檢索時,Django會為緩存自動添加KEY_PREFIX緩存設置的前綴。
要確保每個Django實例有不同的KEY_PREFIX,這樣就保證緩存值不會發生沖突。
KEY_PREFIX默認’'(空字符串)。

緩存版本控制

當更改使用緩存值的運行代碼時,可能需要清除任何已存在的緩存值。最簡單方法是刷新整個緩存,但這會導致那些仍然有用且有效的緩存值。
Django提供更好的方式來指向單個緩存值。Django緩存框架有一個系統范圍的版本標識,需要在VERSION緩存配置中指定,這個配置的值將自動與緩存前綴和用戶提供的緩存鍵組合起來獲得最終的緩存鍵。
默認情況下,任何鍵請求都會自動包含站點默認的緩存版本,但是原始緩存函數都包含一個version參數,因此可以指定要設置或獲取的特定緩存鍵版本,例如:

# Set version 2 of a cache key
cache.set("my_key", "hello world!", version=2)
# Get the default version (assuming version=1)
cache.get("my_key")  # None
# Get version 2 of the same key
cache.get("my_key", version=2)  # 'hello world!'

可以使用incr_version()decr_version()方法遞增和遞減特定鍵的版本。這使得將特定鍵提示到新版本,而不影響其他鍵。繼續之前的示例:

# Increment the version of 'my_key'
cache.incr_version("my_key")
# The default version still isn't available
cache.get("my_key")  # None
# Version 2 isn't available, either
cache.get("my_key", version=2)  # None
# But version 3 *is* available
cache.get("my_key", version=3)  # 'hello world!'

緩存鍵轉換

用戶提供的緩存鍵不是單獨使用的,它是與緩存前綴、鍵版本組合后獲取最終緩存鍵。默認情況下,使用冒號連接這三部分生成最終的字符串:

def make_key(key, key_prefix, version):return "%s:%s:%s" % (key_prefix, version, key)

如果想用不同方式組合,或者應用其他處理來獲得最終的鍵(比如,獲得關鍵部分的哈希摘要),那么可以提供一個自定義鍵函數。
KEY_FUNCATION緩存設置指定一個與上面的make_key()原型匹配的函數路徑。如果提供,這個自定義鍵函數將替代默認的鍵組合函數來使用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80264.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux系統管理與編程17:自動化部署ftp服務

蘭生幽谷,不為莫服而不芳; 君子行義,不為莫知而止休。 #virtual用戶管理:passerbyA、captain和admin三個虛擬用戶 # passerbyA只能看,captain可看讀寫上傳,但不能刪除。admin全部權限 [rootshell shell]…

2025python學習筆記

一.Python語言基礎入門 第一章 01.初識Python Python的起源: 1989年,為了打發圣誕節假期,Gudio van Rossum吉多范羅蘇姆(龜叔)決心開發一個新的解釋程序(Python維形)1991年,第一個…

STM32單片機的快速成長路徑規劃

一、基礎準備階段(1-2周) C語言核心技能 重點掌握:指針操作、結構體、枚舉、位操作、函數指針(回調函數基礎)實踐項目:通過51單片機或STM8完成LED控制、按鍵檢測等基礎項目,熟悉寄存器配置和調試…

torch.nn.init.uniform_

nn.init.uniform_ 是 PyTorch 中用于初始化張量(tensor)的一個函數,它的作用是將張量的值填充為從均勻分布中采樣的隨機數。 詳細說明: 函數: torch.nn.init.uniform_(tensor, a0., b1.)tensor:需要被初始…

Spring MVC中跨域問題處理

在Spring MVC中處理跨域問題可以通過以下幾種方式實現,確保前后端能夠正常通信: 方法一:使用 CrossOrigin 注解 適用于局部控制跨域配置,直接在Controller或方法上添加注解。 示例代碼: RestController CrossOrigin…

基本句子結構

以下是英語句子五種基本結構的詳細解釋,并附上系動詞的全面分類及示例: ?1. 主謂結構(SV)? ?結構:主語(Subject) 不及物動詞(Intransitive Verb)?核心:…

游戲引擎學習第264天:將按鈕添加到分析器

回顧并為今天的工作做鋪墊 隨著時間的推移,我們的分析器(profiler)變得越來越強大。我通常會問大家是否記得我們要做什么,今天我們要做的似乎是按鈕相關的功能。 今天的目標是實現按鈕功能。我們從昨天留下的地方繼續&#xff0…

大節點是選擇自建機房還是托管機房

選擇PCDN大節點自建機房還是托管機房,需綜合考量資金實力、技術能力、運維需求、業務規模及合規要求。以下為具體分析: 自建機房的適用場景與考量因素 資金與技術門檻高 自建機房需投入服務器、存儲、網絡設備等硬件,以及機房建設、電力、散…

【SpringBoot】SpringBoot中使用AOP實現日志記錄功能

前言一、AOP基本概念二、項目準備三、實現日志記錄切面1、創建自定義日志注解2、實現日志切面3、配置AOP 四、使用示例1. 在Controller中使用2. 在Service中使用 六、高級配置1. 日志內容格式化2. 異步日志記錄3. 日志脫敏處理 七、代理類生成的核心邏輯問題1: 既然…

linux中的常用命令(一)

目錄 常用的快捷鍵 1- tab鍵:命令或者路徑提示及補全; 2-ctrlc:放棄當前輸入,終止當前任務或程序 3-ctrll;清屏 4-ctrlinsert:復制 5-鼠標右鍵:粘貼; 6-altc:斷開連接/ctrlshift r 重新連接 7-alt1/2/3/等:切換回話窗口 8-上下鍵…

Pycharm(十九)深度學習

一、深度學習概述 1.1 什么是深度學習 深度學習是機器學習中的一種特殊方法,它使用稱為神經網絡的復雜結構,特別是“深層”的神經網絡,來學習和做出預測。深度學習特別適合處理大規模和高維度的數據,如圖像、聲音和文本。深度學習、機器學習和人工智能之間的關系如下圖所…

多視圖密集對應學習:細粒度3D分割的自監督革命

原文標題:Multi-view Dense Correspondence Learning (MvDeCor) 引言 在計算機視覺與圖形學領域,3D形狀分割一直是一個基礎且具有挑戰性的任務。如何在標注稀缺的情況下,實現對3D模型的細粒度分割?近期,斯坦福大學視覺…

Vue——前端vue3項目使用漢字轉拼音

在 Vue3 項目中,可以通過以下 第三方 JavaScript 包 實現漢字轉拼音。這些包均兼容 Vue3,且無需依賴后端處理: 推薦方案 1. pinyin-pro 特點:功能強大、支持多音字、聲調、拼音匹配、輕量級(~20KB)。安裝…

批量統計PDF頁數,統計圖像屬性

軟件介紹: 1、支持批量統計PDF、doc\docx、xls\xlsx頁數 2、支持統計指定格式文件數量(不填格式就是全部) 3、支持統計JPG、JPEG、PNG圖像屬性 4、支持統計多頁TIF頁數、屬性 5、支持統計PDF、JPG畫幅 統計圖像屬性 「托馬斯的文件助手」…

LeetCode 每日一題 2025/5/5-2025/5/11

記錄了初步解題思路 以及本地實現代碼;并不一定為最優 也希望大家能一起探討 一起進步 目錄 5/5 790. 多米諾和托米諾平鋪5/6 1920. 基于排列構建數組5/7 3341. 到達最后一個房間的最少時間 I5/8 3342. 到達最后一個房間的最少時間 II5/9 3343. 統計平衡排列的數目5…

pytest自動化測試執行環境切換的兩種解決方案

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快 一、痛點分析 在實際企業的項目中,自動化測試的代碼往往需要在不同的環境中進行切換,比如多套測試環境、預上線環境、UAT環境、線上環…

visual studio 2015 安裝閃退問題

參考鏈接: VS2012安裝時啟動界面一閃而過問題解決辦法 visual studio 2015 安裝閃退問題

RocketMQ Kafka區別

架構 ZooKeeper:管理 Broker 注冊、分區 Leader 選舉及消費者組狀態。Broker:存儲 Partition數據,每個 Partition 為獨立日志文件。Producer/Consumer:通過 ZooKeeper獲取路由信息,實現消息分發與消費。 NameServer&am…

MySQL進階篇2_SQL優化、鎖

文章目錄 1 SQL優化1.1插入數據優化1.2主鍵優化頁分裂頁合并主鍵設計原則 1.3order by設計優化1.4group by設計優化小理解 1.5limit設計優化順序IO和隨機IO小疑惑 1.6count設計優化1.7update優化關于隱式事務事務的DML操作 鎖全局鎖表級鎖表鎖元數據鎖意向鎖 行級鎖鎖的釋放條件…

如何測試 esp-webrtc-solution_solutions_doorbell_demo 例程?

軟件準備 esp-webrtc-solution/solutions/doorbell_demo 例程 此例程集成了 WebSocket 傳輸視頻流的應用 硬件準備 ESP32P4-Function-Ev-Board 環境搭建 推薦基于 esp-idf v5.4.1 版本的環境來編譯此例程 若編譯時出現依賴的組件報錯,可進行如下修改&#xff…