Django缓存框架API

news2025/5/13 20:41:41

这里写自定义目录标题

  • 访问缓存
    • 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)  # 12

cache.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.coloradmin.cn/o/2374913.html

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

相关文章

Docker:安装配置教程(最新版本)

文章目录 一、前言二、具体操作2.1 卸载 Docker (可选)2.2 重新安装(使用清华大学镜像)2.3 配置轩辕镜像加速2.4 Docker 基本命名2.5 测试是否成功 三、结语 一、前言 Docker 是一种容器化技术,在软件开发和部署中得到广泛的应用&#xff0c…

neo4j官方示例

目录 一、准备数据 1.执行查看结果 二、操作 1.find 单个节点 2.同上,已某个属性去查询 3. 指定查询个数 4.条件查询 5.查询某个人出演的电影汇总 6.查询tom出演的电影中,还有其他演员的信息。 7.查询跟电影(Cloud Atlas)有关的演员&#xff0…

前端自学入门:HTML 基础详解与学习路线指引

在互联网的浪潮中,前端开发如同构建数字世界的基石,而 HTML 则是前端开发的 “入场券”。对于许多渴望踏入前端领域的初学者而言,HTML 入门是首要挑战。本指南将以清晰易懂的方式,带大家深入了解 HTML 基础,并梳理前端…

vue实现与后台springboot传递数据【传值/取值 Axios 】

vue实现与后台springboot传递数据【传值/取值】 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每…

【英语笔记(三)】介绍谓语动词的分类,初步讲解四种基本状态:一般、进行、完成、完成进行

1. 五大类谓语动词 2. 谓语动词分类 3. 动词时间 过去--------------------------现在-----------------------未来 3. 动词状态 3.1 进行状态 3.2 完成状态 3.3 完成进行状态 3.4 一般状态 4. 时间 状态 名称说明例句现在现在现在现在进行时态现在某物正在做什么事情一只…

【Python】让Selenium 像Beautifulsoup一样,用解析HTML 结构的方式提取元素!

我在使用selenium的find_element的方式去获取网页元素,一般通过xpath、css_selector、class_name的方式去获取元素的绝对位置。 但是有时候如果网页多了一些弹窗或者啥之类的,绝对位置会发生变化,使用xpath等方法,需要经常变动。…

2025 后端自学UNIAPP【项目实战:旅游项目】3、API接口请求封装,封装后的简单测试以及实际使用

一、创建请求封装目录 选中自己的项目,右键鼠标---->新建---->目录---->名字自定义【我的是api】 二、创建两个js封装文件 选中封装的目录,右键鼠标---->新建---->js文件---->名字自定义【我的两个js文件分别是my_http和my_api】 三…

Ascend的aclgraph(二)_npu_backend中还有些什么秘密?

1 _npu_backend 文章还是从代码开始 import torch_npu, torchair config torchair.CompilerConfig() # 设置图下沉执行模式 config.mode "reduce-overhead" npu_backend torchair.get_npu_backend(compiler_configconfig) opt_model torch.compile(model, back…

ventoy安全启动怎么选_ventoy安全启动支持是开还是关

ventoy安全启动怎么选?Ventoy新一代多系统启动U盘解决方案。国产开源U盘启动制作工具,支持Legacy BIOS和UEFI模式,理论上几乎支持任何ISO镜像文件,支持加载多个不同类型的ISO文件启动,无需反复地格式化U盘,…

CC53.【C++ Cont】二分查找的普通模版

目录 1.知识回顾 2.关键点 特点 三个模版 普通的模版(有局限) 以LeetCode上的一道题为例:704. 二分查找 分析 引入二段性:分两段,舍一段,操作另一段(这个是二分查找的本质!) 代码 提交结果 当然也可以使用随机数来分两段 普通模版总结 1.知识回顾 之前在C语言专栏…

【优选算法 | 链表】链表操作技巧:常见算法

算法相关知识点可以通过点击以下链接进行学习一起加油!双指针滑动窗口二分查找前缀和位运算模拟 链表是一种灵活的数据结构,广泛用于需要频繁插入和删除的场景。掌握链表的常见操作技巧,如插入、删除、翻转和合并等,能帮助开发者更…

w~大模型~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/13284996 #VideoMamba 视频理解因大量时空冗余和复杂时空依赖,同时克服两个问题难度巨大,CNN 和 Transformer 及 Uniformer 都难以胜任,Mamba 是个好思路,让我们看看本文是…

PBR材质-Unity/Blender/UE

目录 前言: 一、Unity: 二、Blender: 三、UE: 四、全家福: 五、后记: 前言: PBR流程作为表达物理效果的经典方式,很值得一学。纹理贴图使用的是上一期的Textures | cgbookcas…

websocketpp 安装及使用

介绍 WebSocket 是从 HTML5 开始支持的一种网页端和服务端保持长连接的消息推送机制。 传统的 web 程序都是属于 "一问一答" 的形式,即客户端给服务器发送了一个 HTTP 请求,服务器给客户端返回一个 HTTP 响应。这种情况下服务器是属于被动…

第8章-2 查询执行的基础

上一篇:《第8章-1 查询性能优化-优化数据访问》,接着来了解查询执行的过程,这个对sql执行有个更直观的了解。 查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解…

java面试OOM汇总

在正式 Minor GC 前,JVM 会先检查新生代中对象,是比老年代中剩余空间大还是小。假如 Minor GC之后 Survivor 区放不下剩余对象,这些对象就要进入老年代 老年代剩余空间大于新生代中的对象大小,那就直接 Minor GC, GC 完…

react-diff-viewer 如何实现语法高亮

前言 react-diff-viewer 是一个很好的 diff 展示库,但是也有一些坑点和不完善的地方,本文旨在描述如何在这个库中实现自定义语法高亮。 Syntax highlighting is a bit tricky when combined with diff. Here, React Diff Viewer provides a simple rend…

自定义prometheus exporter实现监控阿里云RDS

# 自定义 Prometheus Exporter 实现多 RDS 数据采集## 背景1. Prometheus 官网提供的 MySQL Exporter 对于 MySQL 实例只能一个进程监控一个实例,数据库实例很多的情况下,不方便管理。 2. 内部有定制化监控需求,RDS 默认无法实现,…

【计算机网络】--tcp三次握手

文章目录 示意图:抓包结果:第一次握手(Client → Server)第二次握手(Server → Client)第三次握手(Client → Server)为什么是三次握手 不是两次或者四次 示意图: 抓包结…

UI-TARS: 基于视觉语言模型的多模式代理

GitHub:https://github.com/bytedance/UI-TARS 更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI 基于视觉语言模型(Vision-Language Model)的 GUI 代理应用,允许用户通过自然语言控制电脑操…