Redis資料型別的應用業務場景分析
這篇文章主要針對Redis中不同資料型別在各種業務場景下的應用進行一個介紹,以加深我們對Redis中資料類特性和操作的概念印象。
字串
擴充套件操作
業務場景
大型企業級應用中,分表操作是基本操作,使用多張表儲存同類型資料,但是對應的主鍵id必須保證統一性,不能重複。Oracle資料庫具有sequence設定,可以解決該問題,但是MySQL資料庫並不具有類似的機制,那麼如何解決。
解決方案
不要讓資料庫進行主鍵自增,而是由Redis來控制主鍵的增減操作。
建立字串物件,並且其中儲存的純數字。
- 設定數值資料增加指定範圍的值
incr key incrby key increment incrbyfloat
- 設定數值資料減少的指定範圍的值
decr key
decrby ke increment
String作為數值操作
- string在redis內部儲存預設就是一個字串,當遇到增減類操作incr,decr時會轉成數值型進行計算。
- redis所有的操作都是原子性的,採用單執行緒處理所有業務,命令是一個一個執行的,因此無需考慮併發帶來的資料影響。
- 注意:按數值進行操作的資料,如果原始資料不能轉成數值,或超過了redis數值上線範圍,將會報錯。9223372036854775807 (java中long型資料最大值,Long.MAX_VALUE)。
資料時效性
業務場景
微信上的投票,每個微訊號每4個小時只能投1票;電商商家開啟熱門商品推薦,熱門商品不能一直處於熱門期,每種商品熱門期維持3天,3天后自動取消;熱門新聞網站會出現熱點新聞,熱點新聞最大的特徵是對時效性,如何自動控制熱點新聞的時效性。
解決方案
- 設定資料具有指定的宣告週期
setex key seconds value
psetex key milliseconds value
熱點資料
業務場景
主頁高頻訪問資訊顯示控制,例如微博上大V主頁顯示粉絲數與微博數量。
解決方案
- 在Redis中為使用者設定使用者資訊,以使用者主鍵和屬性值作為Redis字串的key,後臺設定定時重新整理策略。
- 在Redis中可以以Json格式儲存使用者資訊,放到value中,定時重新整理。(也可以用下面的雜湊)
Key的設定約定
由於Redis的資料大部分和資料庫有關係,所以,key的命名需要和資料庫中的相關資訊對應。資料庫中的熱點資料key命名慣例如下:
表名:主鍵名:主鍵值:欄位名
order:id :123123:name
雜湊
如果用字串儲存了Json資料,如果需要修改,那麼就會修改整個字串,顯得十分笨重。字串比較適用於讀取的操作,如果更新操作比較多,還是用雜湊。
購物車
業務場景
電商網站購物車設計與實現。
業務分析
- 僅分析購物車的redis儲存模型,新增、瀏覽、更改數量、刪除、清空。
- 購物車於資料庫間持久化同步。
- 購物車和訂單之間關係,提交購物車:讀取資料生成訂單;商家價格調整:隸屬訂單級別。
- 未登入使用者購物車資訊儲存:cookie儲存。
解決方案
- 將使用者的id作為key,每個客戶建立一個雜湊儲存結構對應的購物車資訊。
- 商品的id作為field,數量作為value。
- 新增商品:追加全新的field與value。
- 瀏覽:遍歷雜湊。
- 更改數量:設定對應field的value。
- 刪除商品:闡述field。
- 清空:刪除key。
加速購物車的呈現
利用一個獨立雜湊結構專用於儲存購物車中顯示的資訊,包含文字描述,圖片地址,所屬商家資訊等
1、命名格式:商品id
2、儲存資料:各類資訊
查詢商品資訊的時候,就直接去檢索這個表。
利用hsetnx操作,如果當前key存在有值,那就什麼都不錯,如果沒有值,那就新增。
搶購
業務場景
不同商家,退出不同的商品,需要進行搶購。
解決方案
- 以商家id作為key。
- 將參與搶購的商品id作為field。
- 將對應的商品數量作為value。
- 搶購時使用降值的方式控制產品數量。
列表
時間順序要求
業務場景
- 使用者關注列表的顯示順序就是根據時間顯示的。
- 新聞資訊之類的展示順序根據發生的是新順序。
- 企業運營過程中,系統產生大量的運營資料,如何保障多臺伺服器操作日誌的同一輸出順序。
** 解決方案**
- 依賴list的資料具有順序的特徵對資訊進行管理。
- 使用佇列模型解決多路資訊彙總合併的問題。
- 使用棧模型解決最新訊息的問題。
集合
操作隨機資料
業務場景
給使用者隨機推送熱門視訊。
業務分析
- 系統分析出各個分類的最新或最熱點資訊條目並組織成set集合。
- 隨機挑選其中部分資訊。
- 配合使用者關注資訊分類中的熱點資訊組織展示的全資訊集合。
解決方案
- 隨機獲取集合中指定數量的資料。
srandmember key count
- 隨機獲取集合中某個資料並將資料移除集合
spop key
推薦系統
業務場景
- 微博的熱門博主推薦。
- QQ共同好友顯示,好友推薦。
- 美團的店鋪推薦之類的。
解決方案
- 求兩個集合的交併差集合。
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
- 求兩個集合的交併差集合並存儲到指定的集合中。
sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]
- 將指定資料從原始集合中移動到目標集合中。
smove source destination member
許可權校驗
業務場景
公司具有很多員工,內部OA系統具有多種角色、業務操作和資料,每個員工也具有一個或者多個的角色,如何進行許可權校驗。
解決方案
- 依賴set集合資料不重複的特徵,依賴set集合hash儲存結構特徵完成資料過濾與快速查詢。
- 根據使用者id獲取使用者所有角色。
- 根據使用者所有角色獲取使用者所有操作許可權放入set集合。
- 根據使用者所有角色獲取使用者所有資料全選放入set集合。
網站訪問量統計
業務場景
統計網站的訪問量(PV)、獨立訪客(UV)、獨立IP。
解決方案
- 利用set集合的資料去重特徵,記錄各種訪問資料。
- 建立string型別資料,利用incr統計日訪問量(PV)。
- 建立set模型,記錄不同cookie數量(UV)。
- 建立set模型,記錄不用IP數量(IP)。
黑白名單
業務場景
將惡意使用者拉入黑名單,將可靠的使用者納入白名單。
解決方案
- 基於經營戰略設定問題使用者發現、鑑別規則。
- 週期性更新滿足規則的使用者黑名單,加入set集合。
- 使用者行為資訊達到後與黑名單進行比比對,確認行為去向。
- 黑名單過濾IP地址:應用於開放遊客訪問許可權的資訊源。
- 黑名單過濾裝置資訊:應用於限定訪問裝置的資訊源。
- 黑名單過濾使用者:應用於基於訪問許可權的資訊源。
排序集合
排行榜
業務場景
- 各類投票排序。
- 聊天室活躍度排序。
- 好友親密度排序。
解決方案
- 獲取資料對應的索引(排名)。
zrank key member
zrevrank key member
- score 值獲取與修改。
zscore key member
zincrby key increment member
基於時效性控制的任務管理
業務場景
- 例如時效性的會員機制。
- 網站定期開啟投票,限時操作,逾期作廢。
解決方案
- 對於基於時間線限定的任務處理,將處理時間記錄為score值,利用排序功能區分處理的先後順序。
- 記錄下一個要處理的事件,當到期後處理對應的任務,移除redis中的記錄,並記錄下一個要處理的時間。
- 當新任務加入時,判定並更新當前下一個要處理的任務時間。
- 為提升sorted_set的效能,通常將任務根據特徵儲存成若干個sorted_set。例如1小時內,1天內,年度等,操作時逐漸提升,將即將操作的若干個任務納入到1小時內處理佇列中。
帶有權重的任務管理
業務場景
任務佇列和訊息佇列具有權重,根據其優先順序進行不同處理。
解決方案
- 對於帶有權重的任務,優先處理權重高的任務,採用score記錄權重即可。