1. 程式人生 > 實用技巧 >reids簡單使用, python, django操作redis

reids簡單使用, python, django操作redis

Redis 是一個高效能的key-value資料格式的記憶體快取,NoSQL資料庫。

NOSQL:not only sql,泛指非關係型資料庫。

1. 沒有資料表的概念,不同的nosql資料庫存放資料位置不同。
2. nosql資料庫沒有通用的操作語言。
3. 基本不支援事務。   redis支援簡單事務

redis: 記憶體型(資料存放在記憶體中)的非關係型(nosql)key-value(鍵值儲存)資料庫, 支援資料的持久化(注: 資料持久化時將資料存放到檔案中,每次啟動redis之後會先將文 件中資料載入到記憶體),經常用來做快取(用來快取一些經常用到的資料,提高讀寫速度)。

redis是一款基於CS架構的資料庫,所以redis有客戶端,也有服務端。

其中,客戶端可以使用python等程式語言,也可以終端命令列工具

redis客戶端連線伺服器:

redis-cli -h `redis伺服器ip` -p `redis伺服器port`

設定redis密碼,如果想需要提供密碼再登入redis,需要在配置檔案中設定 requirepass 密碼

redis資料型別

1. string型別:
字串型別是 Redis 中最為基礎的資料儲存型別,它在 Redis 中是二進位制儲存的,也就是byte型別
最大容量是512M。
key: string

設定鍵值: set key value   如: set name bob

設定鍵值及過期時間,以秒為單位: setex key seconds value   如: setex name1 
3 jack(3秒後過期) 關於設定儲存資料的有效期: "" # setex 新增儲存資料到redis,同時設定有效期 格式: setex key time value # expire 給已有的資料重新設定有效期 格式: expire key time "" 設定多個鍵值: mset key1 value1 key2 value2 ... 如: mset hobby1 walking hobby2 running hobby3 swimming 追加值: append key value 如: append hobby1 reading ("walkingreading
") 獲取:根據鍵獲取值,如果不存在此鍵則返回`nil`: get key 如: get hobby1 根據多個鍵獲取多個值: mget key1 key2 ... 如: mget hobby1 hobby2 # 1) "walkingreading" # 2) "running"

鍵操作

查詢鍵,引數⽀持正則表示式: keys pattern  
檢視所有鍵: keys *  

檢視名稱中以`a`開頭的鍵: keys a* 
檢視名稱中包含`a`的鍵: keys *a*

判斷鍵是否存在,如果存在返回`1`,不存在返回`0`: exists key1   如: exists hobb

檢視鍵對應的`value`的型別: type key  

刪除鍵及對應的值: del key1 key2 ...   如: del hobby1

檢視有效時間,以秒為單位: ttl key

2. hash型別:
hash用於儲存物件,物件的結構為屬性、值,值的型別為string。
key:{
域:值[這裡的值只能是字串],
域:值,
域:值,
域:值,
...
}

設定單個屬性: hset key field value  如: hset weather today hot(設定鍵 `weather`的屬性`today`為`hot`)

設定多個屬性: hmset key field1 value1 field2 value2 ...   如: hmset weather2 today hot tomorrow hot

獲取指定鍵所有的屬性: hkeys key   如: hkeys weather2

獲取⼀個屬性的值: hget key field  如: hget weather2 tomorrow

獲取多個屬性的值: hmget key field1 field2 ...   如: hmget weather2 today tomorrow
# 1) "hot"
# 2) "hot"

獲取所有屬性的值: hvals u2  如: hvals weather2

刪除屬性,屬性對應的值會被⼀起刪除: hdel key field1 field2 ...   如: hdel weather2 today

3. list型別:
列表的元素型別為string。
key:[ 值1,值2,值3..... ]

在左側插⼊資料: lpush key value1 value2 ...   如: lpush l1 11 22 33(後來的資料在列表前面顯示)

在右側插⼊資料: rpush key value1 value2 ...  如: rpush l2 11 22 33(後來的資料在列表後面顯示)

從鍵為`...`的列表右側加⼊資料`...`   如: rpush l2 55 66
左側同理(lpush l2 11 66)

在指定元素的前或後插⼊新元素: 如: linsert l2 before 33 777

設定指定索引位置的元素值: 
索引可以是負數,表示尾部開始計數,如`-1`表示最後⼀個元素  如: lset l2 -1 000
索引0 代表第一個數字: lset l2 0 8888

刪除指定元素: 
- 將列表中前`count`次出現的值為`value`的元素移除
- count > 0: 從頭往尾移除
- count < 0: 從尾往頭移除
- count = 0: 移除所有

> lrem key count value
如: lrem l2 2 11  (從前面開始刪除兩個11)

檢視列表的所有元素:  lrange l2 0 -1

4. set型別:
無序集合,元素為string型別,元素唯一不重複,沒有修改操作。
key: {值1,值4,值3,值5,....}

新增元素: sadd key member1 member2 ...     如: sadd s11 11 22 33 33 55(實際會去重, 只有4個值)

