分布式开发必备技能-分布式锁-redisson实现

分布式开发必备技能-分布式锁-redisson实现

背景

​ 很久很久以前,我们的架构都是单体架构,项目也只会部署到一台服务器,基于JVM的 java 同步工具(如ReentrantLcok或synchronized)完全可以保证我们的业务的 原子性;随着微服务,分布式的出现,一个项目会部署到多台服务器(多个JVM),这时候多个服务之间的一系列操作要保证原子性,基于JVM的 java 同步工具(如ReentrantLcok或synchronized)就无能为力了,这时候需要一个针对整个项目(包含所有服务)的一个全局锁来控制业务,这时候分布式锁就应运而生。

分布式锁的 注意事项

  1. 加锁必须设置过期时间(避免死锁)
  2. 加锁操作必须和设置 过期时间 是原子性操作
    并发操作下 导致加过期时间失败问题(某个线程执行完枷锁操作 未加过期时间 报错终止)
  3. 过期时间 必须保证业务操作 结束
    开始子线程监控 未执行结束 续命(加过期时间)
  4. 必须保证 谁加锁 谁解锁
    防止高并发下 锁失效问题

基于 redisson 实现

@RestController
public class RedissonLock {

    // 分布式锁的 注意事项
    // 1. 加锁必须设置过期时间
    //  (避免死锁)
    // 2. 加锁操作必须和设置 过期时间 是原子性操作
    //  并发操作下 导致加过期时间失败问题(某个线程执行完枷锁操作 未加过期时间 报错终止)
    // 3. 过期时间 必须保证业务操作 结束
    //  开始子线程监控 未执行结束 续命(加过期时间)
    // 4. 必须保证 谁加锁 谁解锁
    //  防止高并发下 锁失效问题

    static int r = 0;

    @Autowired
    private RedissonClient redissonClient;

    @GetMapping("/testLock")
    public int testRedissonLock(@RequestParam boolean isLock) throws InterruptedException {
        RLock rLock = null;


        int result = 0;
        if(isLock){
            try{// 获取锁
                rLock = redissonClient.getLock("test1");

                // 上锁
                rLock.lock(12, TimeUnit.SECONDS);

                result = dobusiness();
            }
            finally {
                // 解锁
                rLock.unlock();
            }

        } else {
            result = dobusiness();
        }

        return result;

    }

   private int dobusiness() throws InterruptedException {
        ++r;
        TimeUnit.SECONDS.sleep(1);
        System.out.println(r);
        return r;

    }

源码地址:https://gitee.com/twelfthLunarMonthFourteen/pub_beauty/tree/hotfix/study-note/src/main/java/com/studynote/distribute/lock

个人水平有限,如有问题,请各路大神指教,虚心接纳

如果觉得有帮助,请点赞收藏,谢谢

你可能感兴趣的:(分布式,锁,redis)