<tr id="ieeco"><small id="ieeco"></small></tr>
<acronym id="ieeco"></acronym>

大廠Redis高并發場景設計,面試問的都在這!

寫在前面

同時用XMind畫了一張導圖記錄Redis的學習筆記和一些面試解析(源文件對部分節點有詳細備注和參考資料,歡迎關注我的公眾號:阿風的架構筆記 后臺發送【導圖】拿下載鏈接, 已經完善更新):

正文

分布式緩存是分布式系統中的重要組件,主要解決高并發、大數據場景下,熱點數據訪問的性能問題,提供高性能的數據快速訪問。

使用緩存常見場景是:項目中部分數據訪問比較頻繁,對下游 DB(例如 MySQL)造成服務壓力,這時候可以使用緩存來提高效率。下面來講BAT等一線企業中Redis各種應用場景核心設計!

一、常用指令

接下來看看每個數據結構常用的指令有哪些,我們用一張表比較清晰的展示:

img

二、場景解析

1.1string存儲

img

1.2String 類型使用場景

場景一:商品庫存數

從業務上,商品庫存數據是熱點數據,交易行為會直接影響庫存。而 Redis 自身 String 類型提供了:

  1. set goods_id 10; 設置 id 為 good_id 的商品的庫存初始值為 10;
  2. decr goods_id; 當商品被購買時候,庫存數據減 1。

依次類推的場景:商品的瀏覽次數,問題或者回復的點贊次數等。這種計數的場景都可以考慮利用 Redis 來實現。

場景二:時效信息存儲

Redis 的數據存儲具有自動失效能力。也就是存儲的 key-value 可以設置過期時間:set(key, value, expireTime)。

比如,用戶登錄某個 App 需要獲取登錄驗證碼, 驗證碼在 30 秒內有效。那么我們就可以使用 String 類型存儲驗證碼,同時設置 30 秒的失效時間。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-YVYYAIf9-1589895386136)(data:image/svg+xml;utf8,)]

2.1hash存儲數據

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EJFSijlP-1589895386138)(data:image/svg+xml;utf8,)]

2.2Hash 類型使用場景

Redis 在存儲對象(例如:用戶信息)的時候需要對對象進行序列化轉換然后存儲。

還有一種形式,就是將對象數據轉換為 JSON 結構數據,然后存儲 JSON 的字符串到 Redis。

對于一些對象類型,還有一種比較方便的類型,那就是按照 Redis 的 Hash 類型進行存儲。

例如,我們存儲一些網站用戶的基本信息, 我們可以使用:

這樣就存儲了一個用戶基本信息,存儲信息有:{name : 小明, phone : “123456”,sex : “男”}

當然這種類似場景還非常多, 比如存儲訂單的數據,產品的數據,商家基本信息等。以淘寶購物車為主

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-rKfgbmuK-1589895386139)(data:image/svg+xml;utf8,)]

2.3實現信息存儲的優缺點

1.原生:

  • set user: 1:name james;
  • set user:1:age 23;
  • set user:1:sex boy;

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

缺點: 鍵數過多,占用內存多,用戶信息過于分散,不用于生產環境

2.將對象序列化存入

redis set user:1 serial ize (userInfo);

優點: 編程簡單,若使用序列化合理內存使用率高

缺點: 序列化與反序列化有一定開銷,更新屬性時需要把userInfo全取出來進行反序列化,更新后再序列化到redis

3.hash存儲:

hmset user:1 name james age 23 sex boy

優點: 簡單直觀,使用合理可減少內存空間消耗

缺點: 要控制ziplist 與hashtable兩種編碼轉換,Mhashtable會消耗更多內存。

3.1List 類型使用場景

list 是按照插入順序排序的字符串鏈表??梢栽陬^部和尾部插入新的元素(雙向鏈表實現,兩端添加元素的時間復雜度為 O(1)) 。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Zvx5IVDF-1589895386139)(data:image/svg+xml;utf8,)]

場景一:消息隊列實現

目前有很多專業的消息隊列組件 Kafka、RabbitMQ 等。 我們在這里僅僅是使用 list 的特征來實現消息隊列的要求。在實際技術選型的過程中,大家可以慎重思考。

list 存儲就是一個隊列的存儲形式:

  1. lpush key value; 在 key 對應 list 的頭部添加字符串元素;
  2. rpop key;移除列表的最后一個元素,返回值為移除的元素。

場景二:最新上架商品

在交易網站首頁經常會有新上架產品推薦的模塊, 這個模塊是存儲了最新上架前 100 名。

這時候使用 Redis 的 list 數據結構,來進行 TOP 100 新上架產品的存儲。

Redis ltrim 指令對一個列表進行修剪(trim),這樣 list 就會只包含指定范圍的指定元素。

