redis入門指南(三)—— 事務、過期時間、SORT命令、訊息通知與管道

Dylan~發表於2020-07-12

寫在前面

  學習《redis入門指南》筆記,結合實踐,只記錄重要,明確,屬於新知的相關內容。

 

事務

  1、redis中的事務由一組命令的集合組成,要麼都執行,要麼都不執行,同時redis的事務還可以保證事務內的命令會依次執行不被其他命令插入。

  2、命令MULTI開啟事務,之後傳送一些列需要執行的指令,最後傳送EXEC執行事務,一旦成功傳送EXEC,所有的命令就一定會被執行。

  3、當redis事務中的命令發生了語法錯誤時,執行EXEC後就會直接返回錯誤,其中語法正確的命令也不會執行。

  4、當redis事務中的命令發生了執行錯誤時,比如使用雜湊型別的命令操作集合型別,這種錯誤在語法檢查階段無法發現,出現執行錯誤的命令,在返回內容中將有錯誤資訊,其他命令依然會正常執行。

  5、redis事務沒有關聯式資料庫事務提供的回滾功能。

  6、WATCH命令可以監控一個或多個鍵,一旦其中有一個鍵被修改,那之後的一個事務就不會執行,監控一直持續到事務執行(即EXEC)之前,因為事務中的命令會在EXEC之後執行,所以這個事務中可以修改剛才WATCH監控的鍵。

  7、執行EXEC之後會取消對所有鍵的監控,也可以通過UNWATCH來取消監控。

 

過期時間

  8、設定過期時間

    EXPIRE key seconds

    redis可以為每一個頂層資料結構(5種)的鍵設定過期時間,過期後將自動刪除,過期時間為秒,表示還剩多少時間就會刪除這個鍵。返回1表示設定成功,0失敗。

  9、檢視剩餘過期時間

TTL key

當鍵不存在時返回-2,沒有過期時間返回-1。

10、取消過期時間

PERSIST key

除此之外,使用SET或GETSET(先設定新的值,在返回舊的值)為鍵賦值,也會清除過期時間,需要再次設定,其他對鍵值操作的命令不會對過期時間產生影響。

11、PEXPIRE key millisecond

以毫秒為單位設定過期時間

12、以UNIX時間設定過期時間

EXPIREAT key seconds

PEXPIREAT key millisecond

13、如果WATCH命令監控了一個有過期時間的鍵,該鍵時間到期自動刪除不會被WATCH認為該鍵被改變。

  14、過期時間這一特性使redis可以當作快取使用,當快取的數量越多,達到redis最大可用記憶體大小(通過配置檔案的maxmemory修改),將會根據maxmemory-policy引數指定的策略進行刪除,直到佔用的記憶體小於限制。

  

  redis支援的淘汰鍵的規則

規則 說明
volatile-lru 使用LRU演算法刪除一個鍵(只對設定了過期時間的鍵)
allkeys-lru 使用LRU演算法刪除一個鍵
volatile-random 隨機刪除一個鍵(只對設定了過期時間的鍵)
allkeys-random 隨機刪除一個鍵
volatile-ttl 刪除過期時間最近的一個鍵
noeviction 刪除過期時間最近的一個鍵

  LRU(Least Recently Used)演算法即”最近最少使用“,其認為最近最少使用的鍵在未來一段時間內也不會被用到。

 

