dubbo mysql_dubbo系列(四) 凑一下热闹 使用dubbo redis mybatis mysql 实现商品秒杀功能...
jmeter實現并發搶購
使用我的pc tomcat使用默認設置, 商品為5000個,未優化測試結果最高qps1400
開了兩個dubbo服務
秒殺前準備數據
創建list存到redis里, 如果一個商品有5000件,list的大小為5000
redis數據
這里用到了redis批量插入數據,具體實現看看上面的代碼吧, 用到了setnx實現鎖功能,使用到redis 數據格式有string,list,map三種
搶購邏輯實現
待優化的內容
Object value =redisTemplate.opsForList().leftPop(goodQueueCache.getCacheKey());if (value != null) {//這里待優化
}
優化的代碼如下
public class SaveMiaoShaOrderRunner implementsRunnable {private Logger logger = LoggerFactory.getLogger(SaveMiaoShaOrderRunner.class);private ConcurrentLinkedQueuemiaoshaOrdersQueue;privateMiaoshaService miaoshaService;public SaveMiaoShaOrderRunner(ConcurrentLinkedQueuemiaoshaOrdersQueue, MiaoshaService miaoshaService) {this.miaoshaOrdersQueue =miaoshaOrdersQueue;this.miaoshaService =miaoshaService;
}
@Overridepublic voidrun() {
logger.info("開始保存訂單...");
List miaoshaOrders = new ArrayList<>();int size = 0;
MiaoshaOrder order;for (int i = 0; i < 1000; i++) {//獲取并移除此隊列的頭,如果此隊列為空,則返回 null。
order =miaoshaOrdersQueue.poll();if (order == null) {break;
}else{
miaoshaOrders.add(order);
size++;
}
}if (size > 0) {
miaoshaService.batchSave(miaoshaOrders);
miaoshaOrders.clear();
}
}
}
MiaoshaServiceImpl增加以下代碼
@PostConstructpublic voidinitSaveDbThread() {
MyExecutors.SINGLE_SCHEDULED_EXECUTOR_SERVICE.scheduleWithFixedDelay(// new SaveMiaoShaOrderRunner(miaoshaOrdersQueue, this),2, 2, TimeUnit.SECONDS);
}
優化后使用我的pc tomcat使用默認設置, 商品為40,000個,測試結果qps最高到1700
看一下數據庫,沒有超賣
庫存數沒有更新,這個是沒有實現了,不是bug哦, 可以新開一個線程每幾秒統計一下redis list的大小,然后更新到數據庫中
總結
以上是生活随笔為你收集整理的dubbo mysql_dubbo系列(四) 凑一下热闹 使用dubbo redis mybatis mysql 实现商品秒杀功能...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python类的继承super方法_Py
- 下一篇: mysql pdo 预处理_哪些方法用于