redis的資料結構及使用場景
一、redis資料結構的使用場景
redis有五種資料結構分別是:
String——字串
Hash——字典
List——列表
Set——集合
Sorted Set——有序集合
下面我們就來簡單說明一下他們各自的使用場景:
1.String
String資料結構是簡單的Key-Value型別,value不僅可以是String,也可以是數字(當數字型別用Long可以表示的時候encoding就是整型,其他都儲存在sdshdr當作字串)。使用String型別,可以完全實現目前Memcached的功能,並且效率更高。還可以享受redis的定時持久化(可以選擇RDB模式或者AOF模式),操作日誌及Replication等功能。除了提供與Memcached一樣的get、set、incr、decr等操作外,redis還提供了下面的一些操作:
1.LEN niushuai:O(1)獲取字串長度
2.APPEND niushuai redis:往字串 append 內容,而且採用智慧分配記憶體(每次2倍)
3.設定和獲取字串的某一段內容
4.設定及獲取字串的某一位(bit)
5.批量設定一系列字串的內容
6.原子計數器
7.GETSET 命令的妙用,請於清空舊值的同時設定一個新值,配合原子計數器使用
2.Hash
在Memcached中,我們經常將一些結構化的資訊打包成HashMap,在客戶端序列化後儲存為一個字串的值(一般是JSON格式),比如使用者的暱稱、年齡、性別等。這時候在需要修改其中一項時,通常需要將字串(JSON)取出來,然後進行反序列化,修改某一項的值,在序列化成字串(JSON)儲存回去。簡單修改一個屬性就幹這麼多事,消耗必定是很大的,也不適用一些可能併發操作的場合(比如兩個併發的操作都需要修改年齡)。而redis的Hash結構可以使你像在資料庫中Update一個屬性一樣只修改某一項屬性值。(儲存、讀取、修改使用者屬性)
3.List
List說白了就是連結串列(redis使用雙端連結串列實現的List),相信學過資料結構知識的人都應該理解其結構。使用List結構,我們可以輕鬆的實現最新訊息排行等功能(比如新浪部落格的TimeLine)。List的另一個應用就是訊息佇列,可以利用List的Push操作,將任務存在List中,然後工作執行緒再用PoP操作將任務取出進行執行。Redis還提供了操作List中某一段元素的API,你可以直接查詢,刪除List中某一段的元素。
4.Set
Set就是一個集合,集合的概念就是一堆不重複值的組合。利用Redis提供的Set資料結構,可以儲存一些集合性的資料。比如在微博應用中,可以將一個使用者所有的關注人存在一個集合中,將其所有的粉絲存在一個集合。因為Redis非常人性化的為集合提供了求交集、並集、差集等操作,那麼就可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存到一個新的集合中。
1.共同好友、二度好友
2.利用唯一性,可以統計訪問網站的所有獨立 IP
3.好友推薦的時候,根據 tag 求交集,大於某個 threshold 就可以推薦
5.Sorted Set
和Set相比,Sorted Set是將set中的元素增加了一個權重引數score,使得集合中的元素能夠按score進行有序排列,比如一個儲存全班同學成績的Sorted Set,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序。另外還可以用Sorted Set來做帶權重的佇列,比如普通訊息的score為1,重要訊息為2,然後工作執行緒可以選擇sore的倒序來獲取工作任務。讓重要的任務優先執行。
二、redis其他功能使用場景
1.訂閱-釋出系統
Pub/Sub從字面上理解就是釋出(Publish)與訂閱(Subscribe),在redis中,你可以設定對某一個key值進行訊息釋出及訊息訂閱,當一個key值上進行了訊息釋出後,所有訂閱他的客戶端都會收到相應的訊息。這一功能最明顯的用法就是用作實時訊息系統。
2.事務
誰說NoSql都不支援事務,雖然redis的事務提供的並不是嚴格的ACID的事務(比如一串用EXEC提交執行的命令,在執行中伺服器宕機,那麼會有一部分命令執行了,剩下的沒執行),但是這個事務還是提供了基本的命令打包執行的功能(在伺服器不出問題的情況下,可以保證一連串的命令是順序在一起執行的,中間會有其他客戶端命令插進來執行)。redis還提供了一個watch功能,你可以對一個key進行watch,然後再執行事務,在這個過程中,如果這個watch的值進行了修改,那麼這個事務會發現並拒絕執行。