Redis 資料結構使用場景

github.thinkingbar.com發表於2014-09-04

 一、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 還提供了下面一些操作:

  • LEN niushuai:O(1)獲取字串長度
  • APPEND niushuai redis:往字串 append 內容,而且採用智慧分配記憶體(每次2倍)
  • 設定和獲取字串的某一段內容
  • 設定及獲取字串的某一位(bit)
  • 批量設定一系列字串的內容
  • 原子計數器
  • 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 中某一段的元素。

  • 微博 TimeLine
  • 訊息佇列

  4. Set——集合

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

  • 共同好友、二度好友
  • 利用唯一性,可以統計訪問網站的所有獨立 IP
  • 好友推薦的時候,根據 tag 求交集,大於某個 threshold 就可以推薦

  5. Sorted Set——有序集合

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

  • 帶有權重的元素,比如一個遊戲的使用者得分排行榜
  • 比較複雜的資料結構,一般用到的場景不算太多

 二、redis 其他功能使用場景

  1. 訂閱-釋出系統

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

  2. 事務——Transactions

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

相關文章