dubbo mysql_dubbo系列(四) 凑一下热闹 使用dubbo redis mybatis mysql 实现商品秒杀功能...
jmeter實現(xiàn)并發(fā)搶購
使用我的pc tomcat使用默認設置, 商品為5000個,未優(yōu)化測試結(jié)果最高qps1400
開了兩個dubbo服務
秒殺前準備數(shù)據(jù)
創(chuàng)建list存到redis里, 如果一個商品有5000件,list的大小為5000
redis數(shù)據(jù)
這里用到了redis批量插入數(shù)據(jù),具體實現(xiàn)看看上面的代碼吧, 用到了setnx實現(xiàn)鎖功能,使用到redis 數(shù)據(jù)格式有string,list,map三種
搶購邏輯實現(xiàn)
待優(yōu)化的內(nèi)容
Object value =redisTemplate.opsForList().leftPop(goodQueueCache.getCacheKey());if (value != null) {//這里待優(yōu)化
}
優(yōu)化的代碼如下
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);
}
優(yōu)化后使用我的pc tomcat使用默認設置, 商品為40,000個,測試結(jié)果qps最高到1700
看一下數(shù)據(jù)庫,沒有超賣
庫存數(shù)沒有更新,這個是沒有實現(xiàn)了,不是bug哦, 可以新開一個線程每幾秒統(tǒng)計一下redis list的大小,然后更新到數(shù)據(jù)庫中
總結(jié)
以上是生活随笔為你收集整理的dubbo mysql_dubbo系列(四) 凑一下热闹 使用dubbo redis mybatis mysql 实现商品秒杀功能...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python类的继承super方法_Py
- 下一篇: mysql pdo 预处理_哪些方法用于