排序 SORT

  15、對集合,列表,有序集合排序

    SORT key [ALPHA] [DESC] [LIMIT offset count]

    對有序集合進行排序時,會忽略元素的分數,預設情況下,SORT命令會嘗試將所有元素轉換成雙精度浮點數進行排序,轉換失敗則排序失敗。ALPHA引數用於指明使用字典順序排序;DESC引數指明按照從大到小排序,因為預設是從小到大;LIMIT引數用來返回指定範圍的結果,這兩個引數的用法與SQL一致。

  16、by參考鍵

    BY

    參考鍵可以是字串型別或雜湊型別(表示為鍵名->欄位名)的某一個欄位,如果SORT命令提供了by引數,那麼它將不再按照元素自身的值進行排序,而是用每個元素的值替換參考鍵中第一個" * "並獲取其值,當作排序的依據,如:

    SORT sortbylist BY itemscore:* (sortbylist為list型別,itemscore:*為字串型別)

    SORT posts BY post:*->time (posts為集合型別,post:*->time是雜湊型別的一個欄位)

    當參考鍵不包含" * "時,將不會執行排序操作;當參考鍵的值相同時,會根據元素本身做比較;當參考鍵不存在時,參考鍵的值預設為0;當參考鍵為雜湊型別時," * "只能出現在" -> "之前,否則" * "將不會被替換,會被認為是一個欄位名,即常量。

  17、get引數

    GET

    它的作用是使SORT命令返回的結果不是元素自身的值,而是由GET指定的值,如:

    SORT posts BY post:*->time DESC GET post:*->title GET post:*->time

    SORT posts BY post:*->time DESC GET post:*->title GET #

    一個SORT命令只能由一個BY引數,但可以由多個GET引數,GET #會返回元素本身,當GET的鍵不存在時會返回nil。

  18、store引數

    STORE

    預設情況SORT會直接返回排序結果,使用STORE引數將會把排序結果儲存到一個列表型別的鍵中,如果該鍵存在則會覆蓋,如:

    SORT posts BY post:*->time DESC GET post:*->title GET # STORE result

  19、sort的效能

    SORT 命令複雜度為O(n+mlog(m)),n表示待排序的鍵中元素的數量,m代表要返回的元素的數量。減少排序的樣本數量(n),使用LIMIT減少獲取排序結果的數量(m),使用STORE將結果快取都可以提高sort的效能。

  

訊息通知

  20、以阻塞方式獲取列表中的值

    BLPOP listkey timeout

    BRPOP listkey timeout

    當列表為空時,這個連線將會阻塞,imeout引數為超時時間,超出此時間仍沒有元素則返回nil,為0表示立刻返回;當獲得元素後,返回兩個值,分別是鍵名和元素值。

    可用於實現簡單訊息佇列。

  21、優先佇列的實現

    BLPOP key [key ...] timeout

    BRPOP key [key ...] timeout

    阻塞方式獲取佇列中的元素完整命令如上所述,可以彈出多個鍵中的元素,如果每一個鍵都沒有元素則返回nil,否則,會按照鍵從左到右的順序彈出一個元素。

  22、“釋出訂閱”模式

    此模式中有釋出者和訂閱者兩種角色,釋出者可以往指定頻道釋出訊息,所有訂閱此頻道的訂閱者都會收到訊息。

  23、釋出訊息

    PUBLISH channel message

    返回值為收到訊息的訂閱者數量,訊息不會被快取,新的訂閱者收不到舊的訊息。

  24、訂閱頻道

    SUBSCRIBE channel [channel ...]

    可以同時訂閱多個頻道,執行訂閱命令後會進入訂閱模式,此模式下只能執行屬於“釋出/訂閱”模式下的4個命令(SUBSCRIBE 、UNSUBSCRIBE、PSUBSCRIBE 、PUNSUBSCRIBE )。

    訂閱狀態的客戶端只會收到3種命令,每種命令都有3個值,第一個值是訊息型別,根據型別的不同,第二三個值意義也不同。

    a、subsrcibe 訂閱成功的反饋,引數分別是訂閱成功的頻道名和訂閱當前頻道的客戶端數量。

    b、message 收到訂閱訊息,引數為產生訊息的頻道和訊息內容。

    c、unsubscirbe 成功取消某個訂閱頻道,引數為頻道名和當前客戶端訂閱的頻道數量,當此值為0時,客戶端會退出訂閱狀態。

  25、取消訂閱與按照規則訂閱

    UNSUBSCRIBE [channel ...]

    PSUBSCRIBE 

    UNPSUBSCRIBE 

    取消訂閱的命令如果不帶引數,會取消所有訂閱的頻道;按規則訂閱支援訂閱名稱符合glob風格萬用字元格式的頻道;按規則取消用法類似。

    按規則訂閱時會出現重複訂閱一個頻道的情況,也會重複收到訊息,重複訊息(第二條開始)的訊息型別為pmessage,釋出者也會收到有多個客戶端收到訊息的回覆;取消訂閱時,通過普通訂閱和按規則訂閱的頻道不會互相影響(不會出現互相取消的情況),同時在取消按規則訂閱時,不再執行通配展開,而是字串匹配,只會取消按規則訂閱時的原字串對應的頻道。

 

管道

  26、redis-cli與redis-server使用TCP連線,傳送命令和傳送命令的執行結果都需要玩咯傳輸,這兩個部分的耗時稱為往返延時

  27、一般情況下,往返延時的數量級上相當於redis執行一個簡單命令的執行時間。

  28、redis底層通訊協議對管道(pipeline)提供了支援,通過管道一次性可以傳送多條命令並執行完後一次性將結果返回。

相關文章