成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

看我如何把Redis使用優化到極致

存儲 存儲軟件 Redis
我們在使用hashtag特性時,一定要注意,不能把key的離散性變得非常差。

[[315513]]

 我們有個這樣的需求:每天每一個搶購商品只能買一次,并且全場搶購商品總購買次數不允許超過5次。那么,整個商品限購的流程大概如下圖所示:

那么,在每次購買成功商品成功后,發送的MQ大概是這樣的(假設當前這筆訂單有兩件搶購商品):

這條消息表示860000000000001這個用戶在1581001673012這個時間點(北京時間為2020/02/06 23:07:53)在A045這個商戶分別購買了商品ID為599055114591和599055114592兩樣商品。

那么,當消費這條信息后,更新頻控的幾條關鍵Redis命令如下(上面的需求不是重點,優化下面5條命令才是本文的重點):

  1. 命令1:hset mall:sale:freq:ctrl:860000000000001 599055114591 1(hash結構,field表示購買的商品ID,value表示購買次數)   
     
  2. 命令2:hset mall:sale:freq:ctrl:860000000000001 599055114592 2        
  3.  
  4. 命令3:expire mall:sale:freq:ctrl:860000000000001 3127(設置過期時間)          
  5.  
  6. 命令4:set mall:total:freq:ctrl:860000000000001 3        
  7.  
  8. 命令5:expire mall:total:freq:ctrl:860000000000001 3127(設置過期時間)  

我們首先了解一下執行一條Redis命令耗時由哪幾部分組成:發送命令網絡傳輸時間,命令在Redis服務端隊列中等待的時間,命令執行的時間(Redis中的slowlog只是檢測這一步驟的時間),結果返回的Redis客戶端的時間。如下圖所示:

上面的業務總計涉及5條Redis命令,每條命令都需要經過這些步驟,可想而知性能真的弱爆了(可能整個執行過程還不需要10ms,但還是弱爆了)。

  • 第1次優化

第一次優化非常簡單,稍微有點經驗就能看出來,利用hmset命令將兩條hmset命令合二為一,優化后的Redis命令如下: 

  1. hmset mall:sale:freq:ctrl:860000000000001 599055114591 1 599055114592 2    
  2.  
  3. expire mall:sale:freq:ctrl:860000000000001 3127        
  4.  
  5. set mall:total:freq:ctrl:860000000000001 3     
  6.  
  7. expire mall:total:freq:ctrl:860000000000001 3127 
  • 第2次優化

第二次優化將set和expire命令合二為一,這個一般對Redis有點了解的也知道如何優化:

  1. hmset mall:sale:freq:ctrl:860000000000001 599055114591 1 599055114592 2         
  2.  
  3. expire mall:sale:freq:ctrl:860000000000001 3127         
  4.  
  5. setex mall:total:freq:ctrl:860000000000001 3127 3       
  • 第3次優化

第3次優化需要借助pipeline,簡直就是Redis優化的一大殺器。不過,需要注意的是在RedisCluster中使用pipeline時必須滿足pipeline打包的所有命令key在RedisCluster的同一個slot上。如果打包命令的key不在同一個slot上,就會報錯。所以我們需要分兩批打包:

  1. -- 這兩條命令的key都是一樣的,肯定在同一個slot上        
  2.  
  3. pipeline(        
  4.  
  5. hmset mall:sale:freq:ctrl:860000000000001 599055114591 1 599055114592 2         
  6.  
  7. expire mall:sale:freq:ctrl:860000000000001 3127        
  8.  
  9. )         
  10.  
  11. -- mall:total:freq:ctrl:860000000000001和mall:sale:freq:ctrl:860000000000001兩條命令不在同一個slot上,所以需要單獨執行下面這條命令   
  12.  
  13. setex mall:total:freq:ctrl:860000000000001 3127 3  

經過第3次的優化后,這些命令還是需要2次網絡交互。較勁的我還是不甘心,想要將其優化到只需要一次網絡交互即可,有沒有辦法?當然有!

  • 第4次優化

這次優化利用了一個高級特性:hashtag。是啥子意思呢?我們知道,RedisCluster總計有16*1024=16384個slot。那么執行一條Redis命令時,其key對應的是哪個slot呢?是利用這樣一個計算公式得到的:slot = CRC16(key)%16384,示意圖如下:

