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有客戶端,也有服務端。
redis-cli -h `redis伺服器ip` -p `redis伺服器port`
1. string型別:
字串型別是 Redis 中最為基礎的資料儲存型別,它在 Redis 中是二進位制儲存的,也就是byte型別
最大容量是512M。
key: string
設定鍵值: set key value 如: set name bob 設定鍵值及過期時間,以秒為單位: setex key seconds value 如: setex name13 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:{
值: 權重值,
值: 權重值,
}
中文官網: http://www.redis.cn/
英文官網:https://redis.io
參考命令:http://doc.redisfans.com/
針對各種資料型別它們的特性,使用場景如下:
字串string: 用於儲存一些專案中的普通資料,只要鍵值對的都可以儲存,例如,儲存 session,定時記錄狀態
雜湊hash:用於儲存專案中的一些字典資料,但是不能儲存多維的字典,例如,商城的購物車
列表list:用於儲存專案中的列表資料,但是也不能儲存多維的列表,例如,佇列,秒殺,醫院的掛號
無序集合set:用於儲存專案中的一些不能重複的資料,可以用於過濾,例如,投票海選的時候,過濾候選人
有序集合zset:用於儲存專案中一些不能重複,但是需要進行排序的資料,分數排行榜.
# -*- 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')
pip install django-redis==4.5 #如果是django1.11版本那麼就是使用django-redis4.5版本的,現在最新版的django-redis只支援django2.2版本+
# 上面是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", } }, }
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/