秒杀系统性能优化
优化之前的准备
在吞吐量、延迟和内存这三点中选择我们业务的着重点。
例如本次这个系统,我认为应该更加注重吞吐量。
为什么更加注重吞吐量?
延迟:像我们大家平时去进行商品抢购的时候,应该都会觉得现在人太多了,卡一卡没什么问题(但是也不能太久,你给我直接来个10s,肯定给你差评),只关心的是最后我有没有抢到商品。所以我认为延迟这方面应该是其次,主要的是系统处理请求的数量。
内存占用:一般秒杀活动都会有时间限制,这段时间也不会占用太大的内存。我电脑16G也不用担心,如果真的内存很缺少,可以考虑考虑。
所以在保证TP99不超过1.5s(抢购)/0.2s(进入抢购界面)的情况下,最大提高的系统的吞吐量。
代码优化
将写入Redis缓存代码与数据库事务分开
防止网络抖动可能导致写缓存响应时间较慢,阻塞数据库事务。
原始代码:
/**
* 下订单、减库存事务(原始代码)
*/
@Transactional
public void seckillTransaction(SeckillDto seckillDto, GoodDto goodDto){
//添加订单操作......
//减库存操作......
//写入缓存,不用再调用数据库判断是否还能继续抢购
if (goodDto.getSurplusCount() <= 0){
redisTemplate.delete(seckillDto.getGoodId().toString());
redisTemplate.opsForValue().set(seckillDto.getGoodId().toString(), JSONObject.toJSONString(goodDto), 320, TimeUnit.SECONDS);
}