本文

1、String

Redis 內最基本的資料型態,以 Binary safe 的方式進行儲存。

Binary safe
C語言中對字串的儲存形式會用 ‘\0’ 來做為字串結束的判斷。
而Redis雖然是使用C語言寫的,但優化了這個部分,所以 Redis 只需專注於讀寫整個 Binary string ,而不用為了某種特殊格式而需要進行特殊化的解析。

優點:

  • 可以儲存任何格式的資料,包括了圖片、檔案、及任何序列化後的物件。

使用提醒:

  • Redis 中一個 String 的最大上限為512MB。

適用場景:

  • 普通的快取資料。
  • 用來實作統計等相關功能 Ex: 網站的瀏覽人數。
  • 分散式架構下的 Web 共用 Session。

2、List

由 Redis 內多個 String 所組成,類似於 Linked-List 的資料結構。

優點:

  • 插入和刪除資料的操作很快,時間複雜度為 O(1)。

使用提醒:

  • Redis 中一個 List 的最大長度上限為 2^32 - 1。

適用場景:

  • 可用來實作佇列的 Queue(First in first out)。
  • 可用來實作 Stack(Last in first out)。
  • 社群功能的留言板、排行榜、關注等功能。

示範:
有一個留言板,現在有了三則留言。

LPUSH board firstMessage
LPUSH board secondMessage
LPUSH board thirdMessage

我們要拿取最新的那一筆留言。

LPOP board

3、Hash

由一個 String 類型的 field 和 value 所組成,資料會進行壓縮,有點類似於 C# 的 Dictionary。

優點:

  • 同類型的資料可以進行整合儲存,方便於管理。
  • 比 string 消耗的記憶體更小。

缺點:

  • 過期的功能只能針對 Key 使用,無法針對個別 field。
  • Redis 的叢集架構下不適合大量使用。

使用提醒:

  • Redis 中一個 Hash 的最大儲存上限為 2^32 - 1。

適用場景:

  • 購物車功能,Ex:使用者 Id 為 key、商品 Id 為 field、商品數量為 value,即可組成購物車需要的元素。
  • 任何 Object,Hash 所提供的 key、field、value 剛好可以對應物件的Id、屬性、值。

示範:
有一個購物車內,放了 user001 要購買的商品,他一共買了 a001 商品1件、a002 商品2件。

hset shoppingcart:user001 a001 1
hset shoppingcart:user001 a002 2

列出目前購物車內所有商品。

hgetall shoppingcart:user001

使用者決定不買 a001 的商品了。

hdel shoppingcart:user001 a001

4、Set

由多個 String 以無序的方式所組成,保證 Key 是唯一的。

優點:

  • 因為是透過 Hash Map 組成,新增、刪除、查找複雜度都是 O(1)。
  • 因為是一個集合,也可用作聯集、交集、差集等處理。

使用提醒:

  • Redis 中一個 Set 的最大上限為 2^32 - 1。

適用場景:

  • 抽獎功能,Ex:將擁有抽獎資格的使用者加入一個 Set 內,因為保證不用有重複的 Key,所以不會發生同一個使用者被重複抽。
  • 社群軟體中可以找出共同關注、共同粉絲相關的集合功能。

示範:
現在有一個抽獎活動,我們將可以餐與抽獎的使用者放入集合內。

SADD key user001
SADD key user002
SADD key user003
SADD key user004
SADD key user005

列出參與抽獎的使用者。

SMEMBERS key

接下來我們從這個集合內抽出一名幸運的中獎者並將他從集合內移出。

SPOP key 1

再次觀看目前參與抽獎的使用者列表。

5、Sorted set

與上述的 Set 大致上相同,特殊點在於 Sorted set 是有順序區別的。

使用提醒:

  • Redis中一個Set的最大上限為 2^32 - 1。

適用場景:

  • 需要進行排序的集合,Ex:當日排行榜、一周內排行榜。

示範:
我們需要有一個呈現當日搜尋排行榜的列表,每當有一個搜尋紀錄時我們就將它塞入 Set。

ZINCRBY hostSearch:20210425 1 Redis
ZINCRBY hostSearch:20210425 1 Redis
ZINCRBY hostSearch:20210425 1 MongoDB
ZINCRBY hostSearch:20210425 1 MSSQL

抓取當日排行榜前十的搜尋紀錄,並把搜尋次數列出來。

ZREVRANGE hostSearch:20210425 0 9 WITHSCORES

6、GEO

這邊還發現了其實 Redis 也提供了 GEO 的資料型態,用來做地理位置相關資料的儲存。

適用場景:

  • 給一個座標,找出附近相關的地標有哪些。

拿之前抓的 Youbike 做示範:
首先存入兩個 Youbike 的站點。

 GEOADD Youbike 121.5436 25.02605 "500101001" 121.54357 25.02565 500101002

接下來我們找某個座標內一百公尺的 Youbike 站有哪些並返回座標與 Youbike 站的距離。

GEORADIUS Youbike 121.54355666801028 25.026613968659696 100 m WITHDIST

後記

這邊只簡單記錄了一些使用情境以及方法,若有興趣了解 Redis 底層如何實作推薦觀看, Redis 設計與實現

參考連結