也就是說,默認情況下,key在哪個slot上,與key有關。那么,我們能否只讓key在哪個slot上與部分key有關呢?當然可以,這就是hashtag特性。用法非常簡單,假設一個key是mall:sale:freq:ctrl:860000000000001,我們只需要用{}將key中我們需要的那部分包括起來即可。例如,我們只想讓其根據用戶IMEI計算即可,那么key是這樣的:mall:sale:freq:ctrl:{860000000000001}。只要key中有{860000000000001}這一部分,就一定落在同一個slot上。

所以,第四次優化以后的命令執行如下所示:

  1. pipeline(        
  2.  
  3. hmset mall:sale:freq:ctrl:${860000000000001} 599055114591 1 599055114592 2    
  4.  
  5. expire mall:sale:freq:ctrl:${860000000000001} 3127         
  6.  
  7. setex mall:total:freq:ctrl:${860000000000001} 3127 3         
  8.  
  9. )       

優化后,5條Redis命令壓縮到3條Redis命令,并且3條Redis命令只需要發送一次,并且結果也一次就能全部返回。簡直完美!!

  • 注意事項

我們在使用hashtag特性時,一定要注意,不能把key的離散性變得非常差。以本文為例,沒有利用hashtag特性之前,key是這樣的:mall:sale:freq:ctrl:860000000000001,很明顯這種key由于與用戶相關,所以離散性非常好。而使用hashtag以后,key是這樣的:mall:sale:freq:ctrl:{860000000000001},這種key還是與用戶相關,所以離散性依然非常好。我們千萬不要這樣來使用hashtag特性,例如將key設置為:mall:{sale:freq:ctrl}:860000000000001。這樣的話,無論有多少個用戶多少個key,其{}中的內容完全一樣都是sale:freq:ctrl,也就是說,所有的key都會落在同一個slot上,導致整個Redis集群出現嚴重的傾斜問題。

 

責任編輯:武曉燕 來源: 阿飛的博客
相關推薦

2021-02-05 15:35:21

Redis數據庫命令

2020-11-09 09:58:49

架構雙十一開發

2019-07-25 13:22:43

AndroidAPK文件優化

2017-07-20 16:21:52

UICountDownTidelay

2021-09-28 10:30:47

Morphling云原生

2018-01-09 09:06:14

機械硬盤數據

2023-01-03 09:33:56

2017-09-30 16:18:00

HTML5代碼對象

2022-08-14 09:00:00

JWT 令牌憑證微服務

2020-10-29 07:17:37

雪崩系統服務

2025-04-18 07:43:41

2019-12-09 14:13:41

awkPython編程語言

2021-06-27 17:40:49

安全DevOpsDevSecOps

2024-03-12 09:47:10

Redis數據庫

2025-03-06 14:00:00

C#性能頁面

2011-11-21 10:58:01

Java遞歸分形幾何

2024-04-23 08:00:00

2023-12-15 17:09:28

.NET8Primitives性能

2022-03-11 10:23:02

React性能優化

2013-02-21 14:08:18

TizenTizen image
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久久久久红码专区 | 在线欧美视频 | 黄网站在线播放 | 一级a爱片久久毛片 | 精品一区国产 | 中文字幕在线电影观看 | 国产乱码精品一区二区三区五月婷 | 久久久久免费 | 丝袜 亚洲 另类 欧美 综合 | 免费簧片视频 | 在线观看亚洲精品 | 亚洲欧美成人 | 免费a大片 | 精品一区二区视频 | 欧美4p| 成人国产综合 | 国产成人福利视频 | 久久激情视频 | 国产免费一级片 | 日韩成人在线观看 | 在线观看三级av | 欧美激情在线精品一区二区三区 | 日韩精品区| 中文在线播放 | 天天射色综合 | 久久中文字幕一区 | 亚洲毛片在线观看 | 久久久久国产精品一区 | 欧美一级二级三级 | 日韩高清三区 | 综合色播| 激情毛片 | 91精品国产综合久久婷婷香蕉 | 亚洲国产高清高潮精品美女 | 日本不卡一区二区三区在线观看 | 日韩一级免费电影 | 99reav | 亚洲va欧美va人人爽午夜 | 国产线视频精品免费观看视频 | 中文字幕第49页 | 午夜av电影院 |