分佈式緩存是分佈式系統中的重要組件,主要解決高併發、大數據場景下,熱點數據訪問的性能問題,提供高性能的數據快速訪問。面試
使用緩存常見場景是:項目中部分數據訪問比較頻繁,對下游 DB(例如 MySQL)形成服務壓力,這時候可使用緩存來提升效率。下面來說BAT等一線企業中Redis各類應用場景核心設計!redis
接下來看看每一個數據結構經常使用的指令有哪些,咱們用一張表比較清晰的展現:編程
場景一:商品庫存數後端
從業務上,商品庫存數據是熱點數據,交易行爲會直接影響庫存。而 Redis 自身 String 類型提供了:緩存
依次類推的場景:商品的瀏覽次數,問題或者回復的點贊次數等。這種計數的場景均可以考慮利用 Redis 來實現。數據結構
場景二:時效信息存儲架構
Redis 的數據存儲具備自動失效能力。也就是存儲的 key-value 能夠設置過時時間:set(key, value, expireTime)。併發
好比,用戶登陸某個 App 須要獲取登陸驗證碼, 驗證碼在 30 秒內有效。那麼咱們就可使用 String 類型存儲驗證碼,同時設置 30 秒的失效時間。分佈式
Redis 在存儲對象(例如:用戶信息)的時候須要對對象進行序列化轉換而後存儲。ide
還有一種形式,就是將對象數據轉換爲 JSON 結構數據,而後存儲 JSON 的字符串到 Redis。
對於一些對象類型,還有一種比較方便的類型,那就是按照 Redis 的 Hash 類型進行存儲。
例如,咱們存儲一些網站用戶的基本信息, 咱們可使用:
這樣就存儲了一個用戶基本信息,存儲信息有:{name : 小明, phone : 「123456」,sex : 「男」}
固然這種相似場景還很是多, 好比存儲訂單的數據,產品的數據,商家基本信息等。以淘寶購物車爲主
優勢:簡單直觀,每一個鍵對應一個值
缺點:鍵數過多,佔用內存多,用戶信息過於分散,不用於生產環境
2.將對象序列化存入
redis set user:1 serial ize (userInfo);
優勢:編程簡單,若使用序列化合理內存使用率高
缺點:序列化與反序列化有必定開銷,更新屬性時須要把userInfo全取出來進行反序列化,更新後再序列化到redis
3.hash存儲:
hmset user:1 name james age 23 sex boy
優勢:簡單直觀,使用合理可減小內存空間消耗
缺點:要控制ziplist 與hashtable兩種編碼轉換,Mhashtable會消耗更多內存。
list 是按照插入順序排序的字符串鏈表。能夠在頭部和尾部插入新的元素(雙向鏈表實現,兩端添加元素的時間複雜度爲 O(1)) 。
場景一:消息隊列實現
目前有不少專業的消息隊列組件 Kafka、RabbitMQ 等。 咱們在這裏僅僅是使用 list 的特徵來實現消息隊列的要求。在實際技術選型的過程當中,你們能夠慎重思考。
list 存儲就是一個隊列的存儲形式:
場景二:最新上架商品
在交易網站首頁常常會有新上架產品推薦的模塊, 這個模塊是存儲了最新上架前 100 名。
這時候使用 Redis 的 list 數據結構,來進行 TOP 100 新上架產品的存儲。
Redis ltrim 指令對一個列表進行修剪(trim),這樣 list 就會只包含指定範圍的指定元素。
start 和 stop 都是由 0 開始計數的,這裏的 0 是列表裏的第一個元素(表頭),1 是第二個元素。
以下僞代碼演示:
set 也是存儲了一個集合列表功能。和 list 不一樣,set 具有去重功能。當須要存儲一個列表信息,同時要求列表內的元素不能有重複,這時候使用 set 比較合適。與此同時,set 還提供的交集、並集、差集。
例如,在交易網站,咱們會存儲用戶感興趣的商品信息,在進行類似用戶分析的時候, 能夠經過計算兩個不一樣用戶之間感興趣商品的數量來提供一些依據。
獲取到兩個用戶類似的產品, 而後肯定類似產品的類目就能夠進行用戶分析。
相似的應用場景還有, 社交場景下共同關注好友, 類似興趣 tag 等場景的支持。
setA={A,B,C} setB={B, C}
1)集合與集合之間的交集
sinter setA setB-->獲得集合{B,C}
2) 集合與集合之間的並集
sunion setA setB -->獲得集合{A,B,C}
3)集合與集合之間的差集
sdiff setA setB-->獲得集合{A}
如何實現微博的微關係設計?(看視頻更香)
經常使用於排行榜,如視頻網站須要對用戶上傳視頻作排行榜,或點贊數與集合有聯繫,不能有重複的成員
2020年面試必備的Java後端進階面試題總結了一份將近500頁的pdf文檔,歡迎關注個人公衆號:以Java架構贏天下,回覆【2020】領取這些整理的資料!
喜歡文章記得關注我點個贊喲,感謝支持!