redis分布式锁(实践篇)

166 阅读1分钟
引依赖
<!--redission相关-->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.11.5</version>
</dependency>
改配置
spring.redis.host=localhost
spring.redis.port=6379
配置类
@Configuration
public class RedissonConfig {

    @Bean
    public RedissonClient getRedisson(){
        //单机模式,依次设置redis地址和密码
        Config config = new Config();
        config.useSingleServer().setAddress("redis://localhost:6379");
        return Redisson.create(config);
    }
}
Controller

使用jmeter进行并发访问

@RestController
@Slf4j
public class RedisController {

    @Resource
    private RedissonClient redisson;

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @GetMapping("/lock/test")
    public void test() {
        String lockKey = "local_key";
        RLock lock = redisson.getLock(lockKey);
        try {
            lock.lock();
            Integer stock = (Integer) redisTemplate.opsForValue().get("product"); //校验是否还有库存
            if (stock > 0) {
                int realStock = stock - 1;
                redisTemplate.opsForValue().set("product", realStock); //更新库存
                log.info("{}抢到锁,扣减成功,剩余库存:{}", Thread.currentThread().getName(), realStock);
            } else {
                log.warn("{}抢到锁,扣减失败,库存不足!", Thread.currentThread().getName());
            }
        } catch (Exception e) {
            log.warn("系统错误,稍后重试");
        } finally {
            lock.unlock(); //删除锁
        }
    }
}