解讀Django框架中的低層次緩存API
有些時候,對整個經(jīng)解析的頁面進行緩存并不會給你帶來太多好處,事實上可能會過猶不及。
比如說,也許你的站點所包含的一個視圖依賴幾個費時的查詢,每隔一段時間結(jié)果就會發(fā)生變化。 在這種情況下,使用站點級緩存或者視圖級緩存策略所提供的整頁緩存并不是最理想的,因為你可能不會想對整個結(jié)果進行緩存(因為一些數(shù)據(jù)經(jīng)常變化),但你仍然會想對很少變化的部分進行緩存。
針對這樣的情況,Django提供了簡單低級的緩存API。 你可以通過這個API,以任何你需要的粒度來緩存對象。 你可以對所有能夠安全進行 pickle 處理的 Python 對象進行緩存: 字符串、字典和模型對象列表等等。 (查閱 Python 文檔可以了解到更多關(guān)于 pickling 的信息。)
緩存模塊django.core.cache擁有一個自動依據(jù)CACHE_BACKEND設(shè)置創(chuàng)建的django.core.cache對象。
>>> from django.core.cache import cache
基本的接口是 set(key, value, timeout_seconds) 和 get(key) :
>>> cache.set('my_key', 'hello, world!', 30)
>>> cache.get('my_key')
'hello, world!'
timeout_seconds 參數(shù)是可選的, 并且默認為前面講過的 CACHE_BACKEND 設(shè)置中的 timeout 參數(shù).
如果緩存中不存在該對象,那么cache.get()會返回None。
# Wait 30 seconds for 'my_key' to expire...
>>> cache.get('my_key')
None
我們不建議在緩存中保存 None 常量,因為你將無法區(qū)分你保存的 None 變量及由返回值 None 所標識的緩存未命中。
cache.get() 接受一個 缺省 參數(shù)。 它指定了當緩存中不存在該對象時所返回的值:
>>> cache.get('my_key', 'has expired')
'has expired'
使用add()方法來新增一個原來沒有的鍵值。 它接受的參數(shù)和set()一樣,但是并不去嘗試更新已經(jīng)存在的鍵值。
>>> cache.set('add_key', 'Initial value')
>>> cache.add('add_key', 'New value')
>>> cache.get('add_key')
'Initial value'
如果想確定add()是否成功添加了緩存值,你應該測試返回值。 成功返回True,失敗返回False。
還有個get_many()接口。 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.delete() 顯式地刪除關(guān)鍵字。
>>> cache.delete('a')
也可以使用incr()或者decr()來增加或者減少已經(jīng)存在的鍵值。 默認情況下,增加或減少的值是1??梢杂脜?shù)來制定其他值。 如果嘗試增減不存在的鍵值會拋出ValueError。
>>> cache.set('num', 1)
>>> cache.incr('num')
2
>>> cache.incr('num', 10)
12
>>> cache.decr('num')
11
>>> cache.decr('num', 5)
6
注意
incr()/decr()方法不是原子操作。 在支持原子增減的緩存后端上(最著名的是memcached),增減操作才是原子的。 然而,如果后端并不原生支持增減操作,也可以通過取值/更新兩步操作來實現(xiàn)。
相關(guān)文章
使用Python爬取Json數(shù)據(jù)的示例代碼
這篇文章主要介紹了使用Python爬取Json數(shù)據(jù)的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
多個python文件調(diào)用logging模塊報錯誤
這篇文章主要介紹了多個python文件調(diào)用logging模塊產(chǎn)生錯誤,需要的朋友可以參考下2020-02-02
Python使用PyPDF2和ReportLab操作PDF文件的詳細指南
在日常工作和項目中,PDF 文件處理是個常見需求,不論是合并報告、加密文檔、填充表單,還是生成發(fā)票,Python 中有許多用于操作 PDF 文件的庫,其中 PyPDF2 和 ReportLab 是兩個廣泛使用的工具,本文給大家介紹了Python使用PyPDF2和ReportLab操作PDF文件的詳細指南2025-01-01
Python使用wget實現(xiàn)下載網(wǎng)絡(luò)文件功能示例
這篇文章主要介紹了Python使用wget實現(xiàn)下載網(wǎng)絡(luò)文件功能,簡單介紹了wget安裝以及Python使用wget下載tar格式網(wǎng)絡(luò)文件并進行解壓處理相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
Python+streamlit實現(xiàn)輕松創(chuàng)建人事系統(tǒng)
streamlit 是 基于 Python 的一個非常強大的 web 構(gòu)建系統(tǒng),通過該類庫,我們可以實現(xiàn)不需要編寫一行前端代碼而構(gòu)建一個完整的 Web 應用。下面我們就來編寫一個簡單的人事系統(tǒng)吧2023-02-02

