Django缓存框架API

这里写自定义目录标题

  • 访问缓存
    • django.core.cache.caches
    • django.core.cache.cache
  • 基本用法
    • cache.set(key, value, timeout=DEFAULT_TIMEOUT, version=None)
    • cache.get(key, default=None, version=None)
    • cache.add(key, value, timeout=DEFAULT_TIMEOUT, version=None)
    • cache.get_or_set(key, default, timeout=DEFAULT_TIMEOUT, version=None)
    • cache.get_many(keys, version=None)
    • cache.set_many(dict, timeout)
    • cache.delete(key, version=None)
    • cache.delete_many(keys, version=None)
    • cache.clear()
    • cache.touch(key, timeout=DEFAULT_TIMEOUT, version=None)
    • cache.incr/decr(key, delta=1, version=None)
    • cache.close()
  • 缓存前缀
  • 缓存版本控制
  • 缓存键转换

有时,缓存整个渲染页面并不会带来太多好处,事实上,这样会很不方便。比如站点包含一个视图,它的结果依赖许多费时的查询,而且结果会随着时间变化而改变。在这个情况下,使用站点或视图缓存策略提供的全页面缓存并不理想,以为不能缓存所有结果(一些数据经常变动),不过仍然可以缓存几乎没有变化的结果。
像这样的情况Django公开了一个底层的缓存API。可以使用这个API以任意级别颗粒度在缓存中存储对象。可以缓存任何可以安全的pickle的Python对象:模型对象的字符串、字典、列表或其它(大部分通用的Python对象都可以被pickle)。

访问缓存

django.core.cache.caches

可以通过类似字典一样的object:django.core.cache.caches对象访问在CACHES配置的缓存。重复请求同一个线程里的同一个别名将返回同一个对象。

from django.core.cache import caches
cache1 = caches["myalias"]
cache2 = caches["myalias"]
cache1 is cache2  # True

如果键名不存在,将会引发InvalidCacheBackendError错误。为了支持线程安全,将为每个线程返回缓存后端不同实例。

django.core.cache.cache

作为一种快捷方式,默认缓存可以通过django.core.cache.cache访问:from django.core.cache import cache,这个对象等价于caches['default']

基本用法

cache.set(key, value, timeout=DEFAULT_TIMEOUT, version=None)

# 设置缓存
cache.set('my_key', 'hello, world!', 30)

key是一个字符串,value可以任何picklable形式的Python对象。
timeout参数是可选的,默认为CACHES中响应后端的timeout参数。它是值存在缓存里的秒数。timeout设置为None时将永久缓存。timeout为0将不缓存值。

cache.get(key, default=None, version=None)

cache.get('my_key')  # hello, world!

如果缓存中不存在该对象,cache.get()返回None:

# Wait 30 seconds for 'my_key' to expire...
cache.get("my_key")  # None

如果需要确定对象是否存在于缓存中,并且您已经存储了字面值None,可以使用一个特殊的对象作为默认值:

sentinel = object()
cache.get("my_key", sentinel) is sentinel  # False
# Wait 30 seconds for 'my_key' to expire...
cache.get("my_key", sentinel) is sentinel  # True

cahce.get()可以接受一个default参数,用于指定在对象不存在于缓存中时返回的值:

cache.get("my_key", "has expired")  # 'has expired'

cache.add(key, value, timeout=DEFAULT_TIMEOUT, version=None)

如果只在健不存在时才添加键,可以使用add()方法。它接受与set()相同的参数,但如果指定的键已存在,它不会尝试更新缓存:

cache.set("add_key", "Initial value")  # True
cache.add("add_key", "New value")  # False
cache.get("add_key")  # 'Initial value'

如果想知道通过add()存储的值是否存在缓存中,你可以检查返回值。如果值已保存,将返回True,否则返回False。

cache.get_or_set(key, default, timeout=DEFAULT_TIMEOUT, version=None)

