下面由Redis教學欄位來介紹Redis中5種資料結構的使用場景,本文對Redis中的5種資料型別String、Hash、List 、Set、Sorted Set做了解說,需要的朋友可以參考下!
一、redis 資料結構使用場景
原來看過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 命令的妙用,请于清空旧值的同时设置一个新值,配合原子计数器使用
1.Hash——字典
在Memcached 中,我們經常將一些結構化的資訊打包成hashmap,在客戶端序列化後儲存為字串的值(一般是JSON 格式),例如使用者的暱稱、年齡、性別、積分等。這時候在需要修改其中某一項時,通常需要將字串(JSON)取出來,然後進行反序列化,修改某一項的值,再序列化成字串(JSON)存放回去。簡單修改一個屬性就乾這麼多事情,消耗必定是很大的,也不適用於一些可能並發操作的場合(例如兩個並發的操作都需要修改積分)。而 Redis 的 Hash 結構可以讓你像在資料庫中 Update 一個屬性一樣只修改某一項屬性值。
存储、读取、修改用户属性
1.List——清單
List 說白了是鍊錶(redis 使用雙端鍊錶實現的List),相信學過資料結構知識的人都應該能理解其結構。使用 List 結構,我們可以輕鬆實現最新訊息排行等功能(例如新浪微博的 TimeLine )。 List 的另一個應用是訊息佇列,可以利用 List 的 *PUSH 操作,將任務存在於 List 中,然後工作執行緒再用 POP 操作將任務取出執行。 Redis 也提供了操作List 中某一段元素的API,你可以直接查詢,刪除List 中某一段的元素
1.微博 TimeLine 2.消息队列
1.Set-集合
Set 就是一個集合,集合的概念就是一堆不重複值的組合。利用 Redis 提供的 Set 資料結構,可以儲存一些集合性的資料。例如在微博應用程式中,可以將一個用戶所有的追蹤人存在一個集合中,將其所有粉絲存在一個集合。因為Redis 非常人性化的為集合提供了求交集、並集、差集等操作,那麼就可以非常方便的實現如共同關注、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果傳回給客戶端還是存集到一個新的集合。
1.共同好友、二度好友 2.利用唯一性,可以统计访问网站的所有独立 IP 3.好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐
1.Sorted Set—有序集合
和Sets相比,Sorted Sets是將Set 中的元素增加了一個權重參數score,使得集合中的元素能夠按score 進行有序排列,例如一個儲存全班同學成績的Sorted Sets,其集合value可以是同學的學號,而score 就可以是其考試得分,這樣在資料插入集合的時候,就已經進行了天然的排序。另外也可以用 Sorted Sets 來做有權重的佇列,例如普通訊息的 score 為1,重要訊息的 score 為2,然後工作執行緒可以選擇按 score 的倒序來取得工作任務。讓重要的任務優先執行。
1.帶有權重的元素,例如一個遊戲的使用者得分排行榜
2.比較複雜的資料結構,一般用到的場景不算太多
二、 redis 其他功能使用場景
1.訂閱-發布系統
Pub/Sub 從字面上理解就是發布(Publish)與訂閱(Subscribe),在Redis 中,你可以設定對某一個key 值進行訊息發佈及訊息訂閱,當一個key 值上進行了訊息發布後,所有訂閱它的客戶端都會收到對應的訊息。這項功能最明顯的用法就是用作即時訊息系統,例如普通的即時聊天,群組聊天等功能。
1.事務-Transactions
誰說NoSQL 都不支援事務,雖然Redis 的Transactions 提供的並不是嚴格的ACID 的事務(例如一串用EXEC 提交執行的命令,在執行中伺服器宕機,那麼會有一部分指令執行了,剩下的沒執行),但是這個Transactions 還是提供了基本的指令打包執行的功能(在伺服器不出問題的情況下,可以保證一連串的指令是順序在一起執行的,中間有會有其它客戶端指令插進來執行)。 Redis 也提供了一個 Watch 功能,你可以對一個 key 進行 Watch,然後再執行 Transactions,在這個過程中,如果這個 Watched 的值進行了修改,那麼這個 Transactions 會發現並拒絕執行。