欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 使用lua+redis解決發多張券的并發問題

使用lua+redis解決發多張券的并發問題

熱門標簽:b2b外呼系統 高碑店市地圖標注app 南京手機外呼系統廠家 一個地圖標注多少錢 400電話辦理的口碑 臺灣電銷 四川穩定外呼系統軟件 廊坊外呼系統在哪買 地圖標注工廠入駐

前言

公司有一個發券的接口有并發安全問題,下面列出這個問題和解決這個問題的方式。

業務描述

這個接口的作用是給會員發多張券碼。涉及到4張主體,分別是:用戶,券,券碼,用戶領取記錄。
下面是改造前的偽代碼。
主要是因為查出券碼那行存在并發安全問題,多個線程拿到同幾個券碼。以下都是基于如何讓取券碼變成原子的去展開。

public boolean sendCoupons(Long userId, Long couponId) {
 // 一堆校驗
 // ...
 // 查出券碼
 ListCouponCode> couponCodes = couponCodeService.findByCouponId(couponId, num);
 // batchUpdateStatus是一個被@Transactional(propagation = Propagation.REQUIRES_NEW)修飾的方法
 // 批量更新為已被領取狀態
 couponCodeService.batchUpdateStatus(couponCods);
 // 發券
 // 發權益
 // 新增用戶券碼領取記錄
}

改造過程

因為券碼是多張,想用lua+redis的list結構去做彈出。為什么用這種方案是因為for update直接被否了。

這是寫的lua腳本。。

local result = {}
for i=1,ARGV[1],1 do
 result[i] = redis.call("lpop", KEYS[1])
end
return table.contact(result , "|")

