解讀Django框架中的低層次緩存API
有些時(shí)候,對(duì)整個(gè)經(jīng)解析的頁面進(jìn)行緩存并不會(huì)給你帶來太多好處,事實(shí)上可能會(huì)過猶不及。
比如說,也許你的站點(diǎn)所包含的一個(gè)視圖依賴幾個(gè)費(fèi)時(shí)的查詢,每隔一段時(shí)間結(jié)果就會(huì)發(fā)生變化。 在這種情況下,使用站點(diǎn)級(jí)緩存或者視圖級(jí)緩存策略所提供的整頁緩存并不是最理想的,因?yàn)槟憧赡懿粫?huì)想對(duì)整個(gè)結(jié)果進(jìn)行緩存(因?yàn)橐恍?shù)據(jù)經(jīng)常變化),但你仍然會(huì)想對(duì)很少變化的部分進(jìn)行緩存。
針對(duì)這樣的情況,Django提供了簡單低級(jí)的緩存API。 你可以通過這個(gè)API,以任何你需要的粒度來緩存對(duì)象。 你可以對(duì)所有能夠安全進(jìn)行 pickle 處理的 Python 對(duì)象進(jìn)行緩存: 字符串、字典和模型對(duì)象列表等等。 (查閱 Python 文檔可以了解到更多關(guān)于 pickling 的信息。)
緩存模塊django.core.cache擁有一個(gè)自動(dòng)依據(jù)CACHE_BACKEND設(shè)置創(chuàng)建的django.core.cache對(duì)象。
>>> 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ù)是可選的, 并且默認(rèn)為前面講過的 CACHE_BACKEND 設(shè)置中的 timeout 參數(shù).
如果緩存中不存在該對(duì)象,那么cache.get()會(huì)返回None。
# Wait 30 seconds for 'my_key' to expire... >>> cache.get('my_key') None
我們不建議在緩存中保存 None 常量,因?yàn)槟銓o法區(qū)分你保存的 None 變量及由返回值 None 所標(biāo)識(shí)的緩存未命中。
cache.get() 接受一個(gè) 缺省 參數(shù)。 它指定了當(dāng)緩存中不存在該對(duì)象時(shí)所返回的值:
>>> cache.get('my_key', 'has expired') 'has expired'
使用add()方法來新增一個(gè)原來沒有的鍵值。 它接受的參數(shù)和set()一樣,但是并不去嘗試更新已經(jīng)存在的鍵值。
>>> cache.set('add_key', 'Initial value') >>> cache.add('add_key', 'New value') >>> cache.get('add_key') 'Initial value'
如果想確定add()是否成功添加了緩存值,你應(yīng)該測試返回值。 成功返回True,失敗返回False。
還有個(gè)get_many()接口。 get_many() 所返回的字典包括了你所請(qǐng)求的存在于緩存中且未超時(shí)的所有鍵值。
>>> 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)存在的鍵值。 默認(rèn)情況下,增加或減少的值是1??梢杂脜?shù)來制定其他值。 如果嘗試增減不存在的鍵值會(huì)拋出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),增減操作才是原子的。 然而,如果后端并不原生支持增減操作,也可以通過取值/更新兩步操作來實(shí)現(xiàn)。
相關(guān)文章
Python編程之event對(duì)象的用法實(shí)例分析
這篇文章主要介紹了Python編程之event對(duì)象的用法,結(jié)合實(shí)例形式分析了event對(duì)象在線程通信中的作用與使用方法,需要的朋友可以參考下2017-03-03Python3實(shí)現(xiàn)抓取javascript動(dòng)態(tài)生成的html網(wǎng)頁功能示例
這篇文章主要介紹了Python3實(shí)現(xiàn)抓取javascript動(dòng)態(tài)生成的html網(wǎng)頁功能,結(jié)合實(shí)例形式分析了Python3使用selenium庫針對(duì)javascript動(dòng)態(tài)生成的HTML網(wǎng)頁元素進(jìn)行抓取的相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Python高級(jí)架構(gòu)模式知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于Python高級(jí)架構(gòu)模式知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)參考下。2021-08-08在NumPy中創(chuàng)建空數(shù)組/矩陣的方法
今天小編就為大家分享一篇在NumPy中創(chuàng)建空數(shù)組/矩陣的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06Python?異步之如何獲取當(dāng)前和正在運(yùn)行任務(wù)詳解
這篇文章主要為大家介紹了Python?異步之如何獲取當(dāng)前和正在運(yùn)行任務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03