redis分布式锁

文章介绍了如何利用Redisson库在Java中实现分布式锁,确保并发访问资源时的原子性。通过配置Redis连接,创建RedissonClient,并在Controller中获取和释放锁来控制对商品库存的修改,同时提到了JMeter进行并发测试以及Redisson的自动续期功能。
摘要由CSDN通过智能技术生成
概念

270cecab5586450e85e9f1ce6aacdd62.png

Redis实现分布式锁的基本流程如下:

  • 加锁时设置锁唯一标识和过期时间

  • 操作共享资源

  • 释放锁:先GET判断锁是否归属自己,再DEL释放锁

497f506d8ca247bd803f3655d8cc9bb0.png

Redisson这个jar包把上述都做好了,能够保证原子性,它会开启一个守护线程定期检测任务是否完成,没有完成则给锁续期

引依赖

java <!--redission相关--> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.11.5</version> </dependency>

改配置

properties spring.redis.host=localhost spring.redis.port=6379

配置类

```java @Configuration public class RedissonConfig {

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

} ```

Controller

使用jmeter进行并发访问

```java @RestController @Slf4j public class RedisController {

@Resource
private RedissonClient redisson;

@Resource
private RedisTemplate<Object, Object> redisTemplate;

@GetMapping("/lock/test")
public void test() {
    String lockKey = "local_key";
    RLock lock = redisson.getLock(lockKey);       //获取锁
    try {
        synchronized (this) {
            lock.lock();    //上锁
            log.info("锁已开启");

            if (redisTemplate.opsForValue().get("product") == null) {
                log.error("商品不存在!");
            } else {
                //获取当前库存
                Integer stock = (Integer) redisTemplate.opsForValue().get("product");
                if (stock > 0) {
                    int realStock = stock - 1;
                    //更新库存
                    redisTemplate.opsForValue().set("product", realStock);
                    log.info("库存当前为:" + realStock);
                } else {
                    log.warn("扣减失败,库存不足!");
                }
            }
        }
    } catch (Exception e) {
        log.warn("系统错误,稍后重试");
    } finally {
        lock.unlock();    //删除锁
        log.info("锁已关闭");
    }
}

} ```

相关文章

https://blog.csdn.net/weixin_44009447/article/details/127891675

https://blog.csdn.net/tang_seven/article/details/126769580

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值