3、資料型別案例
阿新 • • 發佈:2022-04-12
1、案例一
- 業務場景:
- 人工智慧領域的語義識別與自動對話將是未來服務業機器人應答呼叫體系中的重要技術,百度自研使用者評價語義識別服務,免費開放給企業試用,同時訓練百度自己的模型。現對試用使用者的使用行為進行限速,限制每個使用者每分鐘最多發起10次呼叫
- 解決方案:
- 設計計數器,記錄呼叫次數,用於控制業務執行次數。以使用者id作為key,使用次數作為value
- 在呼叫錢獲取次數,判斷是否超過限定次數
- 不超過次數的情況下,每次呼叫計數+1
- 業務呼叫失敗,計數-1
- 為計數器設定生命週期為指定週期,例如1秒/分鐘,自動清空週期內使用次數
# 檢視使用者為415的是否存在 127.0.0.1:6379> get 415 (nil) # 建立使用者為415的,過期時間為60s 127.0.0.1:6379> setex 415 60 1 OK # 判斷是否存在 127.0.0.1:6379> get 415 "1" # 存在則+1 127.0.0.1:6379> incr 415 (integer) 2 127.0.0.1:6379> incr 415 (integer) 3 127.0.0.1:6379> incrby 415 7 (integer) 10 # 判斷是否存在,獲取當前415呼叫的次數 127.0.0.1:6379> get 415 "10" # 如果大於10則禁止呼叫,等60s,自動清空後,重新處理 127.0.0.1:6379> get 415 (nil)
- 解決方案改良:
- 取消最大值的判斷,利用incr操作超過最大值丟擲異常的形式替代每次判斷是否大於最大值
- 判斷是否為nil
- 如果是,設定為max-次數
- 如果不是,計數+1
- 業務呼叫失敗,計數-1
- 遇到異常即+操作超過上限,視為使用達到上限
# 獲取使用者415是否存在 127.0.0.1:6379> get 415 (nil) # 不存在建立,過期時間為60s 127.0.0.1:6379> setex 415 60 9223372036854775799 OK # 獲取415是否存在,存在則返回當前值 127.0.0.1:6379> get 415 "9223372036854775799" # 呼叫成功則+1 127.0.0.1:6379> incr 415 (integer) 9223372036854775800 127.0.0.1:6379> incr 415 (integer) 9223372036854775801 127.0.0.1:6379> incr 415 (integer) 9223372036854775802 127.0.0.1:6379> incrby 415 5 (integer) 9223372036854775807 # 當呼叫10次後,incr操作的最大值,丟擲異常,禁止訪問;60s過期後,重新操作 127.0.0.1:6379> incr 415 (error) ERR increment or decrement would overflow
2、案例二
- 業務場景:
- 使用微信的過程中,當微信接收訊息後,會預設將最近接收的訊息置頂,當多個好友及關注的訂閱號同時傳送訊息時,該排序會不停的進行交替。同時還可以將重要的會話設定為置頂。一旦使用者離線後,再次開啟微信時,訊息該按照什麼樣的順序顯示?
- 業務分析:
- 解決方案:
- 依賴list的資料具有順序的特徵對訊息進行管理,將list結構作為棧使用
- 對置頂與普通會話分別建立獨立的list分別管理
- 當某個list中接收到使用者訊息後,將訊息傳送方的id從list的一側加入list(此處設定為左側)
- 多個相同id發出的訊息反覆入棧會出現問題,在入棧之前無論是否具有當前id對應的訊息,先刪除對應id
- 推送訊息時先推送置頂會話list,再推送普通會話list,推送完成的list清除所有list
- 訊息的數量,也就是微信使用者對話數量採用計數器的思想另行記錄,伴隨list操作同步更新
# 都在普通會話中
# 200使用者向100使用者傳送訊息,先刪除100列表中200使用者的訊息
127.0.0.1:6379> lrem 100 1 200
(integer) 0
# 將200使用者新增到100使用者列表中
127.0.0.1:6379> lpush 100 200
(integer) 1
# 300使用者向100使用者傳送訊息,先刪除100列表中300使用者的訊息
127.0.0.1:6379> lrem 100 1 300
(integer) 0
# 將300使用者新增到100使用者列表中
127.0.0.1:6379> lpush 100 300
(integer) 2
# 400使用者向100使用者傳送訊息,先刪除100列表中400使用者的訊息
127.0.0.1:6379> lrem 100 1 400
(integer) 0
# 將400使用者新增到100使用者列表中
127.0.0.1:6379> lpush 100 400
(integer) 3
# 200使用者向100使用者傳送訊息,先刪除100列表中200使用者的訊息
127.0.0.1:6379> lrem 100 1 200
(integer) 1
# 將200使用者新增到100使用者列表中
127.0.0.1:6379> lpush 100 200
(integer) 3
# 300使用者向100使用者傳送訊息,先刪除100列表中300使用者的訊息
127.0.0.1:6379> lrem 100 1 300
(integer) 1
# 將300使用者新增到100使用者列表中
127.0.0.1:6379> lpush 100 300
(integer) 3
# 檢視100列表的集合
127.0.0.1:6379> lrange 100 0 -1
1) "300"
2) "200"
3) "400"
- redis應用於基於時間順序的資料操作,而不關注具體時間
3、解決方案列表
- Tips 1:redis用於控制資料庫表主鍵id,為資料庫表主鍵提供生成策略,保障資料庫表的主鍵唯一性
- Tips 2:redis 控制資料的生命週期,通過資料是否失效控制業務行為,適用於所有具有時效性限定控制的操作
- Tips 3:redis應用於各種結構型和非結構型高熱度資料訪問加速
- Tips 4:redis 應用於購物車資料儲存設計
- Tips 5:redis 應用於搶購,限購類、限量發放優惠卷、啟用碼等業務的資料儲存設計
- Tips 6:redis 應用於具有操作先後順序的資料控制
- Tips 7:redis 應用於最新訊息展示
- Tips 8:redis 應用於隨機推薦類資訊檢索,例如熱點歌單推薦,熱點新聞推薦,熱賣旅遊線路,應用APP推薦,大V推薦等
- Tips 9:redis 應用於同類資訊的關聯搜尋,二度關聯搜尋,深度關聯搜尋
- Tips 10:redis 應用於同類型不重複資料的合併、取交集操作
- Tips 11:redis 應用於同類型資料的快速去重
- Tips 12:redis 應用於基於黑名單與白名單設定的服務控制
- Tips 13:redis 應用於計數器組合排序功能對應的排名
- Tips 14:redis 應用於定時任務執行順序管理或任務過期管理
- Tips 15:redis 應用於及時任務/訊息佇列執行管理
- Tips 16:redis 應用於按次結算的服務控制
- Tips 17:redis 應用於基於時間順序的資料操作,而不關注具體時間