【Redis】Redis5.x支持的6中數據類型

目錄

1. 字符串(Strings)

2. 列表(Lists)

3. 集合(Sets)

4. 哈希(Hashes)

5. 有序集合(Sorted sets)

6. 流(Streams)

Streams 基礎知識


Reids是一種基於內存的數據庫,並且提供一定的持久化功能,他是一種鍵值對數據庫(key-value),使用key作爲索引找到當前緩存的數據,並且返回給程序調用者。當前redis支持6中數據類型,他們分別是 String(字符串)、List(本質是雙向鏈表)、set(無序不重複的集合)、hash(哈希結構)、有序結構(zset) 和 流(Streams) 。使用redis編程要熟悉這6中數據類型。


1. 字符串(Strings)

字符串是一種最基本的Redis值類型。Redis字符串是二進制安全的,這意味着一個Redis字符串能包含任意類型的數據,例如: 一張JPEG格式的圖片或者一個序列化的Ruby對象。

一個字符串類型的值最多能存儲512M字節的內容。

你可以用Redis字符串做許多有趣的事,例如你可以:

  • 利用INCR命令簇(INCRDECRINCRBY)來把字符串當作原子計數器使用。
  • 使用APPEND命令在字符串後添加內容。
  • 將字符串作爲GETRANGE 和 SETRANGE的隨機訪問向量。
  • 在小空間裏編碼大量數據,或者使用 GETBIT 和 SETBIT創建一個Redis支持的Bloom過濾器。

2. 列表(Lists)

Redis列表是簡單的字符串列表,按照插入順序排序。 你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。

LPUSH 命令插入一個新元素到列表頭部,而RPUSH命令 插入一個新元素到列表的尾部。當 對一個空key執行其中某個命令時,將會創建一個新表。 類似的,如果一個操作要清空列表,那麼key會從對應的key空間刪除。這是個非常便利的語義, 因爲如果使用一個不存在的key作爲參數,所有的列表命令都會像在對一個空表操作一樣。

一些列表操作及其結果:

LPUSH mylist a   # now the list is "a"
LPUSH mylist b   # now the list is "b","a"
RPUSH mylist c   # now the list is "b","a","c" (RPUSH was used this time)

一個列表最多可以包含2^32 - 1個元素(4294967295,每個表超過40億個元素)。

從時間複雜度的角度來看,Redis列表主要的特性就是支持時間常數的 插入和靠近頭尾部元素的刪除,即使是需要插入上百萬的條目。 訪問列表兩端的元素是非常快的,但如果你試着訪問一個非常大 的列表的中間元素仍然是十分慢的,因爲那是一個時間複雜度爲 O(N) 的操作。

你可以用Redis列表做許多有趣的事,例如你可以:

  • 在社交網絡中建立一個時間線模型,使用LPUSH去添加新的元素到用戶時間線中,使用LRANGE去檢索一些最近插入的條目。
  • 你可以同時使用LPUSHLTRIM去創建一個永遠不會超過指定元素數目的列表並同時記住最後的N個元素。
  • 列表可以用來當作消息傳遞的基元(primitive),例如,衆所周知的用來創建後臺任務的Resque Ruby庫。
  • 你可以使用列表做更多事,這個數據類型支持許多命令,包括像BLPOP這樣的阻塞命令。請查看所有可用的列表操作命令獲取更多的信息。

3. 集合(Sets)

Redis集合是一個無序的字符串合集。你可以以O(1) 的時間複雜度(無論集合中有多少元素時間複雜度都爲常量)完成 添加,刪除以及測試元素是否存在的操作。

Redis集合有着不允許相同成員存在的優秀特性。向集合中多次添加同一元素,在集合中最終只會存在一個此元素。實際上這就意味着,在添加元素前,你並不需要事先進行檢驗此元素是否已經存在的操作。

一個Redis列表十分有趣的事是,它們支持一些服務端的命令從現有的集合出發去進行集合運算。 所以你可以在很短的時間內完成合並(union),求交(intersection), 找出不同元素的操作。

一個集合最多可以包含2^32-1個元素(4294967295,每個集合超過40億個元素)。