如果要获取键的值,或者如果键不再缓存中则设置一个值,可以使用get_or_set()方法。它接受与get()相同的参数,但默认值将作为该键的新缓存值设置,而不是返回值:

cache.get("my_new_key")  # returns None
cache.get_or_set("my_new_key", "my new value", 100)  # 'my new value'

还可以将任何可调用对象作为default值传递:

import datetime
cache.get_or_set("some-timestamp-key", datetime.datetime.now)  # datetime.datetime(2014, 12, 11, 0, 15, 49, 457920)

cache.get_many(keys, version=None)

get_many()只访问缓存一次,返回一个字典,其中包含请求的实际存在于缓存中未过期的所有键:

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.set_many(dict, timeout)

更高效地设置多个值,可以使用set_many()来传递一个键值对的字典:

cache.set_many({"a": 1, "b": 2, "c": 3})
cache.get_many(["a", "b", "c"])  # {'a': 1, 'b': 2, 'c': 3}

类似cache.set()set_many()带有一个可选的timeout参数。在已支持的后端(memcached),set_many()会返回无法插入的键列表。

cache.delete(key, version=None)

delete()明确删除键,以清除特定对象的缓存:

cache.delete("a")  # True

如果键被成功删除,将返回True,否则返回False

cache.delete_many(keys, version=None)

如果想一次性清除一组键,可以使用delete_manay()方法,并传入要清除的键列表:

cahce.delete_many(['a', 'b', 'c']])

cache.clear()

如果想删除缓存中所有的键,可以使用cache.clear()。注意,clear()会从缓存中删除所有内容,不仅仅是自己应用程序设置的键:

cache.touch(key, timeout=DEFAULT_TIMEOUT, version=None)

设置键的新过期时间,例如要将键更新为在10秒后过期:

cache.touch('a', 10)  # True

和其他方法一样,timeout参数是可选的,并且默认是CACHES设置的响应后端的TIMEOUT选项。
如果键被成功touch(),将返回True,否则返回False。

cache.incr/decr(key, delta=1, version=None)

可以使用incr()或decr()方法来分别递增或递减已存在的键。默认情况下现有的缓存值将递增或递减1,通过在递增、递减调用中提供参数来指定其他递增、递减的值。如果尝试递增或递减不存在的键,则会引发ValueError:

cache.set("num", 1)
cache.incr("num")  # 2
cache.incr("num", 10)  # 12cache.decr("num")  # 11
cache.decr("num", 5)  # 6

提示:不保证incr()decr()方法是原子的。那些后端支持原子递增、递减(最值得注意的时memecached后端),则递增和递减操作是原子的,然而如果后端本身没有提供递增、递减方法,则将使用检索和更新两步来实现

cache.close()

如果缓存后端已经实现了close()方法,可以关闭缓存的连接。
对于没有实现close方法的缓存,它将无效操作。

缓存前缀

如果正在服务器之间或者生产、开发缓存之间共享缓存实例,有可能会使得一个服务器使用另一个服务器的缓存数据。如果缓存数据格式是相同的,这会导致一些难以诊断的问题。
为了防止这个问题,Django为单台服务器提供了为素有缓存键提供前缀的方法。当一个特殊的缓存键被保存或检索时,Django会为缓存自动添加KEY_PREFIX缓存设置的前缀。
要确保每个Django实例有不同的KEY_PREFIX,这样就保证缓存值不会发生冲突。
KEY_PREFIX默认’'(空字符串)。

缓存版本控制

当更改使用缓存值的运行代码时,可能需要清除任何已存在的缓存值。最简单方法是刷新整个缓存,但这会导致那些仍然有用且有效的缓存值。
Django提供更好的方式来指向单个缓存值。Django缓存框架有一个系统范围的版本标识,需要在VERSION缓存配置中指定,这个配置的值将自动与缓存前缀和用户提供的缓存键组合起来获得最终的缓存键。
默认情况下,任何键请求都会自动包含站点默认的缓存版本,但是原始缓存函数都包含一个version参数,因此可以指定要设置或获取的特定缓存键版本,例如:

# Set version 2 of a cache key
cache.set("my_key", "hello world!", version=2)
# Get the default version (assuming version=1)
cache.get("my_key")  # None
# Get version 2 of the same key
cache.get("my_key", version=2)  # 'hello world!'

可以使用incr_version()decr_version()方法递增和递减特定键的版本。这使得将特定键提示到新版本,而不影响其他键。继续之前的示例:

# Increment the version of 'my_key'
cache.incr_version("my_key")
# The default version still isn't available
cache.get("my_key")  # None
# Version 2 isn't available, either
cache.get("my_key", version=2)  # None
# But version 3 *is* available
cache.get("my_key", version=3)  # 'hello world!'

缓存键转换

用户提供的缓存键不是单独使用的,它是与缓存前缀、键版本组合后获取最终缓存键。默认情况下,使用冒号连接这三部分生成最终的字符串:

def make_key(key, key_prefix, version):return "%s:%s:%s" % (key_prefix, version, key)

如果想用不同方式组合,或者应用其他处理来获得最终的键(比如,获得关键部分的哈希摘要),那么可以提供一个自定义键函数。
KEY_FUNCATION缓存设置指定一个与上面的make_key()原型匹配的函数路径。如果提供,这个自定义键函数将替代默认的键组合函数来使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/80264.shtml

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

相关文章

Linux系统管理与编程17:自动化部署ftp服务

兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 #virtual用户管理:passerbyA、captain和admin三个虚拟用户 # passerbyA只能看,captain可看读写上传,但不能删除。admin全部权限 [rootshell shell]…

2025python学习笔记

一.Python语言基础入门 第一章 01.初识Python Python的起源: 1989年,为了打发圣诞节假期,Gudio van Rossum吉多范罗苏姆(龟叔)决心开发一个新的解释程序(Python维形)1991年,第一个…

STM32单片机的快速成长路径规划

一、基础准备阶段(1-2周) C语言核心技能 重点掌握:指针操作、结构体、枚举、位操作、函数指针(回调函数基础)实践项目:通过51单片机或STM8完成LED控制、按键检测等基础项目,熟悉寄存器配置和调试…

torch.nn.init.uniform_

nn.init.uniform_ 是 PyTorch 中用于初始化张量(tensor)的一个函数,它的作用是将张量的值填充为从均匀分布中采样的随机数。 详细说明: 函数: torch.nn.init.uniform_(tensor, a0., b1.)tensor:需要被初始…

Spring MVC中跨域问题处理

在Spring MVC中处理跨域问题可以通过以下几种方式实现,确保前后端能够正常通信: 方法一:使用 CrossOrigin 注解 适用于局部控制跨域配置,直接在Controller或方法上添加注解。 示例代码: RestController CrossOrigin…

基本句子结构

以下是英语句子五种基本结构的详细解释,并附上系动词的全面分类及示例: ​1. 主谓结构(SV)​ ​结构:主语(Subject) 不及物动词(Intransitive Verb)​核心:…

游戏引擎学习第264天:将按钮添加到分析器

回顾并为今天的工作做铺垫 随着时间的推移,我们的分析器(profiler)变得越来越强大。我通常会问大家是否记得我们要做什么,今天我们要做的似乎是按钮相关的功能。 今天的目标是实现按钮功能。我们从昨天留下的地方继续&#xff0…

大节点是选择自建机房还是托管机房

选择PCDN大节点自建机房还是托管机房,需综合考量资金实力、技术能力、运维需求、业务规模及合规要求。以下为具体分析: 自建机房的适用场景与考量因素 资金与技术门槛高 自建机房需投入服务器、存储、网络设备等硬件,以及机房建设、电力、散…

【SpringBoot】SpringBoot中使用AOP实现日志记录功能

