Django笔记三十三之缓存操作

本文首发于公众号:Hunter后端

原文链接:Django笔记三十三之缓存操作

这一节介绍一下如何在 Django 中使用 redis 做缓存操作。

在 Django 中可以有很多种方式做缓存,比如数据库,比如服务器文件,或者内存,这里介绍用的比较多的使用 redis 作为缓存。

这篇笔记主要内容如下:

  1. 依赖安装
  2. settings.py 配置
  3. 缓存操作用法
  4. 缓存版本控制
  5. cache 用作 session backend
  6. 清除 redis 里全部数据
  7. 批量查询与删除

其中,redis 的安装我们在 celery 系列笔记的第一篇已经介绍过了,可以直接使用 docker 来操作,这里不做赘述了。

1、依赖安装

Django 连接 redis 这里用到一个模块,django-redis,接下来我们用 pip 来安装:

pip3 install django-redis

2、settings.py 配置

然后在 settings.py 里设置 CACHES 参数即可使用:

# hunter/settings.py

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:123456@127.0.0.1:6380/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

在这里 redis 的端口我设置成了 6380,密码我设为了 123456。

如果没有密码,LOCATION 的参数为 redis://127.0.0.1:6380/2

当然,如果密码也可以和 url 分离配置,我们可以放到 OPTIONS 参数里:

# hunter/settings.py

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6380/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PASSWORD": "123456",
        }
    }
}

3、缓存操作用法

在上面的配置都设置好之后,可以正式开始我们的缓存操作了。

其实关于缓存,我们可以缓存视图,模板等,但是一般来说,都是缓存更细粒度的数据,比如某个需要经常被访问到的、或者需要经过一些时间进行计算得出结果的数据,可以将其存入缓存来提高接口的访问效率。

以下是缓存操作的一些用法介绍:

#引入 cache 缓存模块
from django.core.cache import cache

#创建一条缓存信息
cache.set("key", "value", 60)
###上述语句释义:Redis 是一种以 key-value 形式存储的非关系型数据库,
###所以上述语句表示的是向 Redis 中存入一条记录,到期时间是60秒后,以秒为单位

#查看是否有某条缓存信息
cache.has_key("key")
###返回的结果是布尔型 True or False

#如果没有就创建一条缓存信息
cache.get_or_set("k", 3, 60)
### 返回的是 k 这条记录的 value 值

#查询某条缓存记录
cache.get("k")
### 如果没有这条缓存信息 则不返回

#查询某条记录,没有则返回特定值
cache.get("k", False)

#同时创建多条记录
cache.set_many({"d":1, "e": 3, "f": 6})
### 输入参数为一个 字典

#同时查询多条记录
cache.get_many(["a", "v", "e"])
### 返回的结果是一个有序字典 OrderedDict

#删除某条缓存记录
cache.delete("a")
### 输入参数为该记录的 key 

#删除多条缓存记录
cache.delete(["a", "b", "c"])

#清除所有缓存记录
cache.clear()

#对缓存value为数字的记录进行操作
cache.set("num", 1)

#对缓存记录+1
cache.incr("num")

#对缓存记录 +n
cache.incr("num", 5)

#对缓存记录-1
cache.decr("num")

#对缓存记录-n
cache.decr("num", 8)

# 对 key 设置新的过期时间为 20s
cache.touch("num", 20)

# 除了 touch 还有 expire 函数可以设置过期时间
cache.expire("num", 10)

# 设置永不超时,timeout=None
cache.set("a", 1, timeout=None)

# 设置永不过期,还可以使用 persist
cache.persist("a")

# 获取 key 的剩余时间,返回的是0 表示已过期或者不存在key,否则返回的是剩余的秒数,如果返回的是 None 表示该数据永不过期
cache.ttl("a")

4、缓存版本控制

如果我们执行 cache.set("a", 1) 这条命令,再去 redis 的命令行通过 keys * 查看所有数据,可以看到一条 key 为 :1:a 的数据。

但是我们去通过 cache.get("a") 的时候,发现可以直接获取到数据,这就是后台为我们自动处理的版本控制,前面的 :1 就表示版本数是 1。

当我们执行 cache.set() 命令时,其实后面还有一个 version 参数,默认为 1,所以下面两个命令是等效的:

cache.set("a", 1)
cache.set("a", 1, version=1)

所以如果有版本的需求我们可以通过这个参数来控制。

缓存版本递增或递减

比如对于一个 version=2 的数据,我们可以这样操作:

cache.set("a", 1, version=2)

# 版本数 +1
cache.incr_version("a")

# 版本数 -1
cache.decr_version("a")

但是注意,当 version 可以减少到 0,但是不能再往下减少了,再减少的话就会报错了。

5、cache 用作 session backend

在上一节中,我们介绍了默认使用数据库表作为 session 的存储形式,我们还可以使用 cache 来用作存储。

只需要在 settings.py 中加入下面这两条命令:

SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

重新运行系统,使用前一篇笔记的代码,调用登录接口,然后就可以在 redis 的交互界面,通过 keys * ,就可以看到这条 session 记录在 redis 里已经有保存了。