返回所有的元素: smembers key

刪除指定元素: srem key value   如: srem s11 55 22

5. zset型別[sortset]:
有序集合,元素為string型別,元素唯一不重複,有修改操作。
key:{
值: 權重值,
值: 權重值,
}

redis的幾個站點地址:

中文官網: http://www.redis.cn/

英文官網:https://redis.io

參考命令:http://doc.redisfans.com/

指令:http://redis.io/commands

針對redis中的內容擴充套件

flushall 清空資料庫中的所有資料

針對各種資料型別它們的特性,使用場景如下:
字串string: 用於儲存一些專案中的普通資料,只要鍵值對的都可以儲存,例如,儲存 session,定時記錄狀態
雜湊hash:用於儲存專案中的一些字典資料,但是不能儲存多維的字典,例如,商城的購物車
列表list:用於儲存專案中的列表資料,但是也不能儲存多維的列表,例如,佇列,秒殺,醫院的掛號
無序集合set:用於儲存專案中的一些不能重複的資料,可以用於過濾,例如,投票海選的時候,過濾候選人
有序集合zset:用於儲存專案中一些不能重複,但是需要進行排序的資料,分數排行榜.

python連線redis基本操作

安裝:pip3 install redis

普通連線:不推薦

# -*- coding:utf-8 -*-
import redis
# 直接連線redis
conn = redis.Redis(host='10.211.55.28', port=6379, password='foobared', encoding='utf-8', db=1,decode_responses=True)
#註解 redis 提供兩個類 Redis 和 StrictRedis, StrictRedis 用於實現大部分官方的命令,Redis 是 StrictRedis 的子類,用於向後兼用舊版本。
#redis 取出的結果預設是位元組,我們可以設定 decode_responses=True 改成字串

# 設定鍵值:159="9999" 且超時時間為10秒(值寫入到redis時會自動轉字串)
conn.set('159', 9999, ex=10)
# 根據鍵獲取值:如果存在獲取值(獲取到的是位元組型別);不存在則返回None
value = conn.get('159')
print(value)

面python操作redis的示例是以直接建立連線的方式實現,每次操作redis如果都重新連線一次效率會比較低,建議使用redis連線池來替換,例如:

連線池的形式:

import redis
# 建立redis連線池(預設連線池最大連線數 2**31=2147483648)
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='', encoding='utf-8', max_connections=1000)
#檢視redis最大連線數的方法127.0.0.1:6379> CONFIG GET maxclients
#設定redis最大連線數的方法127.0.0.1:6379> CONFIG set maxclients 10
# 去連線池中獲取一個連線
# conn = redis.Redis(connection_pool=pool, decode_responses=True)
conn = redis.Redis(connection_pool=pool)
# 設定鍵值:15131255089="9999" 且超時時間為10秒(值寫入到redis時會自動轉字串)
conn.set('day', "Monday", ex=10)
# 根據鍵獲取值:如果存在獲取值(獲取到的是位元組型別);不存在則返回None
value = conn.get('day')
print(value)

django連線redis

import redis

from django.shortcuts import render, HttpResponse

# 建立redis連線池
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, password='', encoding='utf-8', max_connections=1000)


def index(request):
    # 去連線池中獲取一個連線
    conn = redis.Redis(connection_pool=pool)
    conn.set('day', 'Monday', ex=10)
    value = conn.get('day')
    print(value)
    return HttpResponse('ok')

上述可以實現在django中操作redis。但是在django中一般不這麼幹,而是用另一種更加簡便的的方式:django-redis

第一步:安裝django-redis模組(內部依賴redis模組)

pip install django-redis==4.5  #如果是django1.11版本那麼就是使用django-redis4.5版本的,現在最新版的django-redis只支援django2.2版本+

第二步:在django專案的settings.py中新增相關配置

# 上面是django專案settings中的其他配置....

# 設定redis快取
CACHES = {
    # 預設快取
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        # 專案上線時,需要調整這裡的路徑
        "LOCATION": "redis://127.0.0.1:6379/0",

        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
              #"CONNECTION_POOL_KWARGS": {
            #    "max_connections": 1000,
            #    "encoding": 'utf-8'
            #},
            #"PASSWORD": "" # 如果設定了登入密碼,那麼這裡寫密碼
        }
    },
    
    # 提供儲存簡訊驗證碼
    "sms_code":{
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },

}

第三步:在django的檢視中操作redis

from django.shortcuts import render, HttpResponse
from django_redis import get_redis_connection


def index(request):
    # 去連線池中獲取一個連線
    conn = get_redis_connection("default")
    # conn = get_redis_connection("sms_code")  也可以連線sms_code的資料庫
    conn.set('dayyy', 'Mondayyy', ex=10)
    value = conn.get('dayyy')
    print(value)
    return HttpResponse('ok')

redis-py模組的操作文件:https://redis-py.readthedocs.io/en/stable/

Django-redis中文文件:https://django-redis-chs.readthedocs.io/zh_CN/latest/