Jmeter
jmeter -n -t [jmx file] -l [results file] -e -o [path to web report folder]
悲观锁
@GetMapping("kill")
public String kill(Integer id){
synchronized(this){
int orderId = orderService.kill(id);
return "success";
}
}
乐观锁
update stock set sale=sale+1, version=version+1 where id=#{id} and version = #{version}
令牌桶
引入guava依赖
RateLimiter rateLimiter = RateLimiter.create(10);//1s放行10个请求
rateLimiter.tryAcquire(5, TimeUnit.SECONDS);//超时时间5s, 超时未拿到就放弃
Redis限时抢购
先在redis中做验证, 判断是否超时
stringRedisTemplate.hasKey("kill" + id);
md5签名(hash接口隐藏)来防止直接调用秒杀接口api
每个用户生成md5值, 秒杀时需要携带该md5值,否则无法秒杀
Redis统计用户秒杀次数, 限制秒杀频率
String limitKey = "Limit_" + userId;
String limitNum = stringRedisTemplate.opsForValue().get(limitKey);
stringRedisTemplate.opsForValue().set(limitKey, "0", 3600, TimeUnit.SECONDS);//1小时后重新计数
使用分布式锁实现秒杀
为了将锁控制在更细的粒度, 可以为每个商品都设置一个互斥锁. 分布式锁可以帮我们解决这个问题.
setnx key value //Set if Not eXist
expire key seconds //设置过期时间
del key