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.mzph.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 模块的内置…

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同…

爬虫逆向实战(十八)--某得科技登录

一、数据接口分析 主页地址:某得科技 1、抓包 通过抓包可以发现数据接口是AjaxLogin 2、判断是否有加密参数 请求参数是否加密? 查看“载荷”模块可以发现有一个password加密参数和一个__RequestVerificationToken 请求头是否加密? 无…