寫在前面
學習《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)提供了支援,通過管道一次性可以傳送多條命令並執行完後一次性將結果返回。