大家好呀,我是小米,一個喜歡邊寫代碼邊喝咖啡的31歲程序員。

最近在幫一位朋友準備社招面試,結果被一道 Redis 題給“整不會”了。面試官問得雲淡風輕:“Redis 有哪些常見數據類型?分別能幹嘛?”

我朋友當場懵了三秒:“呃……String、List、Set,還有……呃……SortedSet?”

面試官輕輕一笑:“那它們的應用場景呢?”

空氣,突然安靜。

於是我就決定寫下這篇文章,幫大家一次性把 Redis 的五大核心數據類型 講明白,還會聊點“面試加分細節”,讓你不僅知道“是什麼”,更能説出“為什麼”和“什麼時候用”。

因為啊,面試官最喜歡的,不是死記硬背,而是“有畫面感”的理解。

String:Redis 的“萬能類型”

先説最基礎的 —— String

別看名字叫“字符串”,其實它是最“多才多藝”的數據類型。

在 Redis 裏,String 可以存任何東西:文本、JSON、序列化後的對象、甚至二進制數據(比如圖片、音頻片段都能放)。

舉個例子:

你想在系統裏緩存用户信息。那可以這樣搞:

學會這一篇,Redis 數據結構題全拿下!(附經典場景舉例)_Redis

下次查就不必連數據庫,直接從 Redis 裏拿。

那它的常見用法有哪些?

  • 緩存熱點數據(比如用户資料、商品信息)
  • 計數器:Redis 的 INCR、DECR 操作可以原子地自增自減,非常適合計數場景,比如點贊數、瀏覽量。
  • 分佈式鎖:用 SETNX(set if not exist)實現簡單分佈式鎖機制。

面試官如果繼續追問:“String 的最大存儲限制是多少?”

你可以輕輕一笑回答:512MB!然後再補一句:“不過,一般不會放那麼大,超過 1MB 的數據就不適合放 Redis 裏了。”

這就是加分點。

List:Redis 的“隊列好幫手”

List 是 有序的字符串列表,它的底層是 雙向鏈表

也就是説,你既可以從左邊插入、也可以從右邊插入。所以,List 在 Redis 裏非常適合做:

  • 消息隊列(模擬 Kafka 那種生產消費模型)
  • 任務異步處理(比如郵件發送、訂單延遲處理)
  • 最新動態列表(比如朋友圈、評論區)

舉個例子:

學會這一篇,Redis 數據結構題全拿下!(附經典場景舉例)_數據類型_02

然後用 LRANGE news 0 1 就能取到最新的兩條新聞。

這裏你可以順勢説一句:

“List 的操作複雜度主要是 O(1),但是訪問中間元素時是 O(n),所以更適合做頭尾操作。”

面試官聽到這句話,基本就會點頭:“嗯,這哥們平時用過。”

Set:Redis 的“去重神器”

有時候,我們不需要順序,只想要一個 不重複的集合,那就用 Set。

Set 是 Redis 裏的一種無序集合,最顯著的特點是:元素自動去重。那它能幹嘛?太多了!

  • 抽獎系統:用 Set 存參與用户,每次隨機取一箇中獎者。
  • 共同好友:Redis 的 Set 支持交集、並集、差集,非常方便計算“共同關注”之類的功能。
  • 去重統計:比如統計一天訪問網站的唯一用户數(UV)。

一個經典面試問題是:

“你怎麼用 Redis 統計用户每天的活躍人數?”

回答思路就是:

每天創建一個 Set,key 裏帶日期,比如 active:2025-11-04,然後每當有用户訪問就 SADD 用户ID。

統計活躍人數只需要看 SCARD active:2025-11-04。

面試官會很喜歡這種“場景化”的回答。

Hash:Redis 的“小型數據庫表”

接下來登場的是 Redis 中我最喜歡的類型 —— Hash

Hash 就像是一張表,key 是表名,field 是列名,value 是值。比如:

它非常適合存儲結構化數據,比如用户信息、商品信息等。

常見用法:

  • 存儲對象(用户、商品、訂單)
  • 購物車結構(key 是用户,field 是商品ID,value 是數量)
  • 動態數據更新(只改字段,不改整個值)

如果你跟面試官説:

“相比 String 存整個 JSON,Hash 更新更細粒度、性能更高,還能節省帶寬。”

那他八成會露出“懂行人”的表情:

“好,咱們可以聊聊 pipeline 了。”

ZSet(Sorted Set):Redis 的“排行榜之王”

終於到了最有“靈魂”的數據類型:ZSet(有序集合)

ZSet 就是帶了分數(score)的 Set。每個元素都關聯一個分數,Redis 會自動按分數排序。

用途場景:

  • 排行榜(比如遊戲積分榜、熱搜榜)
  • 延遲任務隊列(score 代表時間戳)
  • 優先級隊列(score 代表優先級)

比如:

學會這一篇,Redis 數據結構題全拿下!(附經典場景舉例)_List_03

執行 ZRANGE rank 0 -1 WITHSCORES 就能拿到從低到高的完整排行榜。

面試官可能會加問:

“ZSet 和普通 Set 的底層結構有什麼不同?”

你可以答:

“ZSet 是通過 SkipList(跳錶)實現排序,查找和插入的複雜度是 O(logN),Set 是哈希表實現的,複雜度是 O(1)。”

這時候,他會輕輕點頭,然後把筆記下:“值得關注”。

延伸:Redis 新增的數據類型(面試加分)

如果你想在面試中多拿幾分,可以提一嘴 Redis 的“新面孔”:

  • Bitmap:用於位統計(比如簽到、用户活躍天數)
  • HyperLogLog:用於近似去重計數(比如統計網站獨立訪問量)
  • Geo:地理位置存儲,可計算兩點間距離
  • Stream:消息流,用於實現可靠的消息隊列系統

別怕背不完,你只需要挑一兩個説説用途就行。

比如:

“Bitmap 很適合做簽到系統,一個 bit 就代表一天,既省內存又方便統計連續簽到天數。”

這類回答不僅展示了知識廣度,還體現你平時動過腦子。

總結:Redis 不只是緩存

到這,我們已經把 Redis 的核心類型講完了。

但我想説一句心裏話:

Redis 絕不是一個“簡單的緩存工具”,而是一種“高性能數據結構引擎”。

它的每一種類型,都代表了一個經典的算法思路。比如:

  • String 是基礎類型;
  • List 是鏈表;
  • Set 是集合;
  • Hash 是哈希表;
  • ZSet 是跳錶。

理解這些底層結構,你才能真正用好 Redis。

學會這一篇,Redis 數據結構題全拿下!(附經典場景舉例)_Redis_04

面試官想聽的不是答案,而是思考

最後,給你一個“社招必殺技”:

當面試官問“Redis 有哪些數據類型”時,別直接背誦。

你可以這樣回答:

Redis 有五種核心數據類型:String、List、Set、Hash、ZSet。

String 用於緩存與計數,List 適合隊列,Set 用於去重和集合運算,Hash 用來存對象,ZSet 用來做排行榜。

此外還有 Bitmap、HyperLogLog、Geo、Stream 等高級類型。

我在項目裏主要用 String 做緩存,Hash 存對象,ZSet 做積分榜,Set 做共同好友計算。

簡潔、有邏輯、有實戰,這就是社招面試的黃金答案。

END

Redis 的數據類型,就像程序員的工具箱。

別隻背名字,學會在正確的地方用出正確的“錘子”,那你就是 Redis 的工匠。

我是小米,一個喜歡分享技術的31歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術乾貨!