為什麼學習redis,前幾天有個需求,用到了redis庫,之前學習過但僅限於大學的時候,這個時候差不多忘光了,需求測的時候也是現學的幾個查詢指令。印象最深的是開發設計的時候儲存了10個不同key值但value(list字串)相同的資料,當時問過為什麼要存十個,解釋為 “為了防止頻繁的訪問一個key導致的熱key問題,所以儲存10個相同value的key,隨機訪問,分散壓力”。後面查詢資料才發現,頻繁訪問一個會導致CPU資源過載,記憶體資源緊張,負載不均衡等問題。
一.環境搭建
我是直接在網上下載的win redis-x64.zip壓縮包,解壓到本地後可以看到兩個檔案,一個是redis-server.exe redis服務啟動程式,另一個是redis-cli.exe redis客戶端操作程式。壓縮包地址:https://pan.baidu.com/s/1t_NpWnE_qj4TvyESyvXYDA?pwd=4c0a 提取碼:4c0a
二.基本使用
1.啟動服務
redis-server.exe redis.windows.conf # 在解壓目錄下開啟cmd,執行此命令
2.開啟redis客戶端連線
redis-cli.exe # 在解壓目錄下另外開啟cmd,執行此命令,服務不要關閉
輸入ping返回PONG即連線成功
ip預設本地ip,埠預設6379
3.切換庫
select index # redis共有16個庫,index為0-15,預設為0號庫
4.設定key和value值
set key value # 設定key值和對應的value值 get key # 透過key獲取value值
5.停止服務
shutdown
6.其它常用操作
dbsize:檢視當前庫key值數量
flushdb:刪除當前庫所有資料
exit:退出客戶端連線
keys *:檢視當前庫所有key值(還可模糊匹配:*萬用字元,?佔位符,例:*明*,*ming,li*)
exists key:判斷key是否存在(例:exists name 存在返回1,不存在返回0)
expire key seconds:設定key過期時間(例如:expire name 30,設定name存活30s,30秒後key會失效刪除)
ttl key:查詢key剩餘存活時間(-1 表示未設定存活時間,永久生效,-2已失效,存活時間已過,正數表示剩餘存活時間)
type key:查詢vaule資料型別
del key:刪除key
append key value:在當前value末尾追加內容
strlen key:返回value長度
三.儲存型別
1.string
字串是Redis中最基本的資料型別,可以儲存任何形式的字串,包括數字、文字等
儲存時使用:set key value(透過set儲存的value都是string型別)
2.雜湊(Hash)
雜湊型別是一個鍵值對的集合,適用於儲存物件型別的資料。每個雜湊表可以包含多個欄位和值,非常適合表示具有多個屬性的資料物件
1)HSET key field value:設定雜湊表欄位的值。
2)HGET key field:獲取雜湊表欄位的值。
3)HDEL key field:刪除雜湊表的某個欄位
3.列表(list)
列表是一個雙向連結串列,支援在列表的兩端進行高效的插入和刪除操作
1)宣告一個key,value值為list的
lpush namelist 'liming' # 當key不存在時,建立一個key並賦予value值
2)新增多個vallue
lpush namelist '2' '3' # 預設在最左側新增,即(['3','2','liming'])
3)根據下標查詢value list值
lrange namelist 0 100 # 查詢namelist key對於的value list中0-100的下標值
4)向list右側新增value值
rpush namelist 4 5 # 即['3','2','liming',4,5]
5)向右側新增單個元素值
rpushx namelist 6 # 即[.......4,5,6],若key不存在則新增失敗
6)向左新增單個元素值
lpushx namelist 0 # 若key不存在則新增失敗
7)透過下標獲取對應的元素值
lindex namelist 2
8)刪除最左側的值
lpop namelist
9)刪除最右側的值
rpop namelist
10)刪除
lrem namelist 0 4 # 刪除list中值為4的全部元素 lrem namelist 2 4 # 刪除list中第二個元素值為4的元素
11)查詢list長度
llen key
12)插入元素
linsert key before 3 2 # 在3前插入2 linsert key after 3 2 #在3後插入2
4.集合(set)
集合是一種無序、不重複的資料型別。Redis提供了高效的集合操作,如求交集、並集、差集等
1)建立一個set型別的value值
sadd set 4 5 6 # 賦予set的元素值有三個,4,5,6
2)檢視全部的value值
smembers set
3)判斷value值是否存在
sismember key value
4)判斷元素個數
scard key
5)刪除元素
srem set 1,2,3 4 5 # 刪除1,2,3 4 5三個元素值
5.有序集合(zset)
有序集合與普通集合類似,但每個元素都有一個關聯的分數(score),Redis會根據分數對元素進行自動排序
1)ZADD key score member:向有序集合中新增元素並指定分數
zadd age 1 2 2 3 # 新增兩個元素2,3
2)ZRANGE key start stop:獲取指定範圍內的有序集合成員
zrange age 0 100
3)ZREM key member:刪除有序集合中的某個元素
zrem age 4
四.python操作
1.安裝redis庫
pip install redis
2.例項操作
# pip install redis import time import redis host = '127.0.0.1' # redis服務地址 port = 6379 # redis服務埠 r = redis.StrictRedis(host=host, port=port, db=0, decode_responses=True) # decode_responses=True設定true返回list型別,不設定返回位元組 r.delete('age') # 刪除key key = r.keys() # 獲取資料庫所有的key,返回list print(key) r.set('python', 'python', ex=10) # set(key,value,過期時間(ex設定的是秒,px設定毫秒)) time.sleep(3) print(r.ttl('python')) # 查詢key剩餘存活時間 r.set('python', 'pythoned', nx=True) ''' nx=True當key值python不存在時,新增資料,存在則新增失敗 xx=True 當key值python存在時,修改value值 ''' print(r.get('python')) # 透過key獲取value print(r.dbsize()) r.quit() # 關閉連線
操作方法和dos差不多,r為redis例項化物件,直接用r.的方式呼叫方法操作即可。
3.python實現隨機訪問key來避免頻繁的訪問一個key導致的熱key問題
import random import redis host = '127.0.0.1' # redis服務地址 port = 6379 # redis服務埠 r = redis.StrictRedis(host=host, port=port, db=1, decode_responses=True) # decode_responses=True設定true返回list型別,不設定返回位元組 key_list = ['key0', 'key1', 'key2', 'key3', 'key4', 'key5', 'key6', 'key7', 'key8', 'key9'] for key in key_list: r.set(key, 1) keys = r.keys() a = random.choice(keys) print(r.get(a))