天天看點

2023-06-01:講一講Redis常見資料結構以及使用場景。

作者:福大大架構師每日一題

2023-06-01:講一講Redis常見資料結構以及使用場景。

答案2023-06-01:

字元串(String)

适合場景

緩存功能

Redis 作為緩存層,MySQL 作為存儲層,在大部分請求中,資料的讀取通常是從 Redis 中擷取。由于 Redis 具有支援高并發的特性,是以緩存層通常能夠加速讀寫操作,并減輕後端服務的壓力。采用 Redis 緩存層通常可以提高系統性能和穩定性,同時更好地保護 MySQL 資料庫。

計數

使用 Redis 作為計數的基礎工具,可以實作快速計數和查詢緩存的功能。Redis 的高并發讀寫特性使其非常适合作為計數器,能夠快速、可靠地處理大量的計數請求。此外,Redis 還支援資料的異步落地到其他資料源,例如 MySQL 資料庫等,進而保證資料的安全和可靠性。

共享Session

當一個分布式 Web 服務将使用者的 Session 資訊(例如使用者登入資訊)儲存在各自伺服器中時,出于負載均衡的考慮,分布式服務會将使用者的通路均衡到不同伺服器上。這可能會産生一個問題,即使用者可能需要重新登入,因為他們的 Session 資訊沒有被持續地存儲和共享。這個問題對于使用者來說是無法容忍的。

為了解決這個問題,可以使用 Redis 将使用者的 Session 進行集中管理。在這種模式下,隻需要保證 Redis 具備高可用性和擴充性,并且每次使用者更新或查詢登入資訊都直接從 Redis 中擷取即可。

通過使用 Redis,可以實作分布式 Web 服務中 Session 資訊的共享和管理。Redis 具有出色的高并發讀寫能力和快速響應速度,能夠有效地維護大量的 Session 資料。此外,Redis 的資料持久化和備份機制也能夠確定資料的安全性和可靠性。

限速

許多應用為了保證安全性,在每次使用者登入時會要求輸入手機驗證碼以驗證使用者身份。但是,為避免短信接口被頻繁通路,通常會限制使用者擷取驗證碼的頻率,例如一分鐘不能超過5次。此外,一些網站也會限制同一 IP 位址在一秒鐘之内的通路次數,以保護系統的安全。通過限速機制,可以有效地控制使用者的通路頻率,進而保護系統的穩定性和安全性。

哈希(Hash)

在 Java 中,提供了 HashMap 資料結構來實作雜湊演算法。而在 Redis 中,也有類似的資料結構,稱之為哈希類型。需要注意的是,在哈希類型中,映射關系被稱作 field-value,其中 value 指的是與 field 對應的值,而不是鍵所對應的值。

适合場景

使用 Redis 的哈希類型可以更好地管理對象型資料,并且在合理使用的情況下可以減少記憶體消耗。是以,在實際開發中,我們應該根據業務需求和實際情況選擇合适的資料結構來進行存儲和管理。

我們可以比較下,如果資料庫中表記錄user為:

idnameage1lijin182msb20

1、使用String類型

需要一條條去插入擷取。

set user:1:name lijin;

set user:1:age  18;

set user:2:name msb;

set user:2:age  20;           

優點:簡單直覺,每個鍵對應一個值.

缺點:鍵數過多,占用記憶體多,使用者資訊過于分散,不适合在生産環境中使用。

2、使用hash類型

hmset user:1 name lijin age 18

hmset user:2 name msb age 20           

優點:簡單直覺,使用合理可減少記憶體空間消耗。

清單(list)

Redis 的清單(list)類型是一種用于存儲多個有序字元串的資料結構。一個清單由多個元素按照從左到右的順序組成,每個元素都可以是一個字元串。例如,a、b、c、c、b 四個字元串可以組成一個有序的清單。

清單中的每個字元串稱為元素(element),一個清單最多可以存儲 (2^32-1)個元素(4294967295)。在 Redis 中,可以使用清單類型來實作隊列、棧等資料結構,同時還能夠支援插入、删除等操作,具有出色的靈活性和可擴充性。

2023-06-01:講一講Redis常見資料結構以及使用場景。

image.png

