Redis 除了用作緩存還能干嗎?
今天我們來聊聊 Redis 的使用案例。
Redis 是一種內(nèi)存鍵值數(shù)據(jù)庫。它支持多種數(shù)據(jù)結(jié)構(gòu),如 String, Hash, List, Set 和 SortedSet。
圖片
01 緩存
Redis 的最常用的用例是緩存,以加快網(wǎng)絡(luò)應(yīng)用的速度。在這種用例中,Redis 將經(jīng)常請求的數(shù)據(jù)存儲在內(nèi)存中。它允許網(wǎng)絡(luò)服務(wù)器頻繁訪問的數(shù)據(jù)。這就減少了數(shù)據(jù)庫的負載,并縮短應(yīng)用程序的響應(yīng)時間。在大規(guī)模應(yīng)用中,緩存分布在 Redis 服務(wù)器集群中。
Redis 作為分布式緩存時需要考慮的其他問題包括:
- 設(shè)置正確的 TTL (Time to Live)
- 處理冷啟動時對數(shù)據(jù)庫的密集訪問
02 Session 存儲
另一個常見用例是將 Redis 用作 Session 存儲,在無狀態(tài)服務(wù)之間共享 Session 數(shù)據(jù)。
當(dāng)用戶登錄網(wǎng)絡(luò)應(yīng)用程序時,服務(wù)端會創(chuàng)建一個唯一的 Session ID,Session 數(shù)據(jù)會存儲在 Redis 中,然后 Session 作為 Cookie 的一部分返回給客戶端。
當(dāng)用戶向應(yīng)用程序發(fā)出請求時,Session ID 會包含在請求中。無狀態(tài)網(wǎng)絡(luò)服務(wù)器會使用 Session 數(shù)據(jù)。值得注意的是 Redis 是內(nèi)存數(shù)據(jù)庫。如果 Redis 服務(wù)器重啟,存儲在 Redis 中的 Session 數(shù)據(jù)會丟失。
即使 Redis 提供了 RDB 和 AOF 等持久化選項,但這些選項在重啟時加載數(shù)據(jù)的時間往往太長,不實用。在實際生產(chǎn)環(huán)境中,數(shù)據(jù)會復(fù)制到備份實例。如果主實例崩潰,備份迅速升級,接管流量。
03 分布式鎖
需要協(xié)調(diào)對某些共享資源的訪問時,就會使用分布式鎖。Redis 通過其原子命令(如 SETNX, SET if Not eXists)來做分布式鎖。它允許調(diào)用者設(shè)置一個不存在的鍵。
比如,客戶端通過設(shè)置一個唯一的 Key 來獲取鎖:
SETNX lock "1234abcd" EX 3
如果 Key 尚未設(shè)置,SETNX 命令返回 1,表明鎖已被客戶端獲取??蛻舳送瓿晒ぷ骱?刪除 Key ,釋放鎖。
如果 Key 已被設(shè)置,SETNX 命令返回 0,表明鎖已被其他客戶機持有。在這種情況下,客戶端會等待并重試 SETNX 操作,直到鎖被其他客戶端釋放。
請注意,這種簡單的實現(xiàn)對于許多用例來說已經(jīng)足夠好了,但并非完全容錯。對于生產(chǎn)應(yīng)用,許多 Redis 客戶端庫提供高質(zhì)量的分布式鎖實現(xiàn)。
04 限流
Redis 可用作限流。一個非常基本的限流算法是這樣工作的:
對于每個用戶請求,其請求的 IP 或用戶 ID 用作 Key。每個請求都會使鍵值遞增。將當(dāng)前計數(shù)與允許的速率限制進行比較,如果計數(shù)在速率限制范圍內(nèi),則處理請求。如果計數(shù)超過速率限制,則拒絕請求。Key可以設(shè)置為在特定時間窗口(如一分鐘)后過期,以重置下一個時間窗口的計數(shù)。
05 游戲排行榜
對于大多數(shù)規(guī)模不是很大的游戲來說,Redis 是一種很好的實現(xiàn)方式。SortedSet 是實現(xiàn)這一功能的基本數(shù)據(jù)結(jié)構(gòu)。
SortedSet 的每個元素都有一個與之相關(guān)的分?jǐn)?shù)。元素按分?jǐn)?shù)排序。這樣就可以在對數(shù)時間內(nèi) 完成排序。
06 購物車
我們可以使用 Hash 來表示購物車中的鍵值對。對于簡單的電商平臺來說,在 Redis 中實現(xiàn)購物車可以兼顧用戶體驗和快速交付。
07 計算用戶留存率
我們可以使用 Bitmap 來表示每天登錄的用戶并計算用戶保留率。這種計數(shù)功能占用的內(nèi)存很少。
08 消息隊列
我們可以使用 List 來做消息隊列。也可以使用 Redis 的 PubSub 功能來實現(xiàn)類似的消息總線功能。