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