你可以用Redis集合做很多有趣的事,例如你可以:

  • 用集合跟蹤一個獨特的事。想要知道所有訪問某個博客文章的獨立IP?只要每次都用SADD來處理一個頁面訪問。那麼你可以肯定重複的IP是不會插入的。
  • Redis集合能很好的表示關係。你可以創建一個tagging系統,然後用集合來代表單個tag。接下來你可以用SADD命令把所有擁有tag的對象的所有ID添加進集合,這樣來表示這個特定的tag。如果你想要同時有3個不同tag的所有對象的所有ID,那麼你需要使用SINTER.
  • 使用SPOP或者SRANDMEMBER命令隨機地獲取元素。

4. 哈希(Hashes)

Redis Hashes是字符串字段和字符串值之間的映射,所以它們是完美的表示對象(eg:一個有名,姓,年齡等屬性的用戶)的數據類型。

@cli
HMSET user:1000 username antirez password P1pp0 age 34
HGETALL user:1000
HSET user:1000 password 12345
HGETALL user:1000

一個擁有少量(100個左右)字段的hash需要 很少的空間來存儲,所有你可以在一個小型的 Redis實例中存儲上百萬的對象。

儘管Hashes主要用來表示對象,但它們也能夠存儲許多元素,所以你也可以用Hashes來完成許多其他的任務。

一個hash最多可以包含232-1 個key-value鍵值對(超過40億)。

5. 有序集合(Sorted sets)

Redis有序集合和Redis集合類似,是不包含 相同字符串的合集。它們的差別是,每個有序集合 的成員都關聯着一個評分,這個評分用於把有序集 閤中的成員按最低分到最高分排列。

使用有序集合,你可以非常快地(O(log(N)))完成添加,刪除和更新元素的操作。 因爲元素是在插入時就排好序的,所以很快地通過評分(score)或者 位次(position)獲得一個範圍的元素。 訪問有序集合的中間元素同樣也是非常快的,因此你可以使用有序集合作爲一個沒用重複成員的智能列表。 在這個列表中, 你可以輕易地訪問任何你需要的東西: 有序的元素,快速的存在性測試,快速訪問集合中間元素!

簡而言之,使用有序集合你可以很好地完成 很多在其他數據庫中難以實現的任務。

使用有序集合你可以:

  • 在一個巨型在線遊戲中建立一個排行榜,每當有新的記錄產生時,使用ZADD 來更新它。你可以用ZRANGE輕鬆地獲取排名靠前的用戶, 你也可以提供一個用戶名,然後用ZRANK獲取他在排行榜中的名次。 同時使用ZRANKZRANGE你可以獲得與指定用戶有相同分數的用戶名單。 所有這些操作都非常迅速。
  • 有序集合通常用來索引存儲在Redis中的數據。 例如:如果你有很多的hash來表示用戶,那麼你可以使用一個有序集合,這個集合的年齡字段用來當作評分,用戶ID當作值。用ZRANGEBYSCORE可以簡單快速地檢索到給定年齡段的所有用戶。
  • 有序集合或許是最高級的Redis數據類型,所以花些時間查看完整的有序集合(Sorted sets)命令列表去探索你能用Redis幹些什麼吧!

6. 流(Streams)

流Stream是Redis 5.0版本引入的一個新的數據類型,它以更抽象的方式模擬日誌數據結構,但日誌仍然是完整的:就像一個日誌文件,通常實現爲以只附加模式打開的文件,Redis流主要是一個僅附加數據結構。至少從概念上來講,因爲Redis流是一種在內存表示的抽象數據類型,他們實現了更加強大的操作,以此來克服日誌文件本身的限制。

Stream是Redis的數據類型中最複雜的,儘管數據類型本身非常簡單,它實現了額外的非強制性的特性:提供了一組允許消費者以阻塞的方式等待生產者向Stream中發送的新消息,此外還有一個名爲消費者組的概念。

消費者組最早是由名爲Kafka(TM)的流行消息系統引入的。Redis用完全不同的術語重新實現了一個相似的概念,但目標是相同的:允許一組客戶端相互配合來消費同一個Stream的不同部分的消息。

Streams 基礎知識

爲了理解Redis Stream是什麼以及如何使用他們,我們將忽略所有的高級特性,從用於操縱和訪問它的命令方面來專注於數據結構本身。這基本上是大多數其他Redis數據類型共有的部分,比如Lists,Sets,Sorted Sets等等。然而,需要注意的是Lists還有一個可選的更加複雜的阻塞API,由BLPOP等相似的命令導出。所以從這方面來說,Streams跟Lists並沒有太大的不同,只是附加的API更復雜、更強大。

 


參考文章:

http://www.redis.cn/topics/data-types.html

http://www.redis.cn/topics/streams-intro.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章