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