天天看點

《Redis官方文檔》Data types—資料類型

原文連結

<b>string</b><b>類型(字元串類型)</b>

string 是redis中最基本的類型。redis中的string 類型是二進制安全的,也就是說在redis中string類型可以包含各種資料,比如一張jpeg圖檔或者是一個序列化的ruby對象。一個string類型的值最大長度可以是512m。

在redis中string有很多有趣的用法,比如:

把string當做原子計數器,這可以使用incr家族中的指令來實作:incr, decr, incrby。

使用append指令來給一個string追加内容。

把string當做一個随機通路的向量(vector),這可以使用getrange和 setrange指令來實作

使用getbit 和setbit方法,在一個很小的空間中編碼大量的資料,或者建立一個基于redis的bloom filter 算法。

檢視string類型可用指令來獲得更多資訊,或者閱讀redis資料類型介紹一章。

<b>lists</b><b>類型(清單類型)</b>

redis的清單類型中存儲一系列string值,這些string按照插入的順序排序。redis的list可以從頭部(左側)加入元素,也可以從尾部(右側)加入元素。

lpush 指令是在頭部加入一個新元素,rpush 指令是在尾部加入一個新元素。當在一個空的鍵值(key)上執行這些操作時會建立一個新的清單。類似的,當一個操作清空了一個list時,這個list對應的key會被删除。這非常好了解,因為從指令的名字就可以看出這個指令是做什麼操作的。如果使用一個不存在的key調用的話就會使用一個空的list。

一些例子:

list的最大長度是2^32 – 1個元素(4294967295,一個list中可以有多達40多億個元素)

從時間複雜度的角度來看,redis list類型的最大特性是:即使是在list的頭端或者尾端做百萬次的插入和删除操作,也能保持穩定的很少的時間消耗。在list的兩端通路元素是非常快的,但是如果要通路一個很大的list中的中間部分的元素就會比較慢了,時間複雜度是o(n)。

redis的lists類型有很多有趣的用法,比如:

在社交網絡中使用list進行時間表模組化,使用lpush指令在使用者時間線中加入新的元素,然後使用lrange 指令來獲得最近加入的元素。

可以把lpush 和ltrim 指令結合使用來實作定長的清單,清單中隻儲存最近的n個元素

在建立背景運作的工作時,lists可以作為消息傳遞原語,例如著名的ruby庫 resque

還有很多可以使用lists來做的事,這種資料類型支援很多指令,包括像blpop這樣的阻塞指令

請檢視lists類型可用指令來獲得更多的資訊,或者閱讀redis資料類型介紹一章

<b>sets</b><b>類型(集合類型)</b>

redis的sets類型是string的無序集合。增加,删除,測試元素是否存在的時間複雜度都是o(1)(不管集合中有多少元素都是穩定的時間消耗)

redis sets的一個重要特性是不允許重複元素。向集合中添加多次相同的元素,集合中隻存在一個該元素。在實際應用中,這意味着在添加一個元素前不需要先檢查元素是否存在。

關于redis sets一個非常有意思的事情是,它們支援多個伺服器端指令來從現有集合開始計算集合,是以執行集合的交集,并集,差集都可以很快。

set的最大長度是2^32 – 1個元素(4294967295,一個set中可以有多達40多億個元素)

redis sets有很多有趣的用法,比如:

你可以使用redis sets來記錄唯一的事物,比如,你想知道通路某個部落格的ip位址,不要重複的ip,這種情況隻需要在每次處理一個請求時簡單的使用sadd指令就可以了,可以确信不會插入重複的ip.

redis sets 可以很好的表示關系。你可以使用redis建立一個标簽系統,每個标簽使用一個set來表示。然後你可以使用sadd 指令把具有特定标簽的所有對象的所有id放在表示這個标簽的set中。如果你想要知道同時擁有三個不同标簽的對象,那麼使用sinter指令就好了。

你可以使用spop 或者 srandmember 指令從集合中随機的提取元素。

檢視set可用指令獲得更多資訊,或者閱讀redis資料類型介紹一章

<b>hashes</b>(<b>哈希類型</b>)

redis hashes 儲存string域和string值之間的映射,是以它們是用來表示對象的絕佳資料類型(比如一個有着使用者名,密碼等屬性的user對象):

一個有着少量資料域(這裡的少量大概100上下)的hash,其存儲方式占用很小的空間,是以在一個小的redis執行個體中就可以存儲上百萬的這種對象。

雖然hashes主要用于表示對象,他們可以存儲很多的元素,是以你可以使用hashes來做許多其他的工作。

hash的最大長度是2^32 – 1個域值對(4294967295,一個hash中可以有多達40多億個域值對)

檢視hash類型可用指令來獲得更多資訊,或者閱讀redis資料類型介紹一章

<b>sorted sets</b> <b>類型(有序集合類型)</b>

redis有序集合類型與redis的集合類型類似,是非重複的string元素的集合。不同之處在于,有序集合中的每個成員都關聯一個score,score是在排序時候使用的,按照score的值從小到大進行排序。集合中每個元素是唯一的,但score有可能重複。

使用有序集合可以很高效的進行,添加,移除,更新元素的操作(時間消耗與元素個數的對數成比例)。由于元素在集合中的位置是有序的,使用get ranges by score或者by rank(位置)來順序擷取或者随機讀取效率都很高。(本句不确定,未完全了解原文意思,是根據自己對redis的淺顯了解進行的翻譯)通路有序集合中間部分的元素也非常快,是以可以把有序集合當做一個不允許重複元素的智能清單,你可以快速通路需要的一切:擷取有序元素,快速存在測試,快速通路中間的元素等等。

簡短來說,使用有序集合可以實作很多高性能的工作,這一點在其他資料庫是很難實作的。

使用有序集合你可以:

在大型線上遊戲中建立一個排行榜,每次有新的成績送出,使用zadd指令加入到有序集合中。可以使用zrange指令輕松獲得成績名列前茅的玩家,你也可以使用zrank根據一個使用者名獲得該使用者的分數排名。把zrank 和 zrange結合使用你可以獲得與某個指定使用者分數接近的其他使用者。這些操作都很高效。

有序集合經常被用來索引存儲在redis中的資料。比如,如果你有很多使用者,用hash來表示,可以使用有序集合來為這些使用者建立索引,使用年齡作為score,使用使用者的id作為value,這樣的話使用zrangebyscore 指令可以輕松和快速的獲得某一年齡段的使用者。

有序集合可能是redis中最進階的資料類型了,是以請花一些時間檢視一下 有序集合指令清單 來獲得更多資訊,同時你可能也想閱讀redis資料類型介紹

<b>bitmaps and hyperloglogs類型(位圖類型和hyperloglogs類型)</b>

redis 也支援位圖類型和hyperloglogs 類型,他們是在string基本類型基礎上建立的類型,但有自己的語義。

請參考redis資料類型介紹 獲得這些類型的資訊。