婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 使用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(取)取數據

@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解決發多張券的并發問題的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美国产禁国产网站cc| 国产免费成人在线视频| 国产清纯在线一区二区www| 久久精品国产第一区二区三区| 欧美日韩亚洲综合在线| 亚洲影视在线播放| 欧美电影影音先锋| 麻豆中文一区二区| 国产日韩精品一区二区三区| 成人午夜免费电影| 一区二区三区中文字幕在线观看| 在线看一区二区| 免费观看在线色综合| 久久婷婷久久一区二区三区| 97se亚洲国产综合自在线不卡| 国产精品久久久久aaaa樱花| 色偷偷成人一区二区三区91 | 日韩高清电影一区| 欧美videossexotv100| 高清久久久久久| 亚洲一线二线三线视频| 久久亚洲一区二区三区明星换脸| www.亚洲精品| 亚洲成人在线网站| 久久综合九色欧美综合狠狠| av中文字幕一区| 日韩av网站免费在线| 中文字幕免费观看一区| 欧美日韩国产色站一区二区三区| 精品一区二区久久久| 亚洲免费资源在线播放| 欧美一区二区精品久久911| 成人激情动漫在线观看| 日韩国产欧美在线播放| 国产精品久久久久久久久晋中 | 中文字幕的久久| 91精品国产麻豆| 97成人超碰视| 久久97超碰国产精品超碰| 一区二区三区在线免费视频| 久久亚区不卡日本| 欧美日韩二区三区| 91麻豆swag| 国产不卡视频在线观看| 精品影视av免费| 日韩精品一区第一页| 亚洲免费av高清| 中文字幕高清一区| 久久蜜桃一区二区| 日韩欧美一级特黄在线播放| 欧美日韩成人综合在线一区二区| 国产.欧美.日韩| 精品一区二区三区视频| 亚洲一二三四在线| 亚洲免费观看高清在线观看| 亚洲国产精品成人综合| 国产婷婷精品av在线| 日韩一区二区影院| 欧美美女一区二区三区| 欧美日韩免费一区二区三区视频| 成人三级伦理片| 丁香亚洲综合激情啪啪综合| 国产一区二区导航在线播放| 韩国一区二区在线观看| 亚洲va中文字幕| 亚洲国产日韩a在线播放| 亚洲精选视频在线| 亚洲高清免费观看| 日本亚洲三级在线| 亚洲v中文字幕| 日本亚洲电影天堂| 日本欧美一区二区在线观看| 久久精品国产亚洲a| 国产成人三级在线观看| 国产美女视频91| 97se亚洲国产综合自在线观| 欧美视频三区在线播放| 欧美在线观看视频一区二区三区| 9191久久久久久久久久久| 久久亚洲精华国产精华液| 国产精品理论在线观看| 亚洲一区二区精品久久av| 三级久久三级久久| 秋霞午夜鲁丝一区二区老狼| 国产一区二区三区在线观看精品| 成人精品国产免费网站| 色国产精品一区在线观看| 777奇米成人网| 中文字幕一区三区| 午夜电影一区二区三区| 国产传媒欧美日韩成人| 欧美一区二区三区色| 欧美一区二区三区电影| 久久久精品国产99久久精品芒果| 国产精品免费久久| 香蕉久久一区二区不卡无毒影院| 国产一区二区三区久久久| 在线一区二区视频| 久久久99精品免费观看| 亚洲mv在线观看| 国产高清精品网站| 欧美三级电影在线看| 久久丝袜美腿综合| 视频一区视频二区在线观看| av午夜精品一区二区三区| 欧美电视剧免费全集观看| 亚洲精品午夜久久久| 国产不卡视频在线观看| 日韩精品专区在线| 午夜天堂影视香蕉久久| 成人午夜视频在线| 国产亚洲成av人在线观看导航| 日韩专区一卡二卡| 91女厕偷拍女厕偷拍高清| 2023国产精品视频| 奇米精品一区二区三区四区| 欧美亚洲国产一区二区三区va| 国产精品毛片无遮挡高清| 国产综合久久久久久久久久久久| 欧美日韩免费一区二区三区| 最好看的中文字幕久久| 丁香婷婷深情五月亚洲| 精品国产污污免费网站入口 | 风间由美一区二区三区在线观看| 在线成人小视频| 亚洲韩国一区二区三区| 99久久久国产精品免费蜜臀| 精品国内片67194| 日本不卡一二三| 欧美一区二区黄| 视频在线观看一区| 91精品欧美一区二区三区综合在| 亚洲大片免费看| 欧美日韩高清一区| 日本一道高清亚洲日美韩| 欧美二区乱c少妇| 久久疯狂做爰流白浆xx| www激情久久| 国产成人免费9x9x人网站视频| 久久久久99精品国产片| 国产精品一二二区| 久久精品一区二区三区不卡牛牛| 国产乱子轮精品视频| 国产精品欧美精品| 91在线小视频| 一区二区三区日韩欧美精品| 欧美日韩在线观看一区二区| 视频一区二区三区在线| 精品少妇一区二区三区日产乱码| 免费不卡在线视频| 久久久国际精品| 91视视频在线观看入口直接观看www | 欧美性大战xxxxx久久久| 亚洲夂夂婷婷色拍ww47| 4438x亚洲最大成人网| 狠狠色丁香婷婷综合| 中文字幕不卡在线观看| 欧美最猛性xxxxx直播| 午夜日韩在线电影| 国产午夜精品美女毛片视频| 99久久99久久精品国产片果冻| 亚洲电影一级黄| 国产欧美日韩精品一区| 欧美午夜片在线观看| 国精品**一区二区三区在线蜜桃| 亚洲日本在线看| 精品奇米国产一区二区三区| 成人免费黄色在线| 午夜精品久久久久久久99樱桃| 国产拍揄自揄精品视频麻豆| 欧美日韩精品高清| 成人av在线资源| 久久机这里只有精品| 亚洲一区在线视频观看| 久久免费偷拍视频| 91精品国产一区二区| 99久久99久久精品免费观看| 九九九精品视频| 亚洲va欧美va国产va天堂影院| 国产精品午夜春色av| 日韩午夜在线观看| 色综合一个色综合亚洲| 国内精品自线一区二区三区视频| 亚洲综合在线第一页| 精品粉嫩aⅴ一区二区三区四区| 在线免费观看成人短视频| 丁香亚洲综合激情啪啪综合| 日韩精品一级二级| 亚洲欧美另类小说视频| 久久久亚洲欧洲日产国码αv| 欧美图片一区二区三区| www.在线欧美| 国产成人综合亚洲网站| 男女视频一区二区| 亚洲成人一区在线| 亚洲国产精品综合小说图片区| 亚洲三级小视频| 亚洲色图一区二区三区| 国产欧美精品一区二区三区四区| 日韩免费观看高清完整版|