1. 程式人生 > 其它 >Redis資料型別:五大基本資料型別及三種特殊型別

Redis資料型別:五大基本資料型別及三種特殊型別

String (字串型別)

String是redis最基本的型別,你可以理解成Memcached一模一樣的型別,一個key對應一個value。
String型別是二進位制安全的,意思是redis的string可以包含任何資料,比如jpg圖片或者序列化的物件。
String型別是redis最基本的資料型別,一個redis中字串value最多可以是512M

Hash(雜湊,類似 Java裡的Map)

Redis hash 是一個鍵值對集合。
Redis hash 是一個String型別的field和value的對映表,hash特別適合用於儲存物件。
類似Java裡面的Map<String,Object>

List(列表)

Redis列表是簡單的字串列表,按照插入順序排序,你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)。
它的底層實際是個連結串列 !

Set(集合)

Redis的Set是String型別的無序集合,它是通過HashTable實現的 !

Zset(sorted set:有序集合)

Redis zset 和 set 一樣,也是String型別元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯一個double型別的分數。
Redis正是通過分數來為集合中的成員進行從小到大的排序,zset的成員是唯一的,但是分數(Score)卻可以重複。

HyperLogLog

Redis 在 2.8.9 版本添加了 HyperLogLog 結構。
Redis HyperLogLog 是用來做基數統計的演算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定 的、並且是很小的。
在 Redis 裡面,每個 HyperLogLog 鍵只需要花費 12 KB 記憶體,就可以計算接近 2^64 個不同元素的基數。這和計算基數時,元素越多耗費記憶體就越多的集合形成鮮明對比。
HyperLogLog則是一種演算法,它提供了不精確的去重計數方案。
舉個栗子:假如我要統計網頁的UV(瀏覽使用者數量,一天內同一個使用者多次訪問只能算一次),傳統的解決方案是使用Set來儲存使用者id,然後統計Set中的元素數量來獲取頁面UV。但這種方案只能承載少量使用者,一旦使用者數量大起來就需要消耗大量的空間來儲存使用者id。我的目的是統計使用者數量而不是儲存使用者,這簡直是個吃力不討好的方案!而使用Redis的HyperLogLog最多需要12k就可以統計大量的使用者數,儘管它大概有0.81%的錯誤率,但對於統計UV這種不需要很精確的資料是可以忽略不計的。

GEO地理位置

Redis 的 GEO 特性在 Redis 3.2 版本中推出, 這個功能可以將使用者給定的地理位置資訊儲存起來, 並對這些資訊進行操作。來實現諸如附近位置、搖一搖這類依賴於地理位置資訊的功能。geo的資料型別為zset。
GEO 的資料結構總共有六個常用命令:geoadd、geopos、geodist、georadius、georadiusbymember、gethash

BitMap

在開發中,可能會遇到這種情況:需要統計使用者的某些資訊,如活躍或不活躍,登入或者不登入;又如需要記錄使用者一年的打卡情況,打卡了是1, 沒有打卡是0,如果使用普通的 key/value儲存,則要記錄365條記錄,如果使用者量很大,需要的空間也會很大,所以 Redis 提供了 Bitmap 點陣圖這中資料結構,Bitmap 就是通過操作二進位制位來進行記錄,即為 0 和 1;如果要記錄 365 天的打卡情況,使用 Bitmap表示的形式大概如下:0101000111000111...........................,這樣有什麼好處呢?當然就是節約記憶體了,365 天相當於 365 bit,又 1 位元組 = 8 bit , 所以相當於使用 46 個位元組即可。
BitMap 就是通過一個 bit 位來表示某個元素對應的值或者狀態, 其中的 key 就是對應元素本身,實際上底層也是通過對字串的操作來實現。Redis 從 2.2 版本之後新增了setbit, getbit, bitcount 等幾個bitmap 相關命令。