适合場景

當每個使用者都有自己的文章清單并需要進行分頁展示時,可以考慮使用 Redis 的清單類型。因為清單不僅是有序的,而且支援按照索引範圍擷取元素,非常适合用于實作分頁等功能。

在 Redis 中,可以将每個使用者的文章清單存儲為一個清單,并通過 lrange 指令來擷取指定範圍内的元素。例如,可以使用以下指令來擷取第 2 頁的文章清單:

lrange user:1:article_list 20 39           

消息隊列,Redis 提供了消息隊列的支援,可以使用 lpush+brpop 指令組合來實作阻塞隊列。生産者用戶端通過 lpush 指令将消息從清單的左側插入隊列中,而多個消費者用戶端則通過 brpop 指令在清單的尾部等待阻塞式地搶占隊列中的元素。多個用戶端之間的合作能夠保證消費的負載均衡和高可用性。

使用 Redis 的消息隊列可以有效地解決異步任務處理、流量限制、延遲任務排程等問題,具有出色的靈活性和擴充性。是以,在實際開發中,Redis 的消息隊列是一種非常重要且常用的技術,需要注意其使用方式和實作原理,并根據實際需求進行合理的配置和管理。

集合(set)

2023-06-01:講一講Redis常見資料結構以及使用場景。

image.png

集合( set)類型也是用來儲存多個的字元串元素,但和清單類型不一樣的是,集合中不允許有重複元素,并且集合中的元素是無序的,不能通過索引下标擷取元素。

适合場景

Redis 的集合類型在标簽(tag)的存儲和管理方面應用廣泛。例如,一個使用者可能對娛樂、體育比較感興趣,另一個使用者可能對曆史、新聞比較感興趣,這些興趣點就是标簽。

使用 Redis 的集合類型,可以輕松地實作對使用者興趣标簽的存儲和管理,并根據使用者的标簽相似度來實作個性化推薦。例如,電子商務網站針對不同标簽的使用者做出不同類型的推薦,比如對數位産品感興趣的人,推薦最新的數位産品,這将有助于增加網站的利潤和使用者黏度。

除了标簽管理外,集合還可以通過生成随機數進行比如抽獎活動等其他功能。此外,Redis 的集合類型還支援交、并、差等操作,以及集合和有序集合之間的轉換功能,能夠快速高效地進行資料處理和管理。

有序集合(ZSET)

2023-06-01:講一講Redis常見資料結構以及使用場景。

image.png

Redis 的有序集合類型相對于哈希、清單、集合來說可能會比較陌生,但是它和普通的集合類型有一些共同的特點,例如保留了不能有重複成員的特性。不同之處在于,有序集合中的元素具有可排序的特性。

有序集合通過給每個元素設定一個分數(score)來實作排序,而不像清單使用索引下标作為排序依據。

Redis 的有序集合類型中的元素不能重複,但是一個元素的分數在集合中可以存在多個相同的值,類似于班裡的學生學号不能重複,但考試成績可以相同。

Redis 的有序集合類型提供了一些非常實用的功能,例如基于分數範圍的查詢和統計操作,以及成員排名等。适當地利用有序集合類型,可以幫助我們在實際開發中更好地解決各種問題。

Redis 的有序集合類型非常适合用于實作排行榜系統,例如在視訊網站中對使用者上傳的視訊按照播放數量、點贊數等多個次元進行排行。

通過使用有序集合,可以輕松地将每個視訊以及對應的播放量、點贊數等資訊存儲到 Redis 中,并根據這些資訊計算出每個視訊的排名。例如,可以使用以下指令向有序集合中添加新的元素:

zadd videos:views 1000 "video1"
zadd videos:views 2000 "video2"
zadd videos:likes 500 "video1"
zadd videos:likes 800 "video2"           

其中,videos:views 和 videos:likes 分别表示按照播放量和點贊數排列的有序集合名稱,"video1" 和 "video2" 則是視訊的名稱,1000、2000、500、800 則表示對應的播放量和點贊數。使用 zrange 或 zrevrange 指令即可按照指定分數範圍擷取元素,或者使用 zrank 和 zrevrank 指令擷取指定元素的排名和反向排名等。

繼續閱讀