標籤:blog http os io 使用 ar 資料 問題 cti
長生劍、孔雀翎、碧玉刀、多情環、離別鉤、霸王槍、拳頭是古龍筆下的七種武器,而本文打算將Redis的幾種使用方式 Strings、Hashs、Lists、Sets、Sorted Sets、Pub/Sub、Transactions 也比作七種武器,為大家講解Redis的七種特性,並列舉其適合的應用情境。
Strings
Strings 資料結構是簡單的key-value類型,value其實不僅是String,也可以是數字。使用Strings類型,你可以完全實現目前 Memcached 的功能,並且效率更高。還可以享受Redis的定時持久化,動作記錄及 Replication等功能。除了提供與 Memcached 一樣的get、set、incr、decr 等操作外,Redis還提供了下面一些操作:
- 擷取字串長度
- 往字串append內容
- 設定和擷取字串的某一段內容
- 設定及擷取字串的某一位(bit)
- 大量設定一系列字串的內容
Hashs
在Memcached中,我們經常將一些結構化的資訊打包成hashmap,在用戶端序列化後儲存為一個字串的值,比如使用者的暱稱、年齡、性別、 積分等,這時候在需要修改其中某一項時,通常需要將所有值取出還原序列化後,修改某一項的值,再序列化儲存回去。這樣不僅增大了開銷,也不適用於一些可能並 發操作的場合(比如兩個並發的操作都需要修改積分)。而Redis的Hash結構可以使你像在資料庫中Update一個屬性一樣只修改某一項屬性值。
Lists
Lists 就是鏈表,相信略有資料結構知識的人都應該能理解其結構。使用Lists結構,我們可以輕鬆地實現最新訊息排行等功能。Lists的另一個應用就是訊息隊 列,可以利用Lists的PUSH操作,將任務存在Lists中,然後背景工作執行緒再用POP操作將任務取出進行執行。Redis還提供了操作Lists中某 一段的api,你可以直接查詢,刪除Lists中某一段的元素。
Sets
Sets 就是一個集合,集合的概念就是一堆不重複值的組合。利用Redis提供的Sets資料結構,可以儲存一些集合性的資料,比如在微博應用中,可以將一個使用者 所有的關注人存在一個集合中,將其所有粉絲存在一個集合。Redis還為集合提供了求交集、並集、差集等操作,可以非常方便的實現如共同關注、共同喜好、 二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給用戶端還是存集到一個新的集合中。
Sorted Sets
和Sets相比,Sorted Sets增加了一個權重參數score,使得集合中的元素能夠按score進行有序排列,比如一個儲存全班同學成績的Sorted Sets,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序。另外還可以用 Sorted Sets來做帶權重的隊列,比如普通訊息的score為1,重要訊息的score為2,然後背景工作執行緒可以選擇按score的倒序來擷取工作任務。讓重要的 任務優先執行。
Pub/Sub
Pub/Sub 從字面上理解就是發布(Publish)與訂閱(Subscribe),在Redis中,你可以設定對某一個key值進行訊息發布及訊息訂閱,當一個 key值上進行了訊息發布後,所有訂閱它的用戶端都會收到相應的訊息。這一功能最明顯的用法就是用作即時訊息系統,比如普通的即時聊天,群聊等功能。
Transactions
誰說NoSQL都不支援事務,雖然Redis的Transactions提供的並不是嚴格的ACID的事務(比如一串用EXEC提交執行的命令,在 執行中伺服器宕機,那麼會有一部分命令執行了,剩下的沒執行),但是這個Transactions還是提供了基本的命令打包執行的功能(在伺服器不出問題 的情況下,可以保證一連串的命令是順序在一起執行的,中間有會有其它用戶端命令插進來執行)。Redis還提供了一個Watch功能,你可以對一個key 進行Watch,然後再執行Transactions,在這過程中,如果這個Watched的值進行了修改,那麼這個Transactions會發現並拒 絕執行。
好了,本文就先說到這裡,上面這些這隻是Redis API的一些使用方式,可謂冰山一角,Redis就像一把瑞士軍刀一樣(或者是更萬能的中國軍鏟),它創造了一系列更接近於應用情境的資料結構和API,目的在於讓我們更直接的基於應用情境進行儲存設計。更多的應用情境和組合式的應用還有待您自己的發掘。或者多關注本站(NoSQLFan.COM),你也能發現一些有意思的基於Redis的應用
Redis之七種武器