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.hqwc.cn/news/69938.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瓴羊发布All in One 产品,零售SaaS的尽头是DaaS?

“打破烟囱、化繁为简,让丰富的能力、数据和智能All in One”,这是瓴羊新发布的产品瓴羊One承担的使命,也意味着瓴羊DaaS事业迈入了一个新阶段。 成立伊始,瓴羊就打出了“Not SaaS,But DaaS”旗号,将自己的…

《论文阅读14》FAST-LIO

一、论文 研究领域:激光雷达惯性测距框架论文:FAST-LIO: A Fast, Robust LiDAR-inertial Odometry Package by Tightly-Coupled Iterated Kalman Filter IEEE Robotics and Automation Letters, 2021 香港大学火星实验室 论文链接论文github 二、论文概…

vue组件封装——类似bootstraptable的模糊搜索功能,支持语音搜索

插件地址 懒得写了,直接上插件地址去看吧

Hyperledger Fabric的使用及开发

Hyperledger Fabric是Linux基金会发起的一种跨行业的区块链技术,目前在多家大型公司有着应用,这里就不多做HF本身的介绍了,有兴趣可关注其官网。 1. 准备工作: 开始前需要一定的准备工作,安装各类中间件:…

安防监控视频云存储平台EasyCVRH.265转码功能更新:新增分辨率配置

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求,让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上,视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

Ruby软件外包开发语言特点

Ruby 是一种动态、开放源代码的编程语言,它注重简洁性和开发人员的幸福感。在许多方面都具有优点,但由于其动态类型和解释执行的特性,它可能不适合某些对性能和类型安全性要求较高的场景。下面和大家分享 Ruby 语言的一些主要特点以及适用的场…

澎峰科技|邀您关注2023 RISC-V中国峰会!

峰会概览 2023 RISC-V中国峰会(RISC-V Summit China 2023)将于8月23日至25日在北京香格里拉饭店举行。本届峰会将以“RISC-V生态共建”为主题,结合当下全球新形势,把握全球新时机,呈现RISC-V全球新观点、新趋势。 本…

《安富莱嵌入式周报》第320期:键盘敲击声解码, 军工级boot设计,开源CNC运动控制器,C语言设计笔记,开源GPS车辆跟踪器,一键生成RTOS任务链表

周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1Cr4y1d7Mp/ 《安富莱嵌入式周报》第320期:键盘敲击…

解析错误:‘import‘和‘export‘可能只出现在顶层

1、import引入文件时,提示Parsing error: ‘import’ and ‘export’ may only appear at the top leveleslint 中文含义:解析错误:import和export可能只出现在顶层,如下提示: 2、下载包npm i babel/eslint-parser -D 在此配置中…

Java调用https接口添加证书

使用InstallCert.Java生成证书 /** Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions* are met:** - Redistri…

windows安装go,以及配置工作区,配置vscode开发环境

下载安装go 我安装在D:\go路径下配置环境变量 添加GOROOT value为D:\go修改path 添加%GOROOT%\bin添加GOPATH value为%USERPROFILE%\go 其中GOPATH 是我们自己开发的工作区,其中包含三个folder bin,pkg,以及src,其中src为我们编写代码的位置 配置vscod…

Vue3实现图片懒加载及自定义懒加载指令

Vue3实现图片懒加载及自定义懒加载指令 前言1.使用vue3-lazyload插件2.自定义v-lazy懒加载指令2.1 使用VueUse2.2 使用IntersectionObserver 前言 图片懒加载是一种常见性能优化的方式,它只去加载可视区域图片,而不是在网页加载完毕后就立即加载所有图片…