redis 基礎與字串型別
阿新 • • 發佈:2018-12-25
- 全域性命令
- 檢視所有鍵:keys *
- 檢視鍵總數:dbsize,dbsize 是直接讀取redis內建的鍵總數變數,而keys * 則會遍歷所有鍵,當鍵數量很大時,線上環境keys * 禁止使用
- 檢視鍵是否存在:exists key,存在返回1,不存在返回0
- 刪除鍵:del key [key1…],返回結果為刪除的鍵數目,刪除一個不存在的鍵則返回0,可以同時刪除多個鍵
- 設定鍵過期時間:expire key seconds,鍵到期系統會自動將它刪除
- 返回鍵過期剩餘時間:ttl key,返回值大於等於0表示剩餘鍵過期時間,-1表示未設定鍵過期時間,-2表示鍵不存在
- 鍵的資料型別:type key,鍵不存在則返回none
-
redis是單執行緒架構
-
資料型別
-
字串
- 字串的值最大不能超過512M
- 設定值
set key value [ex seconds] [px milliseconds] [nx|xx]
ex seconds:表示秒級過期時間
px milliseconds:表示毫秒級過期時間
nx:表示鍵必須不存在,才能新增成功,用於新增一個新鍵,合成簡寫命令 setnx,
根據setnx的特性只有一個客戶端能設定成功,setnx可以作為分散式鎖的一種實現方案,Redis官方給出了使用setnx實現分散式鎖的方法:
xx:與nx相反,鍵必須存在,才能新增成功,用於修改一個鍵,合成簡寫命令 setxx
- 獲取值
get key,如果鍵不存在,則返回nil(空)
-
批量設定值:mset
-
批量獲取值:mget,不存在的鍵返回nil,批量操作可以提高效率
-
自增操作:incr key,鍵不是整數,返回錯誤,鍵是整數,返回加1後的結果,鍵不存在,按照值為0自增,返回結果為1
-
內部編碼:
- int:8個位元組的長整形
- embstr:小於等於39個位元組的短字串
- raw:大於39個位元組的長字串
-
命名注意事項:redis沒有名稱空間,合理的鍵命名有利於防止鍵衝突和專案的維護,比較推薦的方式是使用“ 業務名:物件名:id:[屬性] ” 作為鍵名(也可以不是:)。如果鍵名過長可以採用縮寫,避免鍵過長浪費記憶體
-
使用場景:
-
快取
-
計數
long incrVideoCounter(long id) { key = "video:playCount:" + id; return redis.incr(key); }
真實的計數系統要考慮的問題很多,如:防作弊,多維度統計,資料持久的底層資料來源等
- 限速
發簡訊限速虛擬碼如下
phoneNum = "138xxxxxxxx"; key = "shortMsg:limit:" + phoneNum; // SET key value EX 60 NX isExists = redis.set(key,1,"EX 60","NX"); if(isExists != null || redis.incr(key) <=5){ // 通過 }else{ // 限速 }
- 共享session
分散式系統會導致session 分散到不同的伺服器上,負載均衡會導致出現使用者重新整理一次就要重新登入的情況
使用redis統一管理session 即可解決上述問題,如下圖所示: