Google Code Prettify

2018年7月24日 星期二

Redis 的七種資料型別

Redis 以 key、value 的方式儲存資料,但是,儲存的資料並非只有字串、數字這些簡單的物件。Redis 共支援七種資料型別 --- String、List、Set、Hash、Zset (sorted set)、HLL (HyperLogLog)、Geo,這裡會以指令操作的方式說明,但是,要真正的了解 Redis 怎麼使用它們,要自行參考「Redis 命令參考」多玩才行,因為我只使用到少部份的指令。
  • String
這是最基本的資料型別,通常就是 key、value,value 為一個字串,但是除了字串外,也可以是整數或浮點數。

get、set 是最基本的指令,把資料放入 Redis 或取出,這裡 get 是讀出來,不會移除,資料仍在 Redis 裡,要真的刪除要用 del,如下,一次可以刪多個,刪除後用 get 讀,如果該 key 值沒有資料,會傳回 nil。
  • List
雙向的鏈,所以可以由左或右 push 進 Redis 或 pop 出來,也可以從中間插入。
如上,從左邊依序放入 10、20、30,那麼由左到右看就會是 30 20 10,上面用 LRANGE 讀出,由 0 到 -1 表示全部讀出來,為什麼? 因為 List 的指標由左到右是 0、1、2 …,由右到左是 -1、-2、-3 …,所以由 0 到 -1 就表示全部。
除了依序 push,也可以從中間插入,LINSERT 就是提供這樣的功能,LINDEX 則是可以指定要讀那一個位置的元素。移除元素可以用 LPOP、RPOP、LREM 等命令。
  • Set
List 是有順序的,而且同一元素可以有兩個或多個,Set 是無序的,每個元素只能有一個。
如上,用 SADD 加入五個元素,用 SMEMBERS 顯示出所有元素,順序與加入時不同。
Set 間還可以做聯集,如上,mySet、urSet 用 SUNION 聯集得到相加的結果。
  • Hash
Hash (雜湊) 本來就是 key、value 結構,在 Redis 的 key、value 結構中又會怎麼表示呢?

如上所示,在指令 HMSET 後面的元素依序為 redis_key、hash_key1、hash_value1、hash_key2、hash_value2,所以 google、yahoo 為 Hash 的 key,www.google.com、www.yahoo.com 是它們的值。
這裡用 HKEYS 把所有的 key 顯示出來,也用 HVALS 把所有的 value 顯示出來。
  • ZSet
ZSet 是有序的集合,和 Set 一樣,元素不可重複,為了有順序,所以每個元素會有個權重 (score),順序就依權重排列。
用 ZRANK 可以顯示出某個元素在權重由小到大排列下,排在第幾位 (由 0 開始計算),用 ZREVRANK 則是反過來,權重由大到小排列下的排序。
  • HyperLogLog (HLL)
HLL 只有三個指令 - PFADD、PFCOUNT、PFMERGE,分別用來新增元素、計算個數、合併元素。HLL 和上面五種資料型別不同之處在於,它並非用來儲存資料,而是用在計算個數! 而且只適用在特殊場景! 當要計算的個數很大,可能是數千萬或更多,而且可容許誤差,例如網站的訪客數,那麼就可以使用 HLL。使用 HLL 有什麼好處? 好處在於,不管元素個數有多麼多,HLL 都只會固定的佔用 12KB 記憶體,最大可計算的個數為 2 的 64 次方。
如上,將 a b c d e f g 共 7 個元素加入 myHLL 中,用 PFCOUNT 計算得到 7,再把 a b c 加入 myHLL,再計算一次,仍是 7,因為 HLL 就像 SET 一樣,只會計算不重複的元素。接著將 1 2 3 4 5 共 5 個元素加入 urHLL,用 PFCOUNT 計算得 5,然後用 PFMERGE 合併 myHLL、urHLL 到 ourHLL,再用 PFCOUNT 計算 ourHLL 裡有幾個元素,得到 12。個數很小時不會有誤差,個數非常大時,會有不大於 1% 的誤差。
  • Geo
這個型別是用來記錄及計算經緯度、兩地的距離等,真的很特別。
我查了一下 Google Map,找出淡水和內湖的西堤的經緯度,分別為 (121.3750261, 25.1690807) 及 (121.5690305, 25.0792924),所以將它們加入 restaurants 這個變數,接著可以用 GEOPOS 取出,如果要算兩個餐廳的距離,就用 GEODIST,算出來的結果是 21.9413 公里。

沒有留言:

張貼留言