這是寫的執行lua腳本的client。。其實主要的解決方法就是在redis的list里rpush(存),lpop(?。┤祿?/p>

@Slf4j
@Component
public class CouponCodeRedisQueueClient implements InitializingBean {

 /**
  * redis lua腳本文件路徑
  */
 public static final String POP_COUPON_CODE_LUA_PATH = "lua/pop-coupon-code.lua";
 public static final String SEPARATOR = "|";

 private static final String COUPON_CODE_KEY_PATTERN = "PROMOTION:COUPON_CODE_{0}";
 private String LUA_COUPON_CODE_SCRIPT;

 private String LUA_COUPON_CODE_SCRIPT_SHA;

 @Autowired
 private JedisTemplate jedisTemplate;

 @Override
 public void afterPropertiesSet() throws Exception {

  LUA_COUPON_CODE_SCRIPT = Resources.toString(Resources.getResource(POP_COUPON_CODE_LUA_PATH), Charsets.UTF_8);
  if (StringUtils.isNotBlank(LUA_COUPON_CODE_SCRIPT)) {

   LUA_COUPON_CODE_SCRIPT_SHA = jedisTemplate.execute(jedis -> {
    return jedis.scriptLoad(LUA_COUPON_CODE_SCRIPT);
   });
   log.info("redis lock script sha:{}", LUA_COUPON_CODE_SCRIPT_SHA);
  }

 }

 /**
  * 獲取Code
  *
  * @param activityId
  * @param num
  * @return
  */
 public ListString> popCouponCode(Long activityId, String num , int retryNum) {
  if(retryNum == 0){
   log.error("reload lua script error , try limit times ,activityId:{}", activityId);
   return Collections.emptyList();
  }
  ListString> keys = Lists.newArrayList();
  String key = buildKey(String.valueOf(activityId));
  keys.add(key);
  ListString> args = Lists.newArrayList();
  args.add(num);

  try {
   Object result = jedisTemplate.execute(jedis -> {
    if (StringUtils.isNotBlank(LUA_COUPON_CODE_SCRIPT_SHA)) {
     return jedis.evalsha(LUA_COUPON_CODE_SCRIPT_SHA, keys, args);
    } else {
     return jedis.eval(LUA_COUPON_CODE_SCRIPT, keys, args);
    }
   });
   log.info("pop coupon code by lua script.result:{}", result);
   if (Objects.isNull(result)) {
    return Collections.emptyList();
   }
   return Splitter.on(SEPARATOR).splitToList(result.toString());
  } catch (JedisNoScriptException jnse) {
   log.error("no lua lock script found.try to reload it", jnse);
   reloadLuaScript();
   //加載后重新執行
   popCouponCode(activityId, num, --retryNum);
  } catch (Exception e) {
   log.error("failed to get a redis lock.key:{}", key, e);
  }
  return Collections.emptyList();
 }

 /**
  * 重新加載LUA腳本
  *
  * @throws Exception
  */
 public void reloadLuaScript() {
  synchronized (CouponCodeRedisQueueClient.class) {
   try {
    afterPropertiesSet();
   } catch (Exception e) {
    log.error("failed to reload redis lock lua script.retry load it.");
    reloadLuaScript();
   }
  }
 }

 /**
  * 構建Key
  *
  * @param activityId
  * @return
  */
 public String buildKey(String activityId) {
  return MessageFormat.format(COUPON_CODE_KEY_PATTERN, activityId);
 }

}

當然這種操作需要去提前把所有券的券碼丟到redis里去,這里我們也碰到了一些問題(券碼量比較大的情況下)。比如開始直接粗暴的用@PostConstruct去放入redis,導致項目啟動需要很久很久。。這里就不展開了,說一下我們嘗試的幾種方法

  • @PostConstruct注解
  • CommandLineRunner接口
  • redis的pipeline技術
  • 先保證每個卡券有一定量的券碼在redis,再用定時任務定時(根據業務量)去補

到此這篇關于使用lua+redis解決發多張券的并發問題的文章就介紹到這了,更多相關redis多張券的并發內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Redis實現分布式Session管理的機制詳解
  • kubernetes環境部署單節點redis數據庫的方法
  • 銀河麒麟V10sp1服務器系統安裝redis不能使用的快速解決辦法
  • 使用docker搭建redis主從的方法步驟
  • 基于redis setIfAbsent的使用說明

標簽:南寧 定州 伊春 拉薩 甘南 泰州 畢節 河源

巨人網絡通訊聲明:本文標題《使用lua+redis解決發多張券的并發問題》,本文關鍵詞  使用,lua+redis,解決,發,多張,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用lua+redis解決發多張券的并發問題》相關的同類信息!
  • 本頁收集關于使用lua+redis解決發多張券的并發問題的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    欧美精品一区二区三区蜜臀 | 9.1成人看片免费版| 91极品美女在线| 中文字幕日韩精品一区| 国产精品亚洲一区二区三区在线| 亚洲av无码一区二区三区人 | 在线视频中文字幕一区二区| 亚洲欧洲日本在线| 成人激情校园春色| 色综合天天综合在线视频| 欧美国产激情二区三区| 国产成人精品影院| 国精品无码一区二区三区| 最新成人av在线| 91丨porny丨蝌蚪视频| 在线欧美日韩国产| 亚洲综合偷拍欧美一区色| 国产xxx在线观看| 6080午夜不卡| 免费国产亚洲视频| 国产sm调教视频| 久久精品一区蜜桃臀影院| 国产经典欧美精品| 色婷婷av久久久久久久| 一区二区三区av电影 | 99综合电影在线视频| 在线精品国精品国产尤物884a| 长河落日免费高清观看| 久久久久久久久久久久久久久99| 国产传媒日韩欧美成人| 色哟哟一区二区三区| 一区二区三区精品久久久| 成年女人免费视频| 精品99999| 粉嫩欧美一区二区三区高清影视 | 久久精品国产精品青草| 五月婷婷欧美激情| 亚洲欧洲精品天堂一级| 亚洲精品久久久久久| 91.成人天堂一区| 久久99久久久欧美国产| www深夜成人a√在线| 亚洲一区在线免费观看| 在哪里可以看毛片| 中文字幕不卡在线| 精品人妻二区中文字幕| 精品国产乱码久久久久久图片| 国产传媒欧美日韩成人| 欧美午夜精品久久久| 男女视频一区二区| 欧美丰满熟妇bbbbbb| 亚洲国产精品视频| 天天摸日日摸狠狠添| 亚洲精品ww久久久久久p站| 久久人妻少妇嫩草av无码专区| 久久久久久**毛片大全| 99re这里都是精品| 精品国产免费一区二区三区四区 | 欧美xxxx日本和非洲| 欧美第一区第二区| 波多野结衣亚洲一区| 91精品久久久久久久91蜜桃 | 九色porny丨国产精品| 69xx绿帽三人行| 日韩二区在线观看| 欧美日韩午夜视频| 日韩av一区二| 一本色道a无线码一区v| 麻豆一区二区三区| 欧洲国产伦久久久久久久| 久久成人免费日本黄色| 在线看国产一区| 国内精品不卡在线| 97se亚洲国产综合在线| 精品国产电影一区二区| 91麻豆成人久久精品二区三区| 日韩视频不卡中文| 99re热这里只有精品免费视频| 亚洲精品一区二区三区四区高清 | 久久精品一区二区三区av| 日本精品一二三| 国产精品网曝门| 国产伦精品一区二区三区妓女| 亚洲色欲色欲www| 免费看黄色三级| 五月天激情小说综合| 色综合久久久网| 激情综合色丁香一区二区| 欧美理论电影在线| gogogo免费视频观看亚洲一| 久久老女人爱爱| 国产国语老龄妇女a片| 1024成人网| 国产激情av在线| 日韩av一区二区在线影视| 欧美在线观看视频在线| 国产成人精品综合在线观看| 精品国产第一区二区三区观看体验| 丰满人妻一区二区三区大胸| 国产精品久久毛片a| 精品人妻中文无码av在线| 热久久一区二区| 4438成人网| 国产国语老龄妇女a片| 亚洲精品少妇30p| 色综合夜色一区| 成人免费毛片嘿嘿连载视频| 久久久精品中文字幕麻豆发布| 亚洲欧美色图视频| 日韩黄色免费电影| 91精品欧美福利在线观看 | 欧美高清在线视频| 欧洲美一区二区三区亚洲| 天天综合色天天| 欧美欧美午夜aⅴ在线观看| 91影院在线免费观看| 日韩一区日韩二区| 国产在线一卡二卡| 丁香一区二区三区| 国产欧美日韩在线看| 成人免费视频入口| 国产真实乱偷精品视频免| 精品成a人在线观看| 伊人网在线视频观看| 久久精品99国产精品| 精品国产一区二区国模嫣然| 亚洲电影第三页| 欧美三级日韩三级| www.黄色网| 午夜一区二区三区视频| 91精品国产麻豆国产自产在线 | 国产a级毛片一区| 国产欧美一区视频| 久久久久久视频| av不卡在线播放| 亚洲免费av在线| 欧美三级三级三级| 最新中文字幕日本| 亚洲不卡av一区二区三区| 91精品国产综合久久久久久久久久 | 丝袜美腿亚洲色图| 欧美成人一区二区三区在线观看| 国产美女永久免费无遮挡 | 欧美精品乱码久久久久久按摩| 日本成人在线免费| 午夜日韩在线观看| 欧美mv日韩mv国产| 在线观看日本黄色| 成人av在线看| 亚洲一区在线观看免费观看电影高清 | 日本黄色片在线播放| 麻豆精品一区二区av白丝在线| 久久亚洲综合色一区二区三区| 免费看的黄色录像| jlzzjlzz欧美大全| 午夜精品在线视频一区| 久久综合久色欧美综合狠狠| 国产真实乱在线更新| 潘金莲一级淫片aaaaa| 日韩一区欧美二区| 国产欧美视频一区二区| 色88888久久久久久影院按摩| 欧美图片自拍偷拍| 久久国产乱子精品免费女| 国产亚洲va综合人人澡精品| 色婷婷综合久久久久中文一区二区| av在线天堂网| 久久国产欧美日韩精品| 中文字幕一区二区在线观看| 欧美日本免费一区二区三区| 国产成人无码精品久久二区三| 成人激情文学综合网| 午夜精品视频一区| 久久综合五月天婷婷伊人| 日本韩国一区二区三区视频| 一边摸一边做爽的视频17国产| 欧美一级xxx| 永久免费观看片现看| 91丨九色porny丨蝌蚪| 美女在线视频一区| 中文字幕五月欧美| 日韩欧美中文字幕一区| 翔田千里88av中文字幕| 动漫av在线免费观看| 国产精品资源网站| 亚洲午夜久久久久中文字幕久| 久久综合九色综合欧美就去吻| 在线免费精品视频| 99精品欧美一区二区| 色哟哟网站在线观看| 国产美女av一区二区三区| 夜夜精品浪潮av一区二区三区| 久久精品亚洲精品国产欧美kt∨| 精品视频免费看| 日韩欧美在线视频播放| 欧美在线一级片| 成年人午夜久久久| 国内精品国产三级国产a久久 | 伊人性伊人情综合网| 久久蜜桃一区二区|