阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

簡介

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

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

常用指令

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

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

場景解析

1.1string存儲

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

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 秒的失效時間。

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

2.1hash存儲數據

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

2.2Hash 類型使用場景

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

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

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

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

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

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

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

2.3實現信息存儲的優缺點

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

3.2List 類型使用場景

list 是按照插入順序排序的字符串鏈表。可以在頭部和尾部插入新的元素(雙向鏈表實現,兩端添加元素的時間複雜度為 O(1)) 。

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

場景一:消息隊列實現

目前有很多專業的消息隊列組件 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 等場景的支持。

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

4.2Set集合特殊的操作命令

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}

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

如何實現微博的微關係設計?(文末有教學課程)

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

5.1 Zset有序集合

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

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

5.2Zset 類型使用場景

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

在這介紹了Redis各種應用場景核心設計,這裡沒有具體的一個代碼展示,不過在這推薦一個大咖的Redis核心技能實戰教學,有需要學習這Redis知識的可以來添加VX:rxh8515 備註:Redis,參與學習(限時優惠0.1元)!

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

學習內容

《Redis狂瀾BAT真相分析》

  1. Redis快速入門指南;
  2. Redis數據結構解析;
  3. 緩存雪崩與穿透解析;
  4. Redis持久化解析;

《Redis各種應用場景核心設計》

  1. 微博關係設計實戰;
  2. 微信關注設計實戰;
  3. 抽獎程序設計實戰;
  4. 分佈式鎖設計實戰;

《Redis性能測試及手寫實戰》

  1. Redis性能測試實戰;
  2. Redis的底層協議實戰;
  3. 手寫Redis客戶端實戰;
  4. 將系統改成Redis實戰;

同時還能免費獲取課件源碼筆記及更多Java架構進階學習筆記及學習視頻哦,有需要的朋友轉發後私信回覆【Redis】即可獲取資料免費領取方式!

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計

阿里Java二面:熟悉Redis?說說Redis的各種應用場景核心設計


分享到:


相關文章: