App下載

Redis除了緩存,它還能做什么?

閃城棒棒軍 2023-12-16 14:20:38 瀏覽數(shù) (1563)
反饋

Redis是一款功能強(qiáng)大的鍵值存儲(chǔ)系統(tǒng),廣泛應(yīng)用于各種場(chǎng)景。盡管它以其出色的緩存性能而聞名,但Redis遠(yuǎn)不僅僅是一個(gè)緩存工具。本文將帶您探索Redis的多面手能力,展示它在各種應(yīng)用領(lǐng)域的廣泛應(yīng)用。

20231211-135346

session存儲(chǔ) 

當(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)求中。無狀態(tài)網(wǎng)絡(luò)服務(wù)器會(huì)使用Session數(shù)據(jù)。值得注意的是 Redis 是內(nèi)存數(shù)據(jù)庫。如果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í),接管流量。

分布式鎖:

需要協(xié)調(diào)對(duì)某些共享資源的訪問時(shí),就會(huì)使用分布式鎖。Redis通過其原子命令(如SETNX,SET if Not eXists)來做分布式鎖。它允許調(diào)用者設(shè)置一個(gè)不存在的鍵。 比如,客戶端通過設(shè)置一個(gè)唯一的Key來獲取鎖: 

SETNX lock "1234abcd" EX 3 

如果Key尚未設(shè)置,SETNX命令返回 1,表明鎖已被客戶端獲取??蛻舳送瓿晒ぷ骱?刪除Key ,釋放鎖。 

如果Key已被設(shè)置,SETNX命令返回 0,表明鎖已被其他客戶機(jī)持有。在這種情況下,客戶端會(huì)等待并重試SETNX操作,直到鎖被其他客戶端釋放。 

請(qǐng)注意,這種簡(jiǎn)單的實(shí)現(xiàn)對(duì)于許多用例來說已經(jīng)足夠好了,但并非完全容錯(cuò)。對(duì)于生產(chǎn)應(yīng)用,許多 Redis 客戶端庫提供高質(zhì)量的分布式鎖實(shí)現(xiàn)。

消息隊(duì)列

Redis的發(fā)布/訂閱功能使其成為一個(gè)輕量級(jí)的消息隊(duì)列系統(tǒng)。通過使用Redis的發(fā)布/訂閱模式,不同的應(yīng)用程序可以通過發(fā)布和訂閱消息來進(jìn)行異步通信,實(shí)現(xiàn)解耦和高效的消息傳遞。這對(duì)于構(gòu)建可靠的消息系統(tǒng)和異步任務(wù)處理非常有用。 

限流 

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ù)。

計(jì)數(shù)

在Redis中進(jìn)行計(jì)數(shù)可以使用多種方式,其中最簡(jiǎn)單和常用的方式是使用`INCR`命令。 如果你想要對(duì)一個(gè)鍵進(jìn)行計(jì)數(shù),可以使用`INCR`命令來增加這個(gè)鍵的值。例如:

INCR my_counter 

這將會(huì)增加名為"my_counter"的鍵的值,如果這個(gè)鍵不存在,會(huì)被初始化為0,然后增加1。這樣就可以實(shí)現(xiàn)簡(jiǎn)單的計(jì)數(shù)操作。你也可以使用其他命令來對(duì)計(jì)數(shù)器進(jìn)行操作,比如`INCRBY`用于增加指定的值,`DECR`和`DECRBY`用于減少計(jì)數(shù)器的值。

全局ID

Redis是一個(gè)內(nèi)存數(shù)據(jù)庫,它可以用作鍵值存儲(chǔ)。如果你想在Redis中創(chuàng)建一個(gè)全局唯一的ID,你可以使用Redis的自增命令,比如?INCR?命令來實(shí)現(xiàn)。通過在Redis中設(shè)置一個(gè)特殊的鍵,然后使用?INCR?命令,你可以遞增一個(gè)計(jì)數(shù)器并得到一個(gè)唯一的ID。例如:

redis INCR global_id

這會(huì)遞增名為?global_id?的鍵的值,并返回遞增后的值,這樣你就可以得到一個(gè)全局唯一的ID。

游戲排行榜 

對(duì)于大多數(shù)規(guī)模不是很大的游戲來說,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) 完成排序。

購物車

我們可以使用Hash來表示購物車中的鍵值對(duì)。對(duì)于簡(jiǎn)單的電商平臺(tái)來說,在Redis中實(shí)現(xiàn)購物車可以兼顧用戶體驗(yàn)和快速交付。

計(jì)算用戶留存率 

我們可以使用Bitmap來表示每天登錄的用戶并計(jì)算用戶保留率。這種計(jì)數(shù)功能占用的內(nèi)存很少

20231211-135556

總結(jié)

Redis的多面手能力使其在各種應(yīng)用場(chǎng)景中大放異彩。除了作為高性能的緩存工具外,Redis作為數(shù)據(jù)庫、分布式鎖、消息隊(duì)列、實(shí)時(shí)數(shù)據(jù)處理、緩存管理和地理空間數(shù)據(jù)存儲(chǔ)等方面都有廣泛的應(yīng)用。開發(fā)人員可以根據(jù)具體需求發(fā)揮Redis的強(qiáng)大功能,構(gòu)建出高性能、可靠和可擴(kuò)展的應(yīng)用系統(tǒng)。無論是小型項(xiàng)目還是大規(guī)模分布式系統(tǒng),Redis都是一個(gè)值得信賴的工具。

1698630578111788

如果你對(duì)編程知識(shí)和相關(guān)職業(yè)感興趣,歡迎訪問編程獅官網(wǎng)(http://o2fo.com/)。在編程獅,我們提供廣泛的技術(shù)教程、文章和資源,幫助你在技術(shù)領(lǐng)域不斷成長(zhǎng)。無論你是剛剛起步還是已經(jīng)擁有多年經(jīng)驗(yàn),我們都有適合你的內(nèi)容,助你取得成功。


0 人點(diǎn)贊