django-reids模块

Django-redis模块

django4.2.0 + python3.9 + redis3.0.504 + redis模块版本5.0.7 + django-redis5.4.0

django项目中想要使用redis作为缓存工具,则需要下载专门的模块django-redis来完成。

区分django-redis&&redis&&redis-py

  • python中直接操作redis软件,需要用到redis-py模块【功能最全】

  • django-redis是对redis-py模块的基础上进行封装,从而方便在django项目中使用很方便

    django-redis有些功能实现不了,完全可以在django项目中使用redis-py
    

使用django-redis可以完成:

  • 配置缓存 + 让django的其他组件直接使用
  • 配置缓存 + 代码操作缓存

安装【install】

# 下载最新版的django-redis
pip install django-redis

# 指定版本  以5.3.0版本为例,
pip install django-redis==5.3.0

# 卸载
pip uninstall django-redis -y

作为 session backend 使用配置

即指定session的存储后端

在你的django的settings.py中,可以对django-redis进行相关配置,使其更好的支持django的session组件。

# session配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

# 设置session保存的位置对应的缓存配置项
SESSION_CACHE_ALIAS = 'default'

# 过期时间
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7

作为 cache backend 使用配置

即指定django的缓存后端

# cache缓存
CACHES = {
    "default": {    							      # "default" -> 别名
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:密码@127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "PASSWORD": "",   # 密码,如果没有设置密码,这个参数可以注视掉
        }
    }
}

为不同的用途使用不同的缓存配置

一个CACHES里可以配置多个redis连接对象,每一个都有自己的别名(alias),"default"就是别名。

我们可以设置多个不同的连接对象,更细粒度的进行功能划分。


# cache缓存
CACHES = {
    # 默认缓存
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        # 项目上线时,需要调整这里的路径
        # "LOCATION": "redis://:密码@IP地址:端口/库编号",
        "LOCATION": "redis://:@127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 10},
        }
    },
    # 提供给admin运营站点的session存储
    "session": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:@127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 10},
        }
    },
    # 提供存储短信验证码
    "sms_code":{
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:@127.0.0.1:6379/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 10},
        }
    }
}

连接池

# cache缓存
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://www.neeo.cc:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            # 连接池的配置都在CONNECTION_POOL_KWARGS对应的字典中
            "CONNECTION_POOL_KWARGS": {
                "max_connections": 100,
                # "encoding": "utf-8",
                # "decode_responses": True,
                # "timeout": 5,
            },
            "PASSWORD": "",
        }
    }
}

django的缓存对象【cache】

在Django中了redis作为缓存之后,我们可以在项目中通过调用Django提供的全局缓存对象cache,来做一些事情,不过这个对象能干的事情有限

# 这么导入Django提供的全局缓存对象cache,
# cache.xx等类似的 -> 它默认读取的是settings文件中CACHES中的 'default' ,
# 如果没有配置default,这个cache默认是用不了的
from django.core.cache import cache

# 设置模块的环境变量默认值【告诉Django在哪里查找设置。】
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learn_db.settings')
# 加载Django环境【启动】
django.setup()  

# 它能干的事情有限 
# 设置键值对,同时也可以指定超时时间
cache.set("k1", "v1", timeout=25)
print(cache.get("k1"))
print(cache.ttl("k1"))

"""
ttl返回值
    0    表示 key 不存在
    300  表示 key 存在但没有设置过期或者已经过期了
    或者返回一个具体的超时时间
"""

# 如果一个key最开始没有设置超时时间,那么,我们可以手动通过expire给它设置一个超时时间
cache.set("k2", "v2")
cache.expire("k2", timeout=25)
print(111, cache.ttl("k2"))


# 但是搞点其它的,比如操作列表和集合......就报错了
cache.sadd('s1', 'a', 'b', 'c', 1, 2, 3, 1)  
# AttributeError: 'RedisCache' object has no attribute 'sadd'. Did you mean: 'add'?

cache.lpush('l1', 1, 2, 3)   
# AttributeError: 'RedisCache' object has no attribute 'lpush'

建议:如果使用redis作为Django的缓存,那么在项目中就不用这个Django默认的缓存对象cache。
怎么做呢?使用原生redis对象

使用原生Redis对象

默认的缓存对象不好用,就用原生的Redis连接对象

基本使用

import os
import sys
import django

# 设置模块的环境变量默认值【告诉Django在哪里查找设置。】
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learn_db.settings')
# 加载Django环境【启动】
django.setup()  

# 导包
from django_redis import get_redis_connection

# 通过别名拿到Redis连接对象
conn = get_redis_connection()  # 不传值,默认使用的是default
# conn = get_redis_connection('sms_code')  #指定别名

# 最基本的用法,获取连接对象,并设置值,同时指定过期时间,单位: 秒
conn.set('18964853675', '1234', ex=10)
# 在需要的地方在通过连接对象获取值
print(conn.get("18964853675"))

使用管道

import os
import sys
import django

# 设置模块的环境变量默认值【告诉Django在哪里查找设置。】
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learn_db.settings')
# 加载Django环境【启动】
django.setup()  

from django_redis import get_redis_connection

# 获取连接对象
conn = get_redis_connection('sms_code')
# 使用管道
pipe = conn.pipeline()
pipe.set('k1', 'v1')
pipe.set('k2', 'v2')
pipe.set('k3', 'v3')
res = pipe.execute()
print(res)

ttl相关

import os
import sys
import django

# # 设置模块的环境变量默认值【告诉Django在哪里查找设置。】
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learn_db.settings')
# 加载Django环境【启动】
django.setup()

from django_redis import get_redis_connection

conn = get_redis_connection('default')

# 其它数据类型操作就按照redis-py模块中讲的那样操作就好了
# ------------------ hash ------------------
data = {"id": 1, "user": "gaojie", 'age': 18}

conn.hset(name='user2', key="name", value='gaojie')  # 这种写法没问题
print(conn.hget('user2', 'name'))

# ------------------ list --------------------
l1 = ['e', 'f', 'g', 'h']
conn.lpush('l1', 'a', 'b', 'c')
# 批量插入列表
conn.lpush('l1', *l1)
print(conn.lrange('l1', 0, -1))

# ------------------ set ------------------
# 声明集合s1,并添加多个元素,也可以是一个元素,也可以批量添加多个元素
conn.sadd('s1', 'a')
# 对于整型同样转为str, 且元素不能重复,且是无序的
conn.sadd('s1', 'a', 'b', 'c', 5, 2, 3, 5)
# 返回 s1 中所有元素
print(conn.smembers('s1'))

# ------------------ zset ------------------
# 增
score = {
    "gaojie": 108,
    "lijie": 99,
    "wangjie": 100,
    "zhaojie": 102,
}
conn.zadd('score', mapping=score)
# 查, withscores是可选参数,表示同时返回所有成员和分数
print(conn.zrange('score', 0, -1))
print(conn.zrange('score', 0, -1, withscores=True))
posted @ 2024-07-10 02:16  清风拂山岗(小高同学)  阅读(22)  评论(0编辑  收藏  举报