2023-06-01:講一講Redis常見數(shù)據結構以及使用場景。
2023-06-01:講一講Redis常見數(shù)據結構以及使用場景。
答案2023-06-01:
字符串(String)
適合場景
緩存功能
Redis 作為緩存層,MySQL 作為存儲層,在大部分請求中,數(shù)據的讀取通常是從 Redis 中獲取。由于 Redis 具有支持高并發(fā)的特性,因此緩存層通常能夠加速讀寫操作,并減輕后端服務的壓力。采用 Redis 緩存層通??梢蕴岣呦到y(tǒng)性能和穩(wěn)定性,同時更好地保護 MySQL 數(shù)據庫。
計數(shù)
使用 Redis 作為計數(shù)的基礎工具,可以實現(xiàn)快速計數(shù)和查詢緩存的功能。Redis 的高并發(fā)讀寫特性使其非常適合作為計數(shù)器,能夠快速、可靠地處理大量的計數(shù)請求。此外,Redis 還支持數(shù)據的異步落地到其他數(shù)據源,例如 MySQL 數(shù)據庫等,從而保證數(shù)據的安全和可靠性。
共享Session
當一個分布式 Web 服務將用戶的 Session 信息(例如用戶登錄信息)保存在各自服務器中時,出于負載均衡的考慮,分布式服務會將用戶的訪問均衡到不同服務器上。這可能會產生一個問題,即用戶可能需要重新登錄,因為他們的 Session 信息沒有被持續(xù)地存儲和共享。這個問題對于用戶來說是無法容忍的。
為了解決這個問題,可以使用 Redis 將用戶的 Session 進行集中管理。在這種模式下,只需要保證 Redis 具備高可用性和擴展性,并且每次用戶更新或查詢登錄信息都直接從 Redis 中獲取即可。
通過使用 Redis,可以實現(xiàn)分布式 Web 服務中 Session 信息的共享和管理。Redis 具有出色的高并發(fā)讀寫能力和快速響應速度,能夠有效地維護大量的 Session 數(shù)據。此外,Redis 的數(shù)據持久化和備份機制也能夠確保數(shù)據的安全性和可靠性。
限速
許多應用為了保證安全性,在每次用戶登錄時會要求輸入手機驗證碼以驗證用戶身份。但是,為避免短信接口被頻繁訪問,通常會限制用戶獲取驗證碼的頻率,例如一分鐘不能超過5次。此外,一些網站也會限制同一 IP 地址在一秒鐘之內的訪問次數(shù),以保護系統(tǒng)的安全。通過限速機制,可以有效地控制用戶的訪問頻率,從而保護系統(tǒng)的穩(wěn)定性和安全性。
哈希(Hash)
在 Java 中,提供了 HashMap 數(shù)據結構來實現(xiàn)哈希算法。而在 Redis 中,也有類似的數(shù)據結構,稱之為哈希類型。需要注意的是,在哈希類型中,映射關系被稱作 field-value,其中 value 指的是與 field 對應的值,而不是鍵所對應的值。
適合場景
使用 Redis 的哈希類型可以更好地管理對象型數(shù)據,并且在合理使用的情況下可以減少內存消耗。因此,在實際開發(fā)中,我們應該根據業(yè)務需求和實際情況選擇合適的數(shù)據結構來進行存儲和管理。
我們可以比較下,如果數(shù)據庫中表記錄user為:
idnameage1lijin182msb20
1、使用String類型
需要一條條去插入獲取。
set?user:1:name?lijin;
set?user:1:age??18;
set?user:2:name?msb;
set?user:2:age??20;
優(yōu)點:簡單直觀,每個鍵對應一個值.
缺點:鍵數(shù)過多,占用內存多,用戶信息過于分散,不適合在生產環(huán)境中使用。
2、使用hash類型
hmset?user:1?name?lijin?age?18
hmset?user:2?name?msb?age?20
優(yōu)點:簡單直觀,使用合理可減少內存空間消耗。
列表(list)
Redis 的列表(list)類型是一種用于存儲多個有序字符串的數(shù)據結構。一個列表由多個元素按照從左到右的順序組成,每個元素都可以是一個字符串。例如,a、b、c、c、b 四個字符串可以組成一個有序的列表。
列表中的每個字符串稱為元素(element),一個列表最多可以存儲 (2^32-1)個元素(4294967295)。在 Redis 中,可以使用列表類型來實現(xiàn)隊列、棧等數(shù)據結構,同時還能夠支持插入、刪除等操作,具有出色的靈活性和可擴展性。

適合場景
當每個用戶都有自己的文章列表并需要進行分頁展示時,可以考慮使用 Redis 的列表類型。因為列表不僅是有序的,而且支持按照索引范圍獲取元素,非常適合用于實現(xiàn)分頁等功能。
在 Redis 中,可以將每個用戶的文章列表存儲為一個列表,并通過 lrange 命令來獲取指定范圍內的元素。例如,可以使用以下命令來獲取第 2 頁的文章列表:
lrange?user:1:article_list?20?39
消息隊列,Redis 提供了消息隊列的支持,可以使用 lpush+brpop 命令組合來實現(xiàn)阻塞隊列。生產者客戶端通過 lpush 命令將消息從列表的左側插入隊列中,而多個消費者客戶端則通過 brpop 命令在列表的尾部等待阻塞式地搶占隊列中的元素。多個客戶端之間的合作能夠保證消費的負載均衡和高可用性。
使用 Redis 的消息隊列可以有效地解決異步任務處理、流量限制、延遲任務調度等問題,具有出色的靈活性和擴展性。因此,在實際開發(fā)中,Redis 的消息隊列是一種非常重要且常用的技術,需要注意其使用方式和實現(xiàn)原理,并根據實際需求進行合理的配置和管理。
集合(set)

集合( set)類型也是用來保存多個的字符串元素,但和列表類型不一樣的是,集合中不允許有重復元素,并且集合中的元素是無序的,不能通過索引下標獲取元素。
適合場景
Redis 的集合類型在標簽(tag)的存儲和管理方面應用廣泛。例如,一個用戶可能對娛樂、體育比較感興趣,另一個用戶可能對歷史、新聞比較感興趣,這些興趣點就是標簽。
使用 Redis 的集合類型,可以輕松地實現(xiàn)對用戶興趣標簽的存儲和管理,并根據用戶的標簽相似度來實現(xiàn)個性化推薦。例如,電子商務網站針對不同標簽的用戶做出不同類型的推薦,比如對數(shù)碼產品感興趣的人,推薦最新的數(shù)碼產品,這將有助于增加網站的利潤和用戶黏度。
除了標簽管理外,集合還可以通過生成隨機數(shù)進行比如抽獎活動等其他功能。此外,Redis 的集合類型還支持交、并、差等操作,以及集合和有序集合之間的轉換功能,能夠快速高效地進行數(shù)據處理和管理。
有序集合(ZSET)

Redis 的有序集合類型相對于哈希、列表、集合來說可能會比較陌生,但是它和普通的集合類型有一些共同的特點,例如保留了不能有重復成員的特性。不同之處在于,有序集合中的元素具有可排序的特性。
有序集合通過給每個元素設置一個分數(shù)(score)來實現(xiàn)排序,而不像列表使用索引下標作為排序依據。
Redis 的有序集合類型中的元素不能重復,但是一個元素的分數(shù)在集合中可以存在多個相同的值,類似于班里的學生學號不能重復,但考試成績可以相同。
Redis 的有序集合類型提供了一些非常實用的功能,例如基于分數(shù)范圍的查詢和統(tǒng)計操作,以及成員排名等。適當?shù)乩糜行蚣项愋?,可以幫助我們在實際開發(fā)中更好地解決各種問題。
Redis 的有序集合類型非常適合用于實現(xiàn)排行榜系統(tǒng),例如在視頻網站中對用戶上傳的視頻按照播放數(shù)量、點贊數(shù)等多個維度進行排行。
通過使用有序集合,可以輕松地將每個視頻以及對應的播放量、點贊數(shù)等信息存儲到 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 分別表示按照播放量和點贊數(shù)排列的有序集合名稱,"video1" 和 "video2" 則是視頻的名稱,1000、2000、500、800 則表示對應的播放量和點贊數(shù)。使用 zrange 或 zrevrange 命令即可按照指定分數(shù)范圍獲取元素,或者使用 zrank 和 zrevrank 命令獲取指定元素的排名和反向排名等。