start 和 stop 都是由 0 開始計數的,這里的 0 是列表里的第一個元素(表頭),1 是第二個元素。

4.1set 類型使用場景

set 也是存儲了一個集合列表功能。和 list 不同,set 具備去重功能。當需要存儲一個列表信息,同時要求列表內的元素不能有重復,這時候使用 set 比較合適。與此同時,set 還提供的交集、并集、差集。

例如,在交易網站,我們會存儲用戶感興趣的商品信息,在進行相似用戶分析的時候, 可以通過計算兩個不同用戶之間感興趣商品的數量來提供一些依據。

獲取到兩個用戶相似的產品, 然后確定相似產品的類目就可以進行用戶分析。

類似的應用場景還有, 社交場景下共同關注好友, 相似興趣 tag 等場景的支持。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ig9Ydf02-1589895386140)(data:image/svg+xml;utf8,)]

4.2Set集合特殊的操作命令

setA={A,B,C} setB={B, C}

1)集合與集合之間的交集

sinter setA setB-->得到集合{B,C}

  1. 集合與集合之間的并集

sunion setA setB -->得到集合{A,B,C}

3)集合與集合之間的差集

sdiff setA setB-->得到集合{A}

4.3Set集合特殊的操作命令應用場景

如何實現微博的微關系設計?(看視頻更香)

www.bilibili.com/video/av921…

img

5.1 Zset有序集合

常用于排行榜,如視頻網站需要對用戶上傳視頻做排行榜,或點贊數與集合有聯系,不能有重復的成員

img

5.2Zset 類型使用場景

img

看完三件事??

如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:
?

  1. 點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。
  2. 關注公眾號 『 阿風的架構筆記 』,不定期分享原創知識。
  3. 同時可以期待后續文章ing🚀
  4. 關注后回復【666】掃碼即可獲取架構進階學習資料包
    在這里插入圖片描述
已標記關鍵詞 清除標記
<p> <span style="font-size:16px;">概要介紹</span><span style="font-size:16px;">:</span><span></span> </p> <p> <span style="font-size:16px;">本門課程屬于“</span><span style="font-size:16px;"><strong>Java</strong></span><span style="font-size:16px;"><strong>分布式中間件大匯聚實戰</strong>”系列課程,主要介紹了企業級項目中真實的應用場景的實現及主流的</span><span style="font-size:16px;">Java</span><span style="font-size:16px;">核心技術棧(</span><span style="font-size:16px;">Redis</span><span style="font-size:16px;">、</span><span style="font-size:16px;">RabbitMQ</span><span style="font-size:16px;">、</span><span style="font-size:16px;">Spring AOP</span><span style="font-size:16px;">、</span><span style="font-size:16px;">Redisson</span><span style="font-size:16px;">、</span><span style="font-size:16px;">ZooKeeper…</span><span style="font-size:16px;">)的實戰等等。除此之外,還介紹了如何基于</span><span style="font-size:16px;">Redis</span><span style="font-size:16px;">設計并實戰一款點贊系統(點贊、取消點贊、排行榜、用戶中心、文章點贊用戶列表</span><span style="font-size:16px;">…</span><span style="font-size:16px;">)可以說技術干貨甚多,不僅可以鞏固企業級應用系統的開發實戰能力,相信在試、跳槽漲薪方也能帶來相應的幫助!</span><span></span> </p> <p> <span style="font-size:16px;">課程內容</span><span style="font-size:16px;">:</span> </p> <p> <span></span> </p> <p> <span style="font-size:16px;">傳說中的金三銀四、試跳槽漲薪季已經來臨,</span><span style="font-size:16px;">Debug</span><span style="font-size:16px;">特地為大家準備了一系列跟試、跳槽、鞏固核心技術棧相關的課程,本門課程屬于第一季,其中的內容包括企業級項目中真實的應用場景實戰、試相關的技術點分享、主流的</span><span style="font-size:16px;">Java</span><span style="font-size:16px;">技術棧(</span><span style="font-size:16px;">Undertow</span><span style="font-size:16px;">、</span><span style="font-size:16px;">Redis</span><span style="font-size:16px;">、</span><span style="font-size:16px;">RabbitMQ</span><span style="font-size:16px;">、</span><span style="font-size:16px;">Spring AOP</span><span style="font-size:16px;">、</span><span style="font-size:16px;">Redisson</span><span style="font-size:16px;">、</span><span style="font-size:16px;">ZooKeeper…</span><span style="font-size:16px;">)實戰等等。</span><span></span> </p> <p> <span style="font-size:16px;">除此之外,我們還基于</span><span style="font-size:16px;">Redis</span><span style="font-size:16px;">設計并實戰了一款點贊系統,可以說技術干貨甚多。在課程的最后,</span><span style="font-size:16px;">Debug</span><span style="font-size:16px;">給大家整理了一份最新的向</span><span style="font-size:16px;">BAT</span><span style="font-size:16px;">大廠招聘 </span><span style="font-size:16px;">~ 2020</span><span style="font-size:16px;">年程序猿最新的</span><span style="font-size:16px;">Java</span><span style="font-size:16px;">試題(附帶目錄和答案),希望對各位小伙伴的成長有所幫助!</span><span></span> </p> <p> <span style="font-size:16px;">值得一提的是,<span style="color:#E53333;">本季課程實戰的應用場景包括“日志記錄”、“郵件發送”、“通告消息通知”、“短信驗證碼失效驗證”、“會員到期自動提醒</span></span><span style="font-size:16px;color:#E53333;">/</span><span style="font-size:16px;color:#E53333;">到期前</span><span style="font-size:16px;color:#E53333;">N</span><span style="font-size:16px;"><span style="color:#E53333;">天自動提醒”以及“點贊系統”的設計與實戰</span>,其大綱如下所示:</span><span></span> </p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202003191542029393.jpg" alt="" /></p> <p> <span style="font-size:16px;">其中,<span style="color:#E53333;">涉及到的技術棧包括</span></span><span style="font-size:16px;color:#E53333;">Spring Boot2.0</span><span style="font-size:16px;color:#E53333;">、</span><span style="font-size:16px;color:#E53333;">Mybatis</span><span style="font-size:16px;color:#E53333;">、</span><span style="font-size:16px;color:#E53333;">Undertow</span><span style="font-size:16px;color:#E53333;">、</span><span style="font-size:16px;color:#E53333;">Redis</span><span style="font-size:16px;color:#E53333;">、</span><span style="font-size:16px;color:#E53333;">RabbitMQ</span><span style="font-size:16px;color:#E53333;">、</span><span style="font-size:16px;color:#E53333;">Redisson</span><span style="font-size:16px;color:#E53333;">、</span><span style="font-size:16px;color:#E53333;">Spring AOP</span><span style="font-size:16px;color:#E53333;">、</span><span style="font-size:16px;color:#E53333;"> Java8…</span><span style="font-size:16px;">下羅列出本門課程重點介紹的價格應用案例以及業務場景的實現流程圖!</span><span></span> </p> <p> <span style="font-size:16px;">(</span><span style="font-size:16px;">1</span><span style="font-size:16px;">)基于</span><span style="font-size:16px;">Spring</span><span style="font-size:16px;">的消息驅動模型實現日志的異步記錄:</span><span></span> </p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202003191542305270.png" alt="" /></p> <p> <span style="font-size:16px;">(</span><span style="font-size:16px;">2</span><span style="font-size:16px;">)基于消息中間件</span><span style="font-size:16px;">RabbitMQ</span><span style="font-size:16px;">的消息隊列實現日志的異步記錄:</span><span></span> </p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202003191542392329.png" alt="" /></p> <p> <span style="font-size:16px;">(</span><span style="font-size:16px;">3</span><span style="font-size:16px;">)基于緩存中間件</span><span style="font-size:16px;">Redis</span><span style="font-size:16px;">的訂閱發布機制實現商戶公告消息通知:</span><span></span> </p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202003191542464483.png" alt="" /></p> <p> <span style="font-size:16px;">(</span><span style="font-size:16px;">4</span><span style="font-size:16px;">)基于</span><span style="font-size:16px;">Redis</span><span style="font-size:16px;">的</span><span style="font-size:16px;">Key</span><span style="font-size:16px;">失效與定時任務實現實現短信驗證碼的過期失效驗證:</span><span></span> </p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202003191542561828.png" alt="" /></p> <p> <span style="font-size:16px;">其他核心、典型的應用案例和業務場景的實戰可以詳細參考“課程目錄”!</span><span></span> </p> <p> <br /></p> <p> <span style="font-size:16px;">除此之外,我們還基于緩存中間件</span><span style="font-size:16px;">Redis</span><span style="font-size:16px;">設計并實戰實現了點贊系統中的點贊功能模塊,下羅列出其中涉及到的相關功能模塊的實戰流程圖:</span><span></span> </p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202003191543184157.png" alt="" /></p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202003191543423775.png" alt="" /></p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202003191543505292.png" alt="" /></p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202003191543586733.png" alt="" /></p> <p style="text-align:left;"> <br /></p> <p style="text-align:left;"> <span style="font-size:16px;">其<strong>課程收益</strong>如下所示:</span> </p> <p style="text-align:center;"> <img src="https://img-bss.csdn.net/202003191544518309.png" alt="" /></p>
相關推薦
??2020 CSDN 皮膚主題: 數字20 設計師:CSDN官方博客 返回首頁
彩票送彩金