1. 程式人生 > >redis 基礎與字串型別

redis 基礎與字串型別

  1. 全域性命令
  • 檢視所有鍵: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
  1. redis是單執行緒架構

  2. 資料型別

  • 字串

    • 字串的值最大不能超過512M
    • 設定值
    set key value [ex seconds] [px milliseconds] [nx|xx]
    

    ex seconds:表示級過期時間

    px milliseconds:表示毫秒級過期時間

    nx:表示鍵必須不存在,才能新增成功,用於新增一個新鍵,合成簡寫命令 setnx,

    根據setnx的特性只有一個客戶端能設定成功,setnx可以作為分散式鎖的一種實現方案,Redis官方給出了使用setnx實現分散式鎖的方法:

    http://redis.io/topics/distlock

    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 即可解決上述問題,如下圖所示:

在這裡插入圖片描述