學習《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)算法即」最近最少使用「,其認爲最近最少使用的鍵在將來一段時間內也不會被用到。
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)提供了支持,經過管道一次性能夠發送多條命令並執行完後一次性將結果返回。