django-reids模組

清风拂山岗(小高同学)發表於2024-07-10

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))

相關文章