使用redisson 分布式锁 会导致 线程并行执行,在秒杀系统中导致并发下降,此时可以对库存进行分段 如 stockCount = 40 分成四十段,分段的段数和总库存 相关, 用户请求时,随机分配一个段,若获取失败再重试几次,以保证尽可能购买到,详细代码如下
book 不使用锁 本机测试 20000/分钟
bookWithLock:使用分布式锁 但是没有分段 测试结果 1000/分钟
bookWithLock2 使用分布式锁 分段20时测试结果12000/分钟 分段40时测试结果 16000/分钟
@Slf4j
@Service
public class OrderServiceImpl implements OrderService {
private static String key = "count";
private static int stockCount = 40;
@Autowired
private RedissonClient redissonClient;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public String book() {
return this.decrementOrder();
}
@Override
public String bookWithLock() {
RLock lock = this.redissonClient.getLock("lock");
Boolean result = false;
try {
result = lock.tryLock(10, TimeUnit.SECONDS);
if (result) {