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

寫在前面

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

 

事務

  一、redis中的事務由一組命令的集合組成,要麼都執行,要麼都不執行,同時redis的事務還能夠保證事務內的命令會依次執行不被其餘命令插入。算法

  二、命令MULTI開啓事務,以後發送一些列須要執行的指令,最後發送EXEC執行事務,一旦成功發送EXEC,全部的命令就必定會被執行。數據庫

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

  四、當redis事務中的命令發生了運行錯誤時,好比使用散列類型的命令操做集合類型,這種錯誤在語法檢查階段沒法發現,出現運行錯誤的命令,在返回內容中將有錯誤信息,其餘命令依然會正常執行。數據結構

  五、redis事務沒有關係數據庫事務提供的回滾功能。dom

  六、WATCH命令能夠監控一個或多個鍵,一旦其中有一個鍵被修改,那以後的一個事務就不會執行,監控一直持續到事務執行(即EXEC)以前,由於事務中的命令會在EXEC以後執行,因此這個事務中能夠修改剛纔WATCH監控的鍵。post

  七、執行EXEC以後會取消對全部鍵的監控,也能夠經過UNWATCH來取消監控。性能

 

過時時間

  八、設置過時時間學習

    EXPIRE key secondsserver

    redis能夠爲每個頂層數據結構(5種)的鍵設置過時時間,過時後將自動刪除,過時時間爲秒,表示還剩多少時間就會刪除這個鍵。返回1表示設置成功,0失敗。

  九、查看剩餘過時時間

TTL key

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

十、取消過時時間

PERSIST key

除此以外,使用SET或GETSET(先設置新的值,在返回舊的值)爲鍵賦值,也會清除過時時間,須要再次設置,其餘對鍵值操做的命令不會對過時時間產生影響。

十一、PEXPIRE key millisecond

以毫秒爲單位設置過時時間

十二、以UNIX時間設置過時時間

EXPIREAT key seconds

PEXPIREAT key millisecond

1三、若是WATCH命令監控了一個有過時時間的鍵,該鍵時間到期自動刪除不會被WATCH認爲該鍵被改變。

  1四、過時時間這一特性使redis能夠看成緩存使用,當緩存的數量越多,達到redis最大可用內存大小(經過配置文件的maxmemory修改),將會根據maxmemory-policy參數指定的策略進行刪除,直到佔用的內存小於限制。

  

  redis支持的淘汰鍵的規則

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

  LRU(Least Recently Used)算法即」最近最少使用「,其認爲最近最少使用的鍵在將來一段時間內也不會被用到。

 

排序 SORT

  1五、對集合,列表,有序集合排序

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

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

  1六、by參考鍵

    BY

    參考鍵能夠是字符串類型或散列類型(表示爲鍵名->字段名)的某一個字段,若是SORT命令提供了by參數,那麼它將再也不按照元素自身的值進行排序,而是用每一個元素的值替換參考鍵中第一個" * "並獲取其值,看成排序的依據,如:

    SORT sortbylist BY itemscore:* (sortbylist爲list類型,itemscore:*爲字符串類型)

    SORT posts BY post:*->time (posts爲集合類型,post:*->time是散列類型的一個字段)

    當參考鍵不包含" * "時,將不會執行排序操做;當參考鍵的值相同時,會根據元素自己作比較;當參考鍵不存在時,參考鍵的值默認爲0;當參考鍵爲散列類型時," * "只能出如今" -> "以前,不然" * "將不會被替換,會被認爲是一個字段名,即常量。

  1七、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。

  1八、store參數

    STORE

    默認狀況SORT會直接返回排序結果,使用STORE參數將會把排序結果存儲到一個列表類型的鍵中,若是該鍵存在則會覆蓋,如:

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

  1九、sort的性能

    SORT 命令複雜度爲O(n+mlog(m)),n表示待排序的鍵中元素的數量,m表明要返回的元素的數量。減小排序的樣本數量(n),使用LIMIT減小獲取排序結果的數量(m),使用STORE將結果緩存均可以提升sort的性能。

  

消息通知

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

    BLPOP listkey timeout

    BRPOP listkey timeout

    當列表爲空時,這個鏈接將會阻塞,imeout參數爲超時時間,超出此時間仍沒有元素則返回nil,爲0表示馬上返回;當得到元素後,返回兩個值,分別是鍵名和元素值。

    可用於實現簡單消息隊列。

  2一、優先隊列的實現

    BLPOP key [key ...] timeout

    BRPOP key [key ...] timeout

    阻塞方式獲取隊列中的元素完整命令如上所述,能夠彈出多個鍵中的元素,若是每個鍵都沒有元素則返回nil,不然,會按照鍵從左到右的順序彈出一個元素。

  2二、「發佈訂閱」模式

    此模式中有發佈者和訂閱者兩種角色,發佈者能夠往指定頻道發佈消息,全部訂閱此頻道的訂閱者都會收到消息。

  2三、發佈消息

    PUBLISH channel message

    返回值爲收到消息的訂閱者數量,消息不會被緩存,新的訂閱者收不到舊的消息。

  2四、訂閱頻道

    SUBSCRIBE channel [channel ...]

    能夠同時訂閱多個頻道,執行訂閱命令後會進入訂閱模式,此模式下只能執行屬於「發佈/訂閱」模式下的4個命令(SUBSCRIBE 、UNSUBSCRIBE、PSUBSCRIBE 、PUNSUBSCRIBE )。

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

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

    b、message 收到訂閱消息,參數爲產生消息的頻道和消息內容。

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

  2五、取消訂閱與按照規則訂閱

    UNSUBSCRIBE [channel ...]

    PSUBSCRIBE 

    UNPSUBSCRIBE 

    取消訂閱的命令若是不帶參數,會取消全部訂閱的頻道;按規則訂閱支持訂閱名稱符合glob風格通配符格式的頻道;按規則取消用法相似。

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

 

管道

  2六、redis-cli與redis-server使用TCP鏈接,發送命令和發送命令的執行結果都須要玩咯傳輸,這兩個部分的耗時稱爲往返延時

  2七、通常狀況下,往返延時的數量級上至關於redis執行一個簡單命令的執行時間。

  2八、redis底層通訊協議對管道(pipeline)提供了支持,經過管道一次性能夠發送多條命令並執行完後一次性將結果返回。

相關文章
相關標籤/搜索