使用redisson简单实现分布式锁

什么是分布式锁

        在分布式项目中, 常常伴随着多线程同时操作一个数据的情况,比较常见的就是淘宝抢单的情况,多个人抢一件商品时,正常情况下只有一个人才能获得商品,但是在分布式项目中,会存在多个线程在多个服务下,同时操作一个数据的情况,可能有人要问了,我们加一个Java锁不行吗?在做单体项目的时候我也是这么 想的,但是java锁只能锁同一个服务的数据,但是分布式项目中往往存在多个服务,我们的Java锁,是无法完全锁住的,这个时候我们就可以考虑使用分布式锁。

分布式锁的种类

  • 基于数据库实现的分布式锁
  • 基于redis实现的分布式锁
  • 基于zookeeper实现的分布式锁
  • 使用redisson实现分布式锁

分布式锁的实现方案

        分布式锁可以简单的理解为,在分布式项目中实现的数据锁,既然我们不能使用项目中的锁来得到线程安全,那么我们需要借助外界存储来实现,例如我们可以使用redis作为中间件,redis本身就提供分布式锁,我们可以通过lua脚本控制来对redis加锁,间接实现了线程安全,可能有朋友就要问了,为什么要使用lua脚本,不能直接用代码控制呢?使用redis的话,大部分公司应该都是多节点的,少部分是单节点的,如果你是单节点使用代码控制问题也不大,但是如果是多节点的,使用lua脚本控制就容易的多,因为lua脚本执行的命令是具有原子性的。

使用redisson简单实现分布式锁

        由于公司今天紧急添加分布式锁,所以使用了已经比较成型的分布式锁框架redisson,他的内部也是redis+lua脚本实现的,内部拥有很多分布式场景,可以轻松实现分布式锁,我们先来感受一下,redisson的强大。

第一步:选择心仪的jar包

通过我们常用的maven仓库来筛选想要的redisson版本。链接如下:
https://mvnrepository.com/artifact/org.redisson/redisson

第二步:通过maven引入jar包

        
        <dependency>
            <groupId>org.redissongroupId>
            <artifactId>redissonartifactId>
            <version>3.12.0version>
        dependency>

第三步:启动redis

使用redisson简单实现分布式锁_第1张图片

第四步:配置redis连接

@SpringBootApplication
public class DemoApplication {
     

    public static void main(String[] args) {
     
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public Redisson redisson() {
     
        Config config = new Config();
        SingleServerConfig singleServerConfig = config.useSingleServer();
        singleServerConfig.setAddress("redis://127.0.0.1:6379").setDatabase(15);
        singleServerConfig.setPassword("123456");
        return (Redisson) Redisson.create(config);
    }

}

第五步:获取分布式锁

  • 通过spring注入获取redisson对象
    @Autowired
    private Redisson redisson;

第六步:加锁解锁

    public void demo() {
     
        String lockKey = "lock";
        RLock lock = redisson.getLock(lockKey);
        try {
     
            lock.lock();
            System.out.println("抢单");
        } finally {
     
            lock.unlock();
        }
    }

总结

本次与分布式锁的相遇非常的突然,由于需求变化,突然需要使用分布式锁来进行控制,对于没有概念的我来说是一次挑战,查询了很多资料后,为了安全起见,使用了成熟的redisson来做分布式锁,后续还会分析redisson源码,手动实现一个分布式锁,关于分布式锁的知识点,未来会持续更新!

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