1、锁住对象,并且设置一个过期时间(业务逻辑操作时间一定小于超时时间)
原先能想到的就是这样的一个方案然后代码实现如下:
public static boolean lock(String key, Long expireTime) {
final long expires = Objects.nonNull(expireTime) ? expireTime : 10L;
return (Boolean) redisTemplate.execute((RedisCallback) connection -> {
byte[] locks = key.getBytes();
boolean acquire = connection.setNX(locks, key.getBytes());
// 如果设置过期时间为空就删除key
if (acquire && !connection.expire(locks, expires)) {
connection.del(locks);
acquire = false;
}
return acquire;
});
}
目前的案例里面分布式锁主要锁的是新增商品名称,业务就是新增商品而已
@PostMapping("addGoods")
@ApiOperation(value = "新增商品", notes = "新增商品")
public Result<Goods> addGoods(@RequestBody Goods goods) {
final String key = "seckill-shopping:" + goods.getName();
boolean lock = RedisUtil.lock(key, 10L);
if (lock) {
log.info("\n{} -->获取锁成功", Thread.currentThread().getName());
goods = this.goodsService.insert(goods);
RedisUtil.