DRF 緩存

應用環境 django4.2.3 ,python3.10?

由于對于服務而言,有些數據查詢起來比較費時,所以,對于有些數據,我們需要將其緩存。

最近做了一個服務,用的時 DRF 的架構,剛好涉及緩存,特此記錄。

DRF的緩存,和django自帶的緩存有個比較大的區別:django自帶的緩存,一旦將數據緩存,那么數據源一旦發生變化,那么我們從緩存中取到的內容,就是老的內容,并不是最新的內容。但是? DRF 的緩存,卻是會自動更新的,比如,已經緩存了數據庫的一些數據,這時,數據庫的這些數據被更新了,那么,DRF 也將會對已經緩存了的數據自動進行更新。

然后,看下大致的用法:

先下載包:

pip3?install drf-extensions
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from machines.models import Repository
from rest_framework_extensions.cache.decorators import cache_response
from machines.api.serializers import RepositorySerializersclass RepoInfoViewSet(GenericAPIView):queryset = Repository.objects.all()serializer_class = RepositorySerializersdef _get_repositories(self, state, servicename, service_port):base = Repository.objectsreturn Response(self.get_serializer(instance=base.all(),many=True).data)@staticmethoddef set_cache_key(request, *args, **kwargs):return request.path@cache_response(timeout=300, cache='default', key_func='set_cache_key')def get(self, request, state=None, servicename=None, service_port=None):return self._get_repositories(state, servicename, service_port)

大概說下,cache_response 方法就可以直接搞緩存,它里面那幾個參數,

timeout:指緩存的過期時間。

cache:指在要用的緩存對象,它的值,就是在 settings.py 中 CACHES 參數中的配置的 key。

key_func:這里涉及一個問題,通常情況下,緩存的時候都是這么干的:cache.set("key", "value", 60) , 就是說,緩存對象,存一個key,以及要緩存的內容value,和緩存的過期時間。那么,一般來說,這個key,是不需要我們直接提供的,django會自動分配一個獨一無二的key給它,在 DRF中,用的是這個對象:

?它將為要緩存的對象,構建一個獨一無二的key,之所以介紹這么一個東西,是因為,這個key,將涉及清除緩存的問題,如果是清除所有緩存,那就無所謂,不存在問題,直接 clear() 完事,但是如果涉及定點清除,那么問題就來了,我們根本就不知道我們要清除的數據它的key是多少,那么就沒法清除具體的某個緩存了。所以,這個時候,就需要用到 key_func 這個參數,我們需要構建一個制作key的函數,讓其返回一個字符串,來成為我們要緩存對象的key,這樣以來,我們就知道了緩存對象的key,后續如果需要清除掉這個緩存就可以直接 cache.delete(key) 來清除它了。

我的這個示例中自己構造了set_cache_key函數來制作我需要的緩存key,它的執行結果是這樣的:

先訪問一次服務,讓其產生緩存

?然后,訪問清除緩存動作:

對了,補充一句,這塊用的cache是從這來的:from django.core.cache import cache

可以看到,緩存對象的 key 確實就是我自己定義的 request.path。

當然,我這里用的依舊是cache.clear(),因為我這里的業務邏輯,只有一處緩存,那么清除的話,一把全清也不影響,但是,如果客戶要求清除某些特定的緩存的話那就可以使用 cache.delete()方法了,比如:

連著弄兩次,第二次就會出問題,因為第一次就已經刪除了key,自然就沒有這個緩存了,再刪就會失敗。

另外,看一個文件緩存的配置:

CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache','LOCATION': '/tmp/django_cache','TIMEOUT': 60,'OPTIONS': {'MAX_ENTRIES': 1000}}
}

settings.py中可以有其他的緩存配置,比如使用redis....

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

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

相關文章

webSocket 筆記

1 認識webSocket WebSocket_ohana!的博客-CSDN博客 一,什么是websocket WebSocket是HTML5下一種新的協議(websocket協議本質上是一個基于tcp的協議)它實現了瀏覽器與服務器全雙工通信,能更好的節省服務器資源和帶寬…

centos 7.9 部署django項目

1、部署框架 主要組件:nginx、uwsgi、django項目 訪問頁面流程:nginx---》uwsgi---》django---》uwsgi---》nginx 2、部署過程 操作系統:centos 7.9 配置信息:4核4G 50G 內網 eip :10.241.103.216 部署過程&…

深入學習SpringCloud Alibaba微服務架構,揭秘Nacos、Sentinel、Seata等核心技術,助力構建高效系統!

課程鏈接: 鏈接: https://pan.baidu.com/s/1hRN0R8VFcwjyCTWCEsz-8Q?pwdj6ej 提取碼: j6ej 復制這段內容后打開百度網盤手機App,操作更方便哦 --來自百度網盤超級會員v4的分享 課程介紹: 📚【第01階段】課程簡介:全…

Android FrameWork 層 Handler源碼解析

Handler生產者-消費者模型 在android開發中,經常會在子線程中進行一些耗時操作,當操作完畢后會通過handler發送一些數據給主線程,通知主線程做相應的操作。 其中:子線程、handler、主線程,其實構成了線程模型中經典的…

STM32存儲左右互搏 I2C總線FATS讀寫EEPROM ZD24C1MA

STM32存儲左右互搏 I2C總線FATS讀寫EEPROM ZD24C1MA 在較低容量存儲領域,EEPROM是常用的存儲介質,可以通過直接或者文件操作方式進行讀寫。不同容量的EEPROM的地址對應位數不同,在發送字節的格式上有所區別。EEPROM是非快速訪問存儲&#xf…

vue2+Spring Boot2.7 大文件分片上傳

