5種數(shù)據(jù)結(jié)構(gòu)組成了Redis的基礎(chǔ),其他沒有關(guān)聯(lián)特定數(shù)據(jù)結(jié)構(gòu)的命令也有很多。我們已經(jīng)看過一些這樣的命令:info
,select
,?flushdb
,?multi
,?exec
,?discard
,?watch
和keys
。這一章將看看其他的一些重要命令。
Redis允許你標記一個關(guān)鍵字的使用期限。你可以給予一個Unix時間戳形式(自1970年1月1日起)的絕對時間,或者一個基于秒的存活時間。這是一個基于關(guān)鍵字的命令,因此其不在乎關(guān)鍵字表示的是哪種類型的數(shù)據(jù)結(jié)構(gòu)。
expire pages:about 30
expireat pages:about 1356933600
第一個命令將會在30秒后刪除掉關(guān)鍵字(包括其關(guān)聯(lián)的值)。第二個命令則會在2012年12月31日上午12點刪除掉關(guān)鍵字。
這讓Redis能成為一個理想的緩沖引擎。通過ttl
命令,你可以知道一個關(guān)鍵字還能夠存活多久。而通過persist
命令,你可以把一個關(guān)鍵字的使用期限刪除掉。
ttl pages:about
persist pages:about
最后,有個特殊的字符串命令,setex
命令讓你可以在一個單獨的原子命令里設(shè)置一個字符串值,同時里指定一個生存期(這比任何事情都要方便)。
setex pages:about 30 '<h1>about us</h1>....'
Redis的列表數(shù)據(jù)結(jié)構(gòu)有blpop
和brpop
命令,能從列表里返回且刪除第一個(或最后一個)元素,或者被堵塞,直到有一個元素可供操作。這可以用來實現(xiàn)一個簡單的隊列。
(譯注:對于blpop
和brpop
命令,如果列表里沒有關(guān)鍵字可供操作,連接將被堵塞,直到有另外的Redis客戶端使用lpush
或rpush
命令推入關(guān)鍵字為止。)
此外,Redis對于消息發(fā)布和頻道訂閱有著一流的支持。你可以打開第二個redis-cli
窗口,去嘗試一下這些功能。在第一個窗口里訂閱一個頻道(我們會稱它為warnings
):
subscribe warnings
其將會答復你訂閱的信息?,F(xiàn)在,在另一個窗口,發(fā)布一條消息到warnings
頻道:
publish warnings "it's over 9000!"
如果你回到第一個窗口,你應(yīng)該已經(jīng)接收到warnings
頻道發(fā)來的消息。
你可以訂閱多個頻道(subscribe channel1 channel2 ...
),訂閱一組基于模式的頻道(psubscribe warnings:*
),以及使用unsubscribe
和punsubscribe
命令停止監(jiān)聽一個或多個頻道,或一個頻道模式。
最后,可以注意到publish
命令的返回值是1,這指出了接收到消息的客戶端數(shù)量。
monitor
命令可以讓你查看Redis正在做什么。這是一個優(yōu)秀的調(diào)試工具,能讓你了解你的程序如何與Redis進行交互。在兩個redis-cli
窗口中選一個(如果其中一個還處于訂閱狀態(tài),你可以使用unsubscribe
命令退訂,或者直接關(guān)掉窗口再重新打開一個新窗口)鍵入monitor
命令。在另一個窗口,執(zhí)行任何其他類型的命令(例如get
或set
命令)。在第一個窗口里,你應(yīng)該可以看到這些命令,包括他們的參數(shù)。
在實際生產(chǎn)環(huán)境里,你應(yīng)該謹慎運行monitor
命令,這真的僅僅就是一個很有用的調(diào)試和開發(fā)工具。除此之外,沒有更多要說的了。
隨同monitor
命令一起,Redis擁有一個slowlog
命令,這是一個優(yōu)秀的性能剖析工具。其會記錄執(zhí)行時間超過一定數(shù)量微秒的命令。在下一章節(jié),我們會簡略地涉及如何配置Redis,現(xiàn)在你可以按下面的輸入配置Redis去記錄所有的命令:
config set slowlog-log-slower-than 0
然后,執(zhí)行一些命令。最后,你可以檢索到所有日志,或者檢索最近的那些日志:
slowlog get
slowlog get 10
通過鍵入slowlog len
,你可以獲取延遲日志里的日志數(shù)量。
對于每個被你鍵入的命令,你應(yīng)該查看4個參數(shù):
一個自動遞增的id
一個Unix時間戳,表示命令開始運行的時間
一個微妙級的時間,顯示命令運行的總時間
延遲日志保存在存儲器中,因此在生產(chǎn)環(huán)境中運行(即使有一個低閥值)也應(yīng)該不是一個問題。默認情況下,它將會追蹤最近的1024個日志。
sort
命令是Redis最強大的命令之一。它讓你可以在一個列表、集合或者分類集合里對值進行排序(分類集合是通過標記來進行排序,而不是集合里的成員)。下面是一個sort
命令的簡單用例:
rpush users:leto:guesses 5 9 10 2 4 10 19 2
sort users:leto:guesses
這將返回進行升序排序后的值。這里有一個更高級的例子:
sadd friends:ghanima leto paul chani jessica alia duncan
sort friends:ghanima limit 0 3 desc alpha
上面的命令向我們展示了,如何對已排序的記錄進行分頁(通過limit
),如何返回降序排序的結(jié)果(通過desc
),以及如何用字典序排序代替數(shù)值序排序(通過alpha
)。
sort
命令的真正力量是其基于引用對象來進行排序的能力。早先的時候,我們說明了列表、集合和分類集合很常被用于引用其他的Redis對象,sort
命令能夠解引用這些關(guān)系,而且通過潛在值來進行排序。例如,假設(shè)我們有一個Bug追蹤器能讓用戶看到各類已存在問題。我們可能使用一個集合數(shù)據(jù)結(jié)構(gòu)去追蹤正在被監(jiān)視的問題:
sadd watch:leto 12339 1382 338 9338
你可能會有強烈的感覺,想要通過id來排序這些問題(默認的排序就是這樣的),但是,我們更可能是通過問題的嚴重性來對這些問題進行排序。為此,我們要告訴Redis將使用什么模式來進行排序。首先,為了可以看到一個有意義的結(jié)果,讓我們添加多一點數(shù)據(jù):
set severity:12339 3
set severity:1382 2
set severity:338 5
set severity:9338 4
要通過問題的嚴重性來降序排序這些Bug,你可以這樣做:
sort watch:leto by severity:* desc
Redis將會用存儲在列表(集合或分類集合)中的值去替代模式中的*
(通過by
)。這會創(chuàng)建出關(guān)鍵字名字,Redis將通過查詢其實際值來排序。
在Redis里,雖然你可以有成千上萬個關(guān)鍵字,類似上面展示的關(guān)系還是會引起一些混亂。幸好,sort
命令也可以工作在散列數(shù)據(jù)結(jié)構(gòu)及其相關(guān)域里。相對于擁有大量的高層次關(guān)鍵字,你可以利用散列:
hset bug:12339 severity 3
hset bug:12339 priority 1
hset bug:12339 details "{id: 12339, ....}"
hset bug:1382 severity 2
hset bug:1382 priority 2
hset bug:1382 details "{id: 1382, ....}"
hset bug:338 severity 5
hset bug:338 priority 3
hset bug:338 details "{id: 338, ....}"
hset bug:9338 severity 4
hset bug:9338 priority 2
hset bug:9338 details "{id: 9338, ....}"
所有的事情不僅變得更為容易管理,而且我們能通過severity
或priority
來進行排序,還可以告訴sort
命令具體要檢索出哪一個域的數(shù)據(jù):
sort watch:leto by bug:*->priority get bug:*->details
相同的值替代出現(xiàn)了,但Redis還能識別->
符號,用它來查看散列中指定的域。里面還包括了get
參數(shù),這里也會進行值替代和域查看,從而檢索出Bug的細節(jié)(details域的數(shù)據(jù))。
對于太大的集合,sort
命令的執(zhí)行可能會變得很慢。好消息是,sort
命令的輸出可以被存儲起來:
sort watch:leto by bug:*->priority get bug:*->details store watch_by_priority:leto
使用我們已經(jīng)看過的expiration
命令,再結(jié)合sort
命令的store
能力,這是一個美妙的組合。
這一章主要關(guān)注那些非特定數(shù)據(jù)結(jié)構(gòu)關(guān)聯(lián)的命令。和其他事情一樣,它們的使用依情況而定。構(gòu)建一個程序或特性時,可能不會用到使用期限、發(fā)布和訂閱或者排序等功能。但知道這些功能的存在是很好的。而且,我們也只接觸到了一些命令。還有更多的命令,當你消化理解完這本書后,非常值得去瀏覽一下完整的命令列表。
更多建議: