大家好呀,我是小米,一個喜歡邊寫代碼邊喝咖啡的31歲程序員。
最近在幫一位朋友準備社招面試,結果被一道 Redis 題給“整不會”了。面試官問得雲淡風輕:“Redis 有哪些常見數據類型?分別能幹嘛?”
我朋友當場懵了三秒:“呃……String、List、Set,還有……呃……SortedSet?”
面試官輕輕一笑:“那它們的應用場景呢?”
空氣,突然安靜。
於是我就決定寫下這篇文章,幫大家一次性把 Redis 的五大核心數據類型 講明白,還會聊點“面試加分細節”,讓你不僅知道“是什麼”,更能説出“為什麼”和“什麼時候用”。
因為啊,面試官最喜歡的,不是死記硬背,而是“有畫面感”的理解。
String:Redis 的“萬能類型”
先説最基礎的 —— String。
別看名字叫“字符串”,其實它是最“多才多藝”的數據類型。
在 Redis 裏,String 可以存任何東西:文本、JSON、序列化後的對象、甚至二進制數據(比如圖片、音頻片段都能放)。
舉個例子:
你想在系統裏緩存用户信息。那可以這樣搞:
下次查就不必連數據庫,直接從 Redis 裏拿。
那它的常見用法有哪些?
- 緩存熱點數據(比如用户資料、商品信息)
- 計數器:Redis 的 INCR、DECR 操作可以原子地自增自減,非常適合計數場景,比如點贊數、瀏覽量。
- 分佈式鎖:用 SETNX(set if not exist)實現簡單分佈式鎖機制。
面試官如果繼續追問:“String 的最大存儲限制是多少?”
你可以輕輕一笑回答:512MB!然後再補一句:“不過,一般不會放那麼大,超過 1MB 的數據就不適合放 Redis 裏了。”
這就是加分點。
List:Redis 的“隊列好幫手”
List 是 有序的字符串列表,它的底層是 雙向鏈表。
也就是説,你既可以從左邊插入、也可以從右邊插入。所以,List 在 Redis 裏非常適合做:
- 消息隊列(模擬 Kafka 那種生產消費模型)
- 任務異步處理(比如郵件發送、訂單延遲處理)
- 最新動態列表(比如朋友圈、評論區)
舉個例子:
然後用 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 代表優先級)
比如:
執行 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 有五種核心數據類型:String、List、Set、Hash、ZSet。
String 用於緩存與計數,List 適合隊列,Set 用於去重和集合運算,Hash 用來存對象,ZSet 用來做排行榜。
此外還有 Bitmap、HyperLogLog、Geo、Stream 等高級類型。
我在項目裏主要用 String 做緩存,Hash 存對象,ZSet 做積分榜,Set 做共同好友計算。
簡潔、有邏輯、有實戰,這就是社招面試的黃金答案。
END
Redis 的數據類型,就像程序員的工具箱。
別隻背名字,學會在正確的地方用出正確的“錘子”,那你就是 Redis 的工匠。
我是小米,一個喜歡分享技術的31歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術乾貨!