DRF 缓存

2023-10-26

应用环境 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 RepositorySerializers


class RepoInfoViewSet(GenericAPIView):
    queryset = Repository.objects.all()
    serializer_class = RepositorySerializers

    def _get_repositories(self, state, servicename, service_port):
       
        base = Repository.objects
        return Response(self.get_serializer(instance=base.all(),many=True).data)

    @staticmethod
    def 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....

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DRF 缓存 的相关文章

  • Redis五大数据类型使用——String

    1 String 字符串 添加 查询 追加 获取长度 判断是否存在的操作 C Users 12559 gt redis cli exe 启动redis 127 0 0 1 6379 gt set name kobe 插入一个key为 nam
  • 【Redis】分布式锁

    Redis分布式锁 问题描述 随着业务发展的需要 原单体单机部署的系统被演化成分布式集群系统后 由于分布式系统多线程 多进程并且分布在不同机器上 这将使原单机部署情况下的并发控制锁策略失效 单纯的Java API并不能提供分布式锁的能力 为
  • actuator--基础--04--Springboot集成

    actuator 基础 04 Springboot集成 代码位置 https gitee com DanShenGuiZu learnDemo tree master actuator learn actuator01 1 代码 1 1 依
  • 浏览器缓存机制及其分类

    聚沙成塔 每天进步一点点 专栏简介 强缓存 Cache Control 和 Expires 协商缓存 ETag 和 Last Modified 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦
  • 实战:实现缓存和数据库一致性方案

    原创 微信公众号 阿Q说代码 欢迎分享 转载请保留出处 哈喽大家好 我是阿Q 最近不是正好在研究 canal 嘛 刚巧前两天看了一篇关于解决缓存与数据库一致性问题的文章 里边提到了一种解决方案是结合 canal 来操作的 所以阿Q就想趁热打
  • Redis实战篇一 (短信登录)

    Redis企业实战 黑马点评 项目整体架构 项目部署 后端部署 前端部署 短信登陆 基于Session实现登录 集群的Session共享问题 基于Redis实现共享session登录 解决状态登录刷新的问题 登录拦截器的优化 本期学习路线
  • redis缓存击穿、缓存穿透、缓存雪崩、缓存一致性解决方案的代码实现

    1 0 缓存击穿 概念 一些redis的key过期 同时大量数据请求过期的key或者redis不存在的key 导致大量请求打到数据库 导致数据库瘫痪 解决方案 1 设置热点数据永不过期 2 对热点数据加锁 分布式锁 代码实现 初始化项目 商
  • Java全栈面试题(三)--Redis

    对Redis的理解 Redis是一款开源的高性能键值对存储系统 支持多种数据类型 如字符串 哈希 列表 集合 有序集合等 主要用于缓存 消息队列 排行榜 计数器等场景 能够提供快速读写 高并发 持久化等功能 Redis是单线程的 通过采用多
  • redis集群模式

    redis单机版 出现单机故障后 导致redis无法使用 如果程序使用redis 间接导致程序出错 redis的集群模式 主从复制模式 哨兵模式 集群化模式 1 主从复制模式 一主多从模式 一个主节点 多个从节点 那么主节点可以负责 读操作
  • 后端开发缓存篇之缓存及缓存模式的介绍

    一 什么是缓存 缓存 简单说就是为了节约对原始资源重复获取的开销 而将结果数据副本存放起来以供获取的方式 二 什么时候使用缓存 1 以 幂等和安全的方式对资源的获取操作 2 缓存数据必须是重复获取的 缓存能生效的本质是空间换时间 缓存的命中
  • Redis持久化AOF

    目录 1 AOF简介 2 AOF持久化流程 3 AOF默认不开启 4 AOF和RDB同时开启 redis听谁的 5 AOF启动 修复 恢复 6 AOF同步频率设置 7 Rewrite压缩 7 1 是什么 7 2 重写原理 如何实现重写 8
  • Memcach基础使用

    memcache 基础课程 使用场景 memcache 服务器端的安装 推荐使用memcached memcached是memchache的升级版本 sudo su apt get install memcached usr bin mem
  • Redis事务

    7 Redis事务 7 1 背景 假如你给你朋友转账 此时你的账户会减少1bw 你朋友的账户会多1bw 此时如果你转账失败 但是你朋友的账户也多了1bw 此时这对于银行来说 这就是事故 说明你的程序存在很大漏洞 不能保证数据的原子性 此时就
  • redis篇

    一 数据库分类 1 关系型数据库SQL Oracle 不开源收费 高帅富 SQL Server 不开源收费 微软自家的产品 DB2 不开源收费 IBM 的产品 Sybase 不开源收费 微软的小基友 关系破裂后家境惨淡 MySQL 大家都在
  • Redis-Sentinel(哨兵模式),看这篇就够了哦

    文章目录 简介 启动并初始化Sentinel 初始化Sentinel服务器 替换普通Redis代码为Sentinel的专用代码 初始化 Sentinel 状态 初始化Sentinel监视的主服务器列表 创建连向主服务器的网络连接 获取主服务
  • windows下使用django实现定时任务

    简介 在做 弹幕弹幕 小程序后端时 需要定时清除数据库中无用的弹幕 在网上查得可以使用Django中的django apscheduler实现这一功能 我在这里记录一下使用这一Application的过程 django apschedule
  • java与redis连接过程中遇到问题

    java与redis连接过程中遇到问题 文章目录 java与redis连接过程中遇到问题 前言 一 redis是什么 特征 二 命令 1 redis通用命令 String类型常见命令 Hash常用命令 List常见命令 Set常见命令 三
  • Redis——Redis简介

    Redis是目前最流行的键值对 key value 数据库 以出色的性能著称 官方提供的数据是可以支持100000以上的 QPS Redis具有高性能的主要原因如下 Redis是基于内存的存储数据库 绝大部分的命令处理只是纯粹的内存操作 内
  • 淘宝商品类目接口API:获取淘宝商品分类类目信息

    cat get 获得淘宝分类详情 响应参数 名称 类型 必须 示例值 描述 info Mix 0 cid 16 parent cid 0 name 其他女装 is parent true status normal sort order 0
  • Redis Geo:掌握地理空间数据的艺术

    欢迎来到我的博客 代码的世界里 每一行都是一个故事 Redis Geo 掌握地理空间数据的艺术 前言 Redis Geo基本概念 Geo模块的目的 工作原理 地理坐标系统

随机推荐

  • Python学习心得记录

    文章目录 MongoChef工具的使用 查询记录 删除记录 获取当前日期 地板除 去掉空格 for循环 文件清空 split函数 明确需求 py中执行py os system execfile import PhantomJS过时问题 打印
  • 【数组】- 如何在C++中把元素插入有序数组?

    数组逆序 数组是C 语言重要的数据结构 对它的一些基本操作要熟练掌握 今天 我们就来讨论 怎么把元素的插入有序数组的问题 案例 题目描述 给你一个整数n和一个数列 数列个数不超过1000 这个数列保证从小到大排列 现要求将这个整数n插入到数
  • 【爬虫】Python使用动态IP,多线程,爬取uncomtrade的数据

    联合国贸易统计数据库UNCOMTRADE是国际海关组织汇总所有成员上报的各自进出口贸易情况的综合信息数据库 是进行国际贸易分析的必不可少的数据来源 联合国贸易统计数据库中提供国际海关组织的多种商品分类标准数据查询 包括HS2002 HS19
  • 最近爆火的超级可爱的猫猫回收站设置教程

    这个回收站图标真的好可爱啊 图标地址 https emlog lanzouj com ixoSF05jp4gf
  • EF 数据库的字段类型为float,C#类型为float时异常,Unable to cast object of type 'System.Double' to type 'System.Single

    数据库的字段 类型 float 代表从 1 79E 308 到 1 79E 308 之间的浮点数字数据 占用8字节 类型 real 代表从 3 40E 38 到 3 40E 38 之间的浮点数字数据 占用4字节 而C 中 类型 double
  • 《C++11标准库》5.1.1Pair

    class pair 可将两个 value视为一个单元 C 标准库内多处用到了这个 class 尤其是容器 map multimap unordered map和 unordered multimap就是使用 pair 来管理其以 key
  • Windows下Nginx的启动、停止等命令

    注意不要直接双击nginx exe 这样会导致修改配置后重启 停止nginx无效 需要手动关闭任务管理器内的所有nginx进程 在nginx exe目录 打开命令行工具 用命令 启动 关闭 重启nginx start nginx 启动ngi
  • 分布式系统SDK端重试策略

    分布式系统SDK端重试策略 1 API 的属性 成功率优先 强调成功率 所以重试的时候 sleep 时间较长 按照指数退避的方式sleep latency优先 强调latency 所以重试的时候 sleep的时间较短 2 重试次数 retr
  • node.js -- koa

    node js koa koa 1 koa介绍 2 koa使用 2 1 Application对象 2 2 上下文content对象常用属性及方法 2 3 中间件 2 4 koa常用中间件 koa router koa static koa
  • LeetCode 0096. Unique Binary Search Trees

    问题简析 给定整数n 有多少个不同的储存1 n的二叉搜索树 二叉搜索树 BST 要求左子树结点都比当前结点小 右子树结点都比当前结点大 思路 动态规划 设f n 为有n个数字时可以构建多少种不同的树 则起始状态为 f 0 1 f 1 1 f
  • apt-get命令详解(超详细)

    原文链接 apt get命令详解 超详细 迎面暖风的博客 CSDN博客 apt get 参数 h 帮助文件 q 输出到日志 无进展指示 qq 不输出信息 错误除外 d 仅下载 不安装或解压归档文件 s 不实际安装 模拟执行命令 y 在需要确
  • odoo16数据导出报错

    最近做项目 下载了odoo16的最新版 SELECT latest version FROM ir module module WHERE name base 16 0 1 3 导出数据的时候报错 连续装了两台机器都是报这个错误 很明显 这
  • 绿洲显示服务器,最后的绿洲登录不上怎么办 最后的绿洲登录失败解决方法推荐-游侠网...

    最后的绿洲登录不上怎么办 最后的绿洲是一款主打pvp的开放世界生存游戏 下面小编给大家带来了最后的绿洲登录失败解决方法推荐 还不了解的玩家不妨进来看看 最后的绿洲登录失败解决方法推荐 1 服务器并没有关闭 无论显示Oasis offline
  • 【中国电工技术学会主办】2022年能源,电力与电气工程国际研讨会(CoEEPE 2022)

    中国电工技术学会主办 2022年能源 电力与电气工程国际研讨会 CoEEPE 2022 重要信息 会议网址 www coeepe org 会议时间 2022年11月11 13日 召开地点 安徽合肥 合肥滨湖国际会展中心 截稿时间 2022年
  • tab动画 vue_【Vue】关于vue动画,实现tab切换页面时左右滑动效果

    今天要想做一个类似于app切换效果的demo 既点击 这个时 获取相应数据 动画已经加上了 但是不知道怎么才能进行切换 像进入详情页那个 已经有办法解决了 但是tab切换这个却发现无从下手 哪位大神能给提供一下思路吗 或者提供一个方案 de
  • 爬取天眼查数据 附代码

    摘要 一 常规抓包分析 比如要爬取企业注册信息查询 企业工商信息查询 企业信用信息查询平台 发现人与企业关系的平台 天眼查该页面的基础信息 通过火狐浏览器抓包 可以发现 所要数据都在下图的json文件里 查看其请求 伪装成浏览器爬取该文件
  • Learning Transferable Visual Models From Natural Language Supervision

    目前开始了解多模态相关的知识 欢迎大家批评指正 这篇论文来自2021年的International Conference on Machine Learning 整理改论文的主要内容 参考 论文阅读 CLIP Learning Transf
  • 伪随机序列发生器PRBS7的matlab实现

    本原多项式 X7 X6 1 clc clear all close all PRBS 7 num 127 输出序列需要输出的个数 registers ones 1 7 output zeros 1 num 设置寄存器初始值 register
  • 华为机试C语言-平安果

    题目描述 https pycoder blog csdn net article details 124995734 动态规划 include
  • DRF 缓存

    应用环境 django4 2 3 python3 10 由于对于服务而言 有些数据查询起来比较费时 所以 对于有些数据 我们需要将其缓存 最近做了一个服务 用的时 DRF 的架构 刚好涉及缓存 特此记录 DRF的缓存 和django自带的缓