redis-數據結構以及使用場景分析


redis 常見數據結構以及使用場景分析

  • String
  • Hash
  • List
  • Set
  • Sort Set (ZSet)

key

任何二進制序列都可以作為Redis的Key使用(例如普通的字符串或一張JPEG圖片)

關於Key的一些注意事項:

  • 不要使用過長的Key。例如使用一個1024字節的key就不是一個好主意,不僅會消耗更多的內存,還會導致查找的效率降低

  • Key短到缺失了可讀性也是不好的,例如"u1000flw"比起"user:1000:followers"來說,節省了寥寥的存儲空間,卻引發了可讀性和可維護性上的麻煩

  • 最好使用統一的規范來設計Key,比如"object-type🆔attr",以這一規范設計出的Key可能是"user:1000"或"comment🔢reply-to"

  • Redis允許的最大Key長度是512MB(對Value的長度限制也是512MB)

String

常用命令: set,get,decr,incr,mget 等。

字符串是最常用的數據類型,他能夠存儲任何類型的字符串,當然也包括二進制、JSON化的對象、甚至是Base64編碼之后的圖片。在Redis中一個字符串最大的容量為512MB.

常規key-value緩存應用; 常規計數:微博數,粉絲數等。

Hash

常用命令: hget,hset,hgetall 等。

hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象,后續操作的時候,你可以直接僅僅修改這個對象中的某個字段的值。 比如我們可以使用hash 數據結構來存儲用戶信息,商品信息等等。

List

常用命令: lpush,rpush,lpop,rpop,lrange等

list 就是鏈表,Redis list的應用場景非常多,也是Redis最重要的數據結構之一,比如微博的關注列表,粉絲列表,消息列表等功能都可以用Redis的 list 結構來實現。

Redis list 的實現為一個雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內存開銷。

另外可以通過 lrange 命令,就是從某個元素開始讀取多少個元素,可以基於 list 實現分頁查詢,這個很棒的一個功能,基於 redis 實現簡單的高性能分頁,可以做類似微博那種下拉不斷分頁的東西(一頁一頁的往下走),性能高。

換句話說,Redis的List實際是設計來用於實現隊列,而不是用於實現類似ArrayList這樣的列表的。如果你不是想要實現一個雙端出入的隊列,那么請盡量不要使用Redis的List數據結構。

為了更好支持隊列的特性,Redis還提供了一系列阻塞式的操作命令,如BLPOP/BRPOP等,能夠實現類似於BlockingQueue的能力,即在List為空時,阻塞該連接,直到List中有對象可以出隊時再返回。

Set

常用命令: sadd,spop,smembers,sunion 等

set 對外提供的功能與list類似是一個列表的功能,特殊之處在於 set 是可以自動排重的。

當你需要存儲一個列表數據,又不希望出現重復數據時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。可以基於 set 輕易實現交集、並集、差集的操作。

比如:在微博應用中,可以將一個用戶所有的關注人存在一個集合中,將其所有粉絲存在一個集合。Redis可以非常方便的實現如共同關注、共同粉絲、共同喜好等功能。這個過程也就是求交集的過程,具體命令如下:

sinterstore key1 key2 key3     將交集存在key1內

Sorted Set

常用命令: zadd,zrange,zrem,zcard等

和set相比,sorted set增加了一個權重參數score,使得集合中的元素能夠按score進行有序排列。

舉例: 在直播系統中,實時排行信息包含直播間在線用戶列表,各種禮物排行榜,彈幕消息(可以理解為按消息維度的消息排行榜)等信息,適合使用 Redis 中的 Sorted Set 結構進行存儲。

Bitmap和HyperLogLog

Redis的這兩種數據結構相較之前的並不常用,在本文中只做簡要介紹

Bitmap在Redis中不是一種實際的數據類型,而是一種將String作為Bitmap使用的方法。可以理解為將String轉換為bit數組。使用Bitmap來存儲true/false類型的簡單數據極為節省空間。

HyperLogLogs是一種主要用於數量統計的數據結構,它和Set類似,維護一個不可重復的String集合,但是HyperLogLogs並不維護具體的member內容,只維護member的個數。也就是說,HyperLogLogs只能用於計算一個集合中不重復的元素數量,所以它比Set要節省很多內存空間。

Pub/Sub

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM