天天看點

Redis中5種資料結構的使用場景介紹

這篇文章主要介紹了redis中5種資料結構的使用場景介紹,本文對redis中的5種資料類型string、hash、list、set、sorted set做了講解,需要的朋友可以參考下。

<b>一、redis 資料結構使用場景</b>

原來看過 redisbook 這本書,對 redis 的基本功能都已經熟悉了,從上周開始看 redis 的源碼。目前目标是吃透 redis 的資料結構。我們都知道,在 redis 中一共有5種資料結構,那每種資料結構的使用場景都是什麼呢?

string——字元串

hash——字典

list——清單

set——集合

sorted set——有序集合

下面我們就來簡單說明一下它們各自的使用場景:

1. string——字元串

string 資料結構是簡單的 key-value 類型,value 不僅可以是 string,也可以是數字(當數字類型用 long 可以表示的時候encoding 就是整型,其他都存儲在 sdshdr 當做字元串)。使用 strings 類型,可以完全實作目前 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 中某一段的元素。

1.微網誌 timeline

2.消息隊列

4. set——集合

set 就是一個集合,集合的概念就是一堆不重複值的組合。利用 redis 提供的 set 資料結構,可以存儲一些集合性的資料。比如在微網誌應用中,可以将一個使用者所有的關注人存在一個集合中,将其所有粉絲存在一個集合。因為 redis 非常人性化的為集合提供了求交集、并集、差集等操作,那麼就可以非常友善的實作如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的指令選擇将結果傳回給用戶端還是存集到一個新的集合中。

1.共同好友、二度好友

2.利用唯一性,可以統計通路網站的所有獨立 ip

3.好友推薦的時候,根據 tag 求交集,大于某個 threshold 就可以推薦

5. sorted set——有序集合

和sets相比,sorted sets是将 set 中的元素增加了一個權重參數 score,使得集合中的元素能夠按 score 進行有序排列,比如一個存儲全班同學成績的 sorted sets,其集合 value 可以是同學的學号,而 score 就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序。另外還可以用 sorted sets 來做帶權重的隊列,比如普通消息的 score 為1,重要消息的 score 為2,然後工作線程可以選擇按 score 的倒序來擷取工作任務。讓重要的任務優先執行。

1.帶有權重的元素,比如一個遊戲的使用者得分排行榜

2.比較複雜的資料結構,一般用到的場景不算太多

<b>二、redis 其他功能使用場景</b>

1. 訂閱-釋出系統

pub/sub 從字面上了解就是釋出(publish)與訂閱(subscribe),在 redis 中,你可以設定對某一個 key 值進行消息釋出及消息訂閱,當一個 key 值上進行了消息釋出後,所有訂閱它的用戶端都會收到相應的消息。這一功能最明顯的用法就是用作實時消息系統,比如普通的即時聊天,群聊等功能。

2. 事務——transactions

誰說 nosql 都不支援事務,雖然 redis 的 transactions 提供的并不是嚴格的 acid 的事務(比如一串用 exec 送出執行的指令,在執行中伺服器當機,那麼會有一部分指令執行了,剩下的沒執行),但是這個 transactions 還是提供了基本的指令打包執行的功能(在伺服器不出問題的情況下,可以保證一連串的指令是順序在一起執行的,中間有會有其它用戶端指令插進來執行)。redis 還提供了一個 watch 功能,你可以對一個 key 進行 watch,然後再執行 transactions,在這過程中,如果這個 watched 的值進行了修改,那麼這個 transactions 會發現并拒絕執行。