這周給一個小夥伴做模擬面試,因為他在公司的專案是一個短影片+電商的專案,模仿的是tiktok。看到他簡歷裡寫了做了短影片的收藏功能,於是讓他講講具體的做法是什麼樣子的。
結果回答的並不理想,答案裡有不少硬傷,今天鬆哥就來和大家簡單聊一聊這個話題。
一 為什麼用 Redis
首先就是為什麼要用 Redis?直接存到資料庫不行嗎?
用 Redis 主要是有下面一些優勢。
1.1 高效能
因為點贊收藏是一個高頻操作,所以利用 Redis 就能做到非常低的延遲和極高的吞吐量,這是一個巨大的優勢。
1.2 簡化架構
對於簡單的點贊和收藏功能,Redis 提供了內建的數據結構(如 Hash 和 Sorted Set),這使得實現起來非常簡便。你不需要編寫複雜的 SQL 查詢或設計複雜的索引來支援這些功能。
1.3 彈性和擴充套件性
Redis 支援主從複製、叢集部署以及持久化機制,這使得它非常適合需要高度可用性和可擴充套件性的應用。即使在資料量增長的情況下,你也可以透過增加 Redis 例項來水平擴充套件系統。
1.4 實時資料分析
Redis 還支援實時分析和聚合功能,這對於實時展示點贊數量或熱門內容非常有用。例如,你可以輕鬆地計算出最受歡迎的內容或使用者的活動趨勢。
因為這個小夥伴的專案是網際網路專案,所以用 Redis 去做點贊和收藏我相信大家應該沒有什麼異議。
具體問題具體分析,如果就是常規的企業級系統開發,併發量不大甚至資料量也不大的話,那麼也可以直接上資料庫。
二 使用哪種數據結構
如果用 Redis 來實現點贊或者收藏功能的話,一般來說我們有兩種數據結構可以選擇:
Hash
Sorted Set
這兩種數據結構各有特點,我們要結合具體情況來分析。
2.1 Hash
如果你的收藏功能只需要記錄使用者對某個專案是否收藏了,並不需要對這些收藏項進行排序,那麼可以考慮使用 Hash。
可以用使用者名稱做 key,value 則是一個 list,表示使用者收藏項的 id。
使用 Hash 的優點是:
空間效率高,因為 Hash 可以儲存多個欄位值對。
查詢單個使用者的收藏狀態非常快。
不過 Hash 有一個問題就是無法按收藏或者點贊時間對資料進行排序。
2.2 Sorted Set (ZSET)
如果你需要根據某個 score(例如收藏的時間戳或者其它數值指標)來給收藏的專案排序,那麼就可以考慮使用 Sorted Set。
使用 Sorted Set 的話,key 依然是使用者 id,value 則是收藏資料項的 id,score 則是收藏的時間戳。
這樣將來在查詢的時候,就可以根據時間對收藏/點贊行為進行排序。
使用 Sorted Set 的優點有:
可以輕鬆地獲取使用者的最近收藏、最熱門收藏等。
支援範圍查詢,例如獲取某個使用者收藏列表中的前 N 項。
三 小結
如果你只需要記錄收藏狀態而不需要排序,使用 Hash 是一個簡單且高效的選擇。
如果你需要排序功能(例如按照時間順序顯示收藏),則使用 Sorted Set 更合適。
根據你的具體需求選擇最適合的數據結構。如果需要更復雜的邏輯,也可以考慮結合使用這兩種數據結構。