django redis的使用方法详解
作者:冰冷的希望 发布时间:2023-08-03 10:54:30
1.说明
redis作为一个缓存数据库,在各方面都有很大作用,Python支持操作redis,如果你使用Django,有一个专为Django搭配的redis库,即django-redis
2.安装
pip install django-redis
3.配置
3.1 配置redis
打开Django的配置文件,比如说setting.py,里面设置CACHES项
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
一个CACHES里可以配置多个redis连接信息,每一个都有自己的别名(alias),上面的“default”就是别名,到时候可以通过不同别名连接不同redis数据库
LOCATION是连接的信息,包括ip端口用户密码等,如果不需要用户密码则可以省略不写,django-redis支持三种连接协议,如下
协议 | 说明 | 举例 |
---|---|---|
redis:// | 普通的TCP套接字连接 | redis://[[username]:[password]]@localhost:6379/0 |
rediss | SSL方式的TCP套接字连接 | rediss://[[username]:[password]]@localhost:6379/0 |
rediss:// | Unix域套接字连接 | unix://[[username]:[password]]@/path/to/socket.sock?db=0 |
3.2 使用redis存储session
Django默认的Session是存储在sql数据库里的,但我们都知道普通的数据会被数据存储在硬盘上,速度没有那么快,如果想改成存储在redis里,只需要在配置文件里配置一下就行
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
3.3 redis连接超时时间设置
连接超时的秒数可以在配置项里指定,SOCKET_CONNECT_TIMEOUT表示连接redis的超时时间,SOCKET_TIMEOUT表示使用redis进行读写操作的超时时间
CACHES = {
"default": {
# ...
"OPTIONS": {
"SOCKET_CONNECT_TIMEOUT": 5, # 连接redis超时时间,单位为秒
"SOCKET_TIMEOUT": 5, # redis读写操作超时时间,单位为秒
}
}
}
4.使用redis
4.1 使用默认redis
如果你想使用默认的redis,也就是在配置文件里设置的别名为“default”的redis,可以引用django.core.cache里的cache
from django.core.cache import cache
cache.set("name", "冰冷的希望", timeout=None)
print(cache.get("name"))
4.2 使用指定redis(原生redis)
当你在配置文件里写了多个redis连接,可以通过别名指定要使用哪个redis
from django_redis import get_redis_connection
redis_conn = get_redis_connection("chain_info")
redis_conn.set("name", "icy_hope")
print(redis_conn.get("name"))
要注意,通过get_redis_connection()获取得到的客户端是原生Redis客户端,虽然基本上支持所有的原生redis命令,但它返回的数据是byte类型,你需要自己decode
5.连接池
使用连接池的好处是不用管理连接对象,它会自动创建一些连接对象并且尽可能重复使用,所以相当来说性能会好一点
5.1 配置连接池
要使用连接池,首先要在Django的配置文件里写上连接池的最大连接数
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
...
"OPTIONS": {
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
}
}
}
5.2 使用连接池
我们可以通过连接别名确定要使用哪个redis,然后正常执行命令就行,我们不用在乎它创建了哪些连接实例,但你可以通过connection_pool的_created_connections属性查看当前创建了多少个连接实例
from django_redis import get_redis_connection
redis_conn = get_redis_connection("default")
redis_conn.set("name", "冰冷的希望")
print(redis_conn.get("name"))
# 查看目前已创建的连接数量
connection_pool = redis_conn.connection_pool
print(connection_pool._created_connections)
5.3 自定义连接池
Django-redis默认的连接的类是DefaultClient,如果你有更高的定制需求,可以新建一个自己的类,继承ConnectionPool
from redis.connection import ConnectionPool
class MyPool(ConnectionPool):
pass
有了这个类之后还需要在Django的配置文件里指定它
"OPTIONS": {
"CONNECTION_POOL_CLASS": "XXX.XXX.MyPool",
}
来源:https://blog.csdn.net/qq_39147299/article/details/127655010


猜你喜欢
- 希望这是window.open()打开fullscreen全屏窗口时无提示关闭父窗口的完美解决方案:我们通常都是用控件法,在父窗口文件里放一
- php中可以使用 mb_detect_encoding() 函数来判断字符串是什么编码的。当在php中使用mb_detect_encodin
- SQL(结构化查询语言)是一种通用数据库查询语言。SQL具有数据定义、数据操作和数据控制功能,可以完成数据库的全部工作。SQL语言使用时只需
- 前言在编程开发中,个人觉得,只要按照规范去做,很少会出问题。刚开始学习一门技术时,的确会遇到很多的坑。踩的坑多了,这是好事,会学到更多东西,
- 本人虽然五音不全,但是听歌还是很喜欢的。希望能利用机器自动制作音乐,本我发现了一个比较适合入门的有趣的开源音乐生成模块 PySynth ,文
- 挺久没写博客了,因为博主开始了今年另一段美好的实习经历,学习加做项目,时间已排满;很感谢今年这两段经历,让我接触了golang和python
- 前言相信我,只要记住本文的 7️⃣ 步口诀,就能彻底掌握 JS 中的 this 指向。先念口诀:箭头函数、new、bind、apply 和
- 上篇介绍的使用python自带tkinter包,来写带界面的工具。此篇介绍使用pyqt来开发测试工具。tkinter的好处是python官方
- MATLAB转格式,需要使用spm package(https://github.com/neurodebian/spm12).%%img2
- PHP mysqli_select_db() 函数更改连接的默认数据库:删除数据库<?php // 假定数据库用户名:root,密码:
- MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,增加默认MYSQL连接数的方法有两
- 普通查询按照所需字段排序db_set.find().sort("field_name ",pymongo.ASCENDI
- 在标志设计中文字与图形元素总是紧密配合,只有恰当的字体与图形搭配时才能发挥最大的视觉效果。这也意味着你不能抛开图案,只是一厢情愿地选择你自己
- 看了OReilly.JavaScript.The.Definitive.Guide.5th.Edition.Aug.2006里的cookie
- 本文实例讲述了python实现指定字符串补全空格的方法。分享给大家供大家参考。具体分析如下:如果希望字符串的长度固定,给定的字符串又不够长度
- 前言本文主要跟大家介绍了关于Vue实例中生命周期created和mounted区别的相关内容,分享出来供大家参考学习,下面话不多说了,来一起
- 以前写过《 10条影响CSS渲染速度的写法与建议》,今天放些数据出来,供参考;首先说明一点,CSS对网页的最后渲染出来的速度影响非
- 这篇文章主要介绍了Python变量作用域LEGB用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 结构图:为什么?var data [][]intfor _, rangeSlice := range [][]int{{1}, {2}, {
- Timestamp只保留日期不显示时间Timestamp.date()拿到DataFrame中的一个时间戳后,加一个**.date()**即