Django笔记三十三之缓存操作
本文首发于公众号:Hunter后端
原文链接:Django笔记三十三之缓存操作
这一节介绍一下如何在 Django 中使用 redis 做缓存操作。
在 Django 中可以有很多种方式做缓存,比如数据库,比如服务器文件,或者内存,这里介绍用的比较多的使用 redis 作为缓存。
这篇笔记主要内容如下:
- 依赖安装
- settings.py 配置
- 缓存操作用法
- 缓存版本控制
- cache 用作 session backend
- 清除 redis 里全部数据
- 批量查询与删除
其中,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/
如果想获取更多后端相关文章,可扫码关注阅读:

Django笔记三十三之缓存操作的更多相关文章
- django笔记三之admin的管理
django笔记三之admin的管理 设置自动admin应用 vim todos/settings.py INSTALLED_APPS = ( 'django.contrib.admin', 新版本已 ...
- Django(三) ORM 数据库操作
大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...
- Django笔记&教程 6-4 forms进阶操作,重写forms方法
Django 自学笔记兼学习教程第6章第4节--forms进阶操作,重写forms方法 点击查看教程总目录 1 - 重写clean方法 在本章第三节中,我们举了个注册学生账号的例子,里面我们使用模型来 ...
- 【Django笔记三】Django2.0配置mysql模型
一.环境版本信息: 操作系统:windows10 Django版本:2.0.5 Python版本:3.6.4 Mysql版本: 5.5.53 安装mysql 二.安装Mysqlclient: 1. ...
- MYSQL初级学习笔记三:数据的操作DML!(视频序号:初级_24,25,36)
知识点五:数据的操作DML(24,25,36) 插入数据: --测试插入记录INSERT CREATE TABLE IF NOT EXISTS user13( id TINYINT UNSIGNED ...
- Android笔记三十三.BroadcastReceiver使用
广播是一种广泛运用在应用程序之间传输信息的机制,而BroadcastReceiver是对发送出来的广播进行过滤接收并响应的一类组件. BroadcastReceiver本质上是一种全局监听器. ...
- 论文阅读笔记三十三:Feature Pyramid Networks for Object Detection(FPN CVPR 2017)
论文源址:https://arxiv.org/abs/1612.03144 代码:https://github.com/jwyang/fpn.pytorch 摘要 特征金字塔是用于不同尺寸目标检测中的 ...
- SQL学习笔记三之MySQL表操作
阅读目录 一 存储引擎介绍 二 表介绍 三 创建表 四 查看表结构 五 数据类型 六 表完整性约束 七 修改表ALTER TABLE 八 复制表 九 删除表 一 存储引擎介绍 存储引擎即表类型,mys ...
- PHP学习笔记三十三【自定义错误处理器】
<?php //自定义错误处理器 //$errorno 错误号 //$errmes错误信息 //这两个参数是必须的 function my_error($errorno,$errmes) { e ...
- Hibernate学习笔记三:常用数据库操作语句
转载请注明原文地址: 一:HQL 1:HQL语句格式:select from POJO类名 where 条件表达式 group by 属性 having 聚集函数 order by 属性 [其中,fr ...
随机推荐
- sql server数据库的带返回值的存储和函数的基础使用
准备基本的数据 create table test_table ( id int identity(0,1), name varchar(20), age int, book_name varchar ...
- input_subsys 输入子系统框架分析
在linux内核中 已做好各类驱动的框架,驱动程序也属于内核的一部分,我们可以在原有的驱动上修改,来匹配我们自已的硬件,也可以自已编写符合内核驱动框架的驱动程序.出于学习的目的,便于更好的理解各类驱动 ...
- springboot后端接收不到前端传来的表单值
为啥接收不到 因为传来的字段值太大了,springboot默认启动依赖tomcat,tomcat默认接收表单值最大为2MB,将server.tomcat.max-http-form-post-size ...
- python之pyqt5-第一个pyqt5程序-图像压缩工具(2.5版本,加入多线程进度条与文件drop)-小记
(如想转载,请联系博主或贴上本博地址) 题外:关于python的多线程 python因为GIL的原因,只能利用到单核CPU性能.如程序内多是计算或循环,多线程无啥意义:如程序内多IO操作,多线程可以避 ...
- 原生JS及jQuery中事件委托的写法
在绑定节点事件处理程序时遇到的问题: 每个 函数都是对象,都会占用内存:内存中的对象越多,性能就越差. 其次,必须事先指定所有事件处理程 序而导致的 DOM访问次数,会延迟整个页面的交互就绪时间. 采 ...
- 记一个jdbc创建数据库、用户操作时,创建新用户提示CREATE USER权限问题
手写存储表数据库信息,访问链接动态数据源操作: mysql: 1.root登录服务器 进入数据库 mysql -u root -p2.创建数据库 create database shop; shop ...
- Java - JDBC批量插入原理
一.说明 在JDBC中,executeBatch这个方法可以将多条dml语句批量执行,效率比单条执行executeUpdate高很多,这是什么原理呢?在mysql和oracle中又是如何实现批量执行的 ...
- Centos7 禁用IPV6地址的方法
方法 1 编辑文件/etc/sysctl.conf, vi /etc/sysctl.conf 添加下面的行: net.ipv6.conf.all.disable_ipv6 =1 net.ipv6.co ...
- Android笔记--Activity--启停活动页面
Activity启动 从当前页面跳转到新的页面:startActivity(new Intent(原页面.this,目标页面.class)) 而若是从当前页面返回到上一个页面,相当于关闭当前页面,使用 ...
- 【SpringBoot】还不会SpringBoot项目模块分层?来这手把手教你
前言 缘由 经常看到网上很多优秀的开源项目中,代码简洁,模块分层完美.反观自己代码层级混乱,,却不知如何整理分层.此文手把手教你一步一步创建模块,左手右手一个慢动作.结合本人实际开发及个人项目中分层思 ...