前言一、AOP基本概念二、项目准备三、实现日志记录切面1、创建自定义日志注解2、实现日志切面3、配置AOP 四、使用示例1. 在Controller中使用2. 在Service中使用 六、高级配置1. 日志内容格式化2. 异步日志记录3. 日志脱敏处理 七、代理类生成的核心逻辑问题1: 既然…

linux中的常用命令(一)

目录 常用的快捷键 1- tab键:命令或者路径提示及补全; 2-ctrlc:放弃当前输入,终止当前任务或程序 3-ctrll;清屏 4-ctrlinsert:复制 5-鼠标右键:粘贴; 6-altc:断开连接/ctrlshift r 重新连接 7-alt1/2/3/等:切换回话窗口 8-上下键…

Pycharm(十九)深度学习

一、深度学习概述 1.1 什么是深度学习 深度学习是机器学习中的一种特殊方法,它使用称为神经网络的复杂结构,特别是“深层”的神经网络,来学习和做出预测。深度学习特别适合处理大规模和高维度的数据,如图像、声音和文本。深度学习、机器学习和人工智能之间的关系如下图所…

多视图密集对应学习:细粒度3D分割的自监督革命

原文标题:Multi-view Dense Correspondence Learning (MvDeCor) 引言 在计算机视觉与图形学领域,3D形状分割一直是一个基础且具有挑战性的任务。如何在标注稀缺的情况下,实现对3D模型的细粒度分割?近期,斯坦福大学视觉…

Vue——前端vue3项目使用汉字转拼音

在 Vue3 项目中,可以通过以下 第三方 JavaScript 包 实现汉字转拼音。这些包均兼容 Vue3,且无需依赖后端处理: 推荐方案 1. pinyin-pro 特点:功能强大、支持多音字、声调、拼音匹配、轻量级(~20KB)。安装…

批量统计PDF页数,统计图像属性

软件介绍: 1、支持批量统计PDF、doc\docx、xls\xlsx页数 2、支持统计指定格式文件数量(不填格式就是全部) 3、支持统计JPG、JPEG、PNG图像属性 4、支持统计多页TIF页数、属性 5、支持统计PDF、JPG画幅 统计图像属性 「托马斯的文件助手」…

LeetCode 每日一题 2025/5/5-2025/5/11

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 5/5 790. 多米诺和托米诺平铺5/6 1920. 基于排列构建数组5/7 3341. 到达最后一个房间的最少时间 I5/8 3342. 到达最后一个房间的最少时间 II5/9 3343. 统计平衡排列的数目5…

pytest自动化测试执行环境切换的两种解决方案

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、痛点分析 在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、UAT环境、线上环…

visual studio 2015 安装闪退问题

参考链接: VS2012安装时启动界面一闪而过问题解决办法 visual studio 2015 安装闪退问题

RocketMQ Kafka区别

架构 ZooKeeper:管理 Broker 注册、分区 Leader 选举及消费者组状态。Broker:存储 Partition数据,每个 Partition 为独立日志文件。Producer/Consumer:通过 ZooKeeper获取路由信息,实现消息分发与消费。 NameServer&am…

MySQL进阶篇2_SQL优化、锁

文章目录 1 SQL优化1.1插入数据优化1.2主键优化页分裂页合并主键设计原则 1.3order by设计优化1.4group by设计优化小理解 1.5limit设计优化顺序IO和随机IO小疑惑 1.6count设计优化1.7update优化关于隐式事务事务的DML操作 锁全局锁表级锁表锁元数据锁意向锁 行级锁锁的释放条件…

如何测试 esp-webrtc-solution_solutions_doorbell_demo 例程?

软件准备 esp-webrtc-solution/solutions/doorbell_demo 例程 此例程集成了 WebSocket 传输视频流的应用 硬件准备 ESP32P4-Function-Ev-Board 环境搭建 推荐基于 esp-idf v5.4.1 版本的环境来编译此例程 若编译时出现依赖的组件报错,可进行如下修改&#xff…