coding
Smail_的gravatar頭像
Smail_2019-08-12 17:06:27
Redis——放開那把鎖,讓我來

需求場景:廣告平臺——廣告分發模塊,必須控制廣告的分發量,同一廣告位可以分發多個廣告。

實現一:

系統啟動時讀取有效的廣告物料,按照(KEY:APP_ADVERSION_ADPOSITION,VALUE:LIST<MATERIAL>),(KEY:METERIAL_ID,VALUE:REMAIN_NUM)整理好,存入redis。

讀取KEY:APP_ADVERSION_ADPOSITION不加鎖

for循環LIST<MATERIAL>:檢測REMAIN_NUM,將REMAIN_NUM大于0的廣告物料作為可用物料放入待選舉隊列,帶權重隨機選舉物料,物料分發之前的操作:

ACTION_0 -> redis SETNX加鎖,再讀取一次被選中物料的剩余次數

ACTION_1 -> 大于0,減一,將新的剩余次數寫回redis,解鎖,返回物料給客戶端展示;

ACTION_2 -> 將被選中的物料從待選舉隊列中移除,重新選舉,GOTO ACTION_0

一對N(多個物料)壓測結果:

Redis——放開那把鎖,讓我來

嗯,這還勉強看得。

然而可用廣告物料只剩下一個時候慘案來了,tps降到了700左右,什么垃圾解決方案?!

這時候技術終極老大提出了要求:想辦法不加鎖!!

 

呃——

瞇眼了半天——

忽然,redis不是有個自增的incr command么

 

實現二:

基礎操作同實現一一致。

物料分發之前的操作調整為如下:

ACTION_0 -> this.redisTemplate.opsForHash().increment(ConstantUtil.SYSTEM_MATERIAL_REMAIN_KEY, String.valueOf(adConfigMaterialVO.getAdConfigMaterialId()), -1);

ACTION_1 -> 大于0,返回物料給客戶端展示;

ACTION_2 -> 將被選中的物料從待選舉隊列中移除,重新選舉,GOTO ACTION_0

壓測:

Redis——放開那把鎖,讓我來

10倍性能提升!

 

可用場景:秒殺、搶號、截流 and 一切你所知的高并發需要限量的場景!


打賞

已有1人打賞

最代碼官方的gravatar頭像

分享到:

最近瀏覽
a694110193 LV210月14日
星星星星
xxljxgz LV2110月14日
太陽月亮星星
wangshaoqiu LV310月14日
星星星星星星
Bsword LV210月14日
星星星星
AaronFo10月11日
暫無貢獻等級
gxhaha LV1110月11日
月亮月亮星星星星星星
zlh184385073410月9日
暫無貢獻等級
hongxinmiao LV610月3日
月亮星星星星
wrf00 LV39月28日
星星星星星星
limynl LV29月28日
星星星星
最代碼廣告位
頂部客服微信二維碼底部
>掃描二維碼關注最代碼為好友掃描二維碼關注最代碼為好友
天津时时开奖结果