6、清除 redis 里全部数据

删除 redis 中 cache 里全部 key-value 数据,可以使用下面的命令:

from django_redis import get_redis_connection
get_redis_connection("default").flushall()

7、批量查询与删除

我们可以通过通配符的方式来查询或者删除指定的键。

比如我们创建下面几条数据:

cache.set("a", 1)
cache.set("a_1", 1)
cache.set("a_2", 1)

然后可以通过 a* 的方式来获取这几条数据的 key:

cache.keys("a*")
# 返回数组:["a", "a2", "a3"]

但是官方文档不推荐这种方式,尤其是在 redis 数据量大的情况下,推荐的是 iter_keys() 函数,返回一个迭代器

for key in cache.iter_keys("a*"):
    print(key)

删除 key

批量删除的话使用的是 delete_pattern() 函数。

cache.delete_pattern("a*")

以上就是本篇笔记全部内容,来源于两篇官方文档:

https://django-redis-chs.readthedocs.io/zh_CN/latest/#

https://docs.djangoproject.com/zh-hans/3.2/topics/cache/

如果想获取更多后端相关文章,可扫码关注阅读:
image

原文链接:https://www.cnblogs.com/hunterxiong/p/17364424.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django笔记三十三之缓存操作 - Python技术站

(0)
上一篇 2023年4月30日
下一篇 2023年4月30日

相关文章

  • Python构建区块链的方法详解

    Python构建区块链的方法详解 区块链是一种新型的分布式数据库,它可以记录数字货币交易、数字证书、智能合约等各种信息,具有去中心化、防篡改等特点。在本篇攻略中,我们将介绍如何用Python构建一条简单的区块链,包括区块的创建、区块链的连接、挖矿和验证等步骤。 区块的创建 区块是区块链中的基本构成单位,它包含了前一个区块的哈希、当前区块的哈希、时间戳、交易信…

    python 2023年6月2日
    00
  • 详解python数值与字符串高级用法

    详解Python数值与字符串高级用法 数值类型的高级用法 Python中内置了多种数值类型,包括整型、浮点型和复数等。在进行数值运算时,可以使用+、-、*、/等基本运算符。除了这些基本的运算符,数值类型还支持很多高级的用法。 divmod函数 divmod函数可以同时获得两个数的商和余数。具体使用方式如下: a = 13 b = 5 q, r = divmo…

    python 2023年6月3日
    00
  • 如何导出 python-highcharts 图表以在烧瓶或 django 中使用?

    【问题标题】:How to export a python-highcharts chart for use in flask or django?如何导出 python-highcharts 图表以在烧瓶或 django 中使用? 【发布时间】:2023-04-07 00:23:01 【问题描述】: 这确实是问题的全部,但我正在使用 python-high…

    Python开发 2023年4月7日
    00
  • python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析

    下面就是对于“python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析”的完整攻略: 1. 介绍 这篇攻略主要介绍了如何使用 PyQT5 GUI 库开发基于 Python 的简单绘图板实例,并对代码进行了详细的分析。 2. 环境配置 为了运行这个 PyQT5 程序,需要先配置环境,必须要安装 PyQt5 库。可以通过 pip 安装它: pip …

    python 2023年6月13日
    00
  • 如何使用Python查询某个列中的最小值?

    以下是如何使用Python查询某个列中的最小值的完整使用攻略。 步骤1:导入模块 在Python中,我们需要导入相应的模块来连接数据库和执行查询操作。以下是导入mysql-connector-python模块的基本语法: import mysql.connector 以下是导入psycopg2模块的基本语法: import psycopg2 步骤2:连接数据…

    python 2023年5月12日
    00
  • python使用post提交数据到远程url的方法

    下面是我对”python使用post提交数据到远程url的方法”的详细说明: 前言 在Python中,使用post方式将数据提交到远程url是一个非常常见的操作。本攻略将演示如何使用Python中的requests模块实现这一功能。 环境准备 在执行本示例之前,请确保您已经安装了requests模块。如果没有安装,您可以使用pip来安装该模块。 pip in…

    python 2023年6月3日
    00
  • 八大排序算法的Python实现

    下面是关于“八大排序算法的Python实现”的完整攻略。 1. 八大排序算法 八大排序算法包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、速排序、堆排序和数排序。这些排序算法的实现方式不同,但都可以用来对数据进行排序。 2. Python实现 下面是八排序算法的Python实现。 2.1 冒泡排序 def bubble_sort(arr): n = l…

    python 2023年5月13日
    00
  • python 高效去重复 支持GB级别大文件的示例代码

    下面是详细的讲解: 1. 需求背景 我们在处理数据时常常会遇到去重复的需求,如果我们的数据量非常大,那么如何高效的去重就成为了我们考虑的问题。运用 Python 的内置函数,我们可以轻松地对小型数据去重,但是当数据量极大时,内置函数的效率往往无法满足需求。 2. 解决方案 我们可以借助于 Python 的 set 集合,set 集合本身就是无序且元素不重复的…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部