之前我們文章 手把手帶大家實現 vue2Spring Boot2.7 文件上傳功能 將了上傳文件 但如果文件很大 就不太好處理了 按正常情況甚至因為超量而報錯 這里 我弄了個足夠大的文件 我們先搭建 Spring Boot2.7 環境 首先 application.yml 代碼編寫如下 server:port: 80 upload:path:…

【佳佳怪文獻分享】使用點云從半監督到全監督房間布局估計

標題:From Semi-supervised to Omni-supervised Room Layout Estimation Using Point Cloud 作者:Huan-ang Gao, Beiwen Tian, Pengfei Li, Xiaoxue Chen, Hao Zhao, Guyue Zhou , Yurong Chen and Hongbin Zha 來源:2023 IEEE Internation…

根據源碼,模擬實現 RabbitMQ - 通過 SQLite + MyBatis 設計數據庫(2)

目錄 一、數據庫設計 1.1、數據庫選擇 1.2、環境配置 1.3、建庫建表接口實現 1.4、封裝數據庫操作 1.5、針對 DataBaseManager 進行單元測試 一、數據庫設計 1.1、數據庫選擇 MySQL 是我們最熟悉的數據庫,但是這里我們選擇使用 SQLite,原因如下&am…

手機出現 不讀卡 / 無信號時應該怎么辦?

當手機屏幕亮起,一般在屏幕最上方都會有代表手機卡狀態的顯示,其中網絡信號和讀卡狀態的標識,依舊有很多人分不太清,更不清楚改怎么辦了。 1、當我們的手機里有兩張卡時,則會有兩個信號顯示 2、信號狀態一般是由短到…

CSS自己實現一個步驟條

前言 步驟條是一種用于引導用戶按照特定流程完成任務的導航條,在各種分步表單交互場景中廣泛應用。例如:在HIS系統-門診醫生站中的接診場景中,我們就可以使用步驟條來實現。她的執行步驟分別是:門診病歷>遺囑錄入>完成接診…

ArcGIS Pro基礎入門、制圖、空間分析、影像分析、三維建模、空間統計分析與建模、python融合、案例全流程科研能力提升

目錄 第一章 入門篇 GIS理論及ArcGIS Pro基礎 第二章 基礎篇 ArcGIS數據管理與轉換 第三章 數據編輯與查詢、拓撲檢查 第四章 制圖篇 地圖符號與版面設計 第五章 空間分析篇 ArcGIS矢量空間分析及應用 第六章 ArcGIS柵格空間分析及應用 第七章 影像篇 遙感影像處理 第八…

Python random模塊用法整理

隨機數在計算機科學領域扮演著重要的角色,用于模擬真實世界的隨機性、數據生成、密碼學等多個領域。Python 中的 random 模塊提供了豐富的隨機數生成功能,本文整理了 random 模塊的使用。 文章目錄 Python random 模塊注意事項Python random 模塊的內置…

大語言模型控制生成的過程Trick:自定義LogitsProcessor實踐

前言 在大模型的生成過程中,部分原生的大語言模型未經過特殊的對齊訓練,往往會“胡說八道”的生成一些敏感詞語等用戶不想生成的詞語,最簡單粗暴的方式就是在大模型生成的文本之后,添加敏感詞庫等規則手段進行敏感詞過濾&#xf…

30行JS代碼帶你手寫自動回復語音聊天機器人

🥂(???)您的點贊👍?評論📝?收藏?是作者創作的最大動力🤞 前言 現如今生活中到處都是聊天機器人的身影,聊天機器人不僅僅能減少人工的聊天壓力,而且十分的可愛有趣,安卓系統的小AI&#xf…

Springboot整合Mybatis調用Oracle存儲過程

1、配置說明 Oracel11g+springboot2.7.14+mybatis3.5.13 目標:springboot整合mybatis訪問oracle中的存儲過程,存儲過程返回游標信息。 mybatis調用oracle中的存儲過程方式 2、工程結構 3、具體實現 3.1、在Oracle中創建測試數據庫表 具體數據可自行添加 create table s…

Lodash——使用與實例

1. 簡介 Lodash是一個一致性、模塊化、高性能的JavaScript實用庫。Lodash通過降低array、number、objects、string等等的使用難度從而讓JavaScript變得簡單。Lodash的模塊方法,非常適用于: 遍歷array、object 和 string對值進行操作和檢測創建符合功能的…

字符個數統計(同類型只統計一次)

思路:因為題目圈定出現的字符都是 ascii 值小于等于127的字符,因此只需要定義一個標記數組大小為128 ,然后將字符作為數組下標在數組中進行標記,若數組中沒有標記過表示第一次出現,進行計數,否則表示重復字…

簡單線性回歸:預測事物間簡單關系的利器

文章目錄 🍀簡介🍀什么是簡單線性回歸?🍀簡單線性回歸的應用場景使用步驟:注意事項: 🍀代碼演示🍀結論 🍀簡介 在數據科學領域,線性回歸是一種基本而強大的統…

Kali Linux助您網絡安全攻防實戰

Kali Linux:黑客與防御者的神器 Kali Linux是一款專為網絡安全測試和攻防實踐而設計的操作系統。它匯集了大量的安全工具,可以用于滲透測試、漏洞掃描、密碼破解等任務,不僅為黑客提供了強大的攻擊能力,也為安全防御者提供了測試和…

Kafka 入門到起飛 - 什么是 HW 和 LEO?何時更新HW和LEO呢?

上文我們已經學到, 一個Topic(主題)會有多個Partition(分區)為了保證高可用,每個分區有多個Replication(副本)副本分為Leader 和 Follower 兩個角色,Follower 從Leader同…