/redis-distributed-lock

集成spring boot框架的redis分布式锁,使用redis作为锁的资源存储,使用lua脚本加锁保证锁的原子性操作,基于redis服务端的原子性操作原因,加锁和设置锁超时对客户端来说可以一步到位,不会出现死锁或者抢锁的情况出现。

Primary LanguageJava

redis-distributed-lock

介绍

集成spring boot框架的redis分布式锁,使用redis作为锁的资源存储,使用lua脚本加锁保证锁的原子性操作

软件架构

软件架构说明

安装教程

1. 安装
    将工程下载到本地,导入IDE开发工具,进行install。
2. 添加依赖
    在需要使用该分布式锁工程的pom.xml文件中加入以下依赖:
    <dependency>
        <groupId>com.springboot.redis</groupId>
    	<artifactId>redis-distributed-lock</artifactId>
        <version>1.0.0</version>
    </dependency>

使用说明

全局统一配置:
1.redis配置
     在Spring的配置文件bootstrap.properties或application.properties中添加redis配置信息

    #redis配置
    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    spring.redis.database=0
    
    #可选全局配置
    #分布式锁的KEY前缀
    redis.distributed.lock.lock-pre=MY_LOCK
    #分布式锁的持锁有效时长(单位:s)
    redis.distributed.lock.expired-time=30
    #分布式锁的获取锁失败重试次数
    redis.distributed.lock.retry-count=2

    ![输入图片说明](https://images.gitee.com/uploads/images/2019/0310/221937_2798ace7_1993405.png "全局配置信息")

方式一:注入方式

1.在需要使用锁的实例Bean中添加分布式锁的操作Bean和全局配置信息
    @Autowired
    private ILockManager lockManager;
    @Autowired
    private LockProperties lockProperties;
2.在需要加锁的函数中使用
	/**
     * 无返回值分布式锁注入操作
     * @param userName
     */
    @Override
    public void sayHello(String userName) {
        String lockKey = UUID.randomUUID().toString();
        //将函数的业务操作在加锁操作中完成
        lockManager.callBack(lockKey, new LockCallBack() {
            @Override
            public void execute() {
                System.out.println("Hello,I'm alex.");
            }
        });
    }
    /**
     * 有返回值分布式锁注入操作
     * @param id
     * @param userName
     * @return
     */
    @Override
    public String sayHello(String id, String userName) {
        String lockKey = UUID.randomUUID().toString();
        //将函数的业务操作在加锁操作中完成
        return (String) lockManager.callBack(lockKey, new ReturnCallBack<Object>() {
            @Override
            public Object execute() {
                return "Hello,I'm alex.this is return message.";
            }
        });
    }

![输入图片说明](https://images.gitee.com/uploads/images/2019/0310/222015_e14b4b80_1993405.png "使用方式一")
    

方式二:注解方式

	1.直接在需要加锁的业务函数中添加@Lock注解即可。
	/**
     * 无返回值分布工锁注解操作
     * @param userName
     */
    @Lock
    @Override
    public void loadUser(String userName) {
        System.out.println("Hello,I'm alex.use by annotation");
    }
    /**
     * 有返回值分布式锁注解操作
     * @param id
     * @param userName
     * @param age
     * @return
     */
    @Lock
    @Override
    public String loadUser(@LockKey String id, String userName, @LockKey Integer age) {
        return "Hello,I'm alex.this is return message.use by annotation";
    }
    分布式锁KEY说明
    使用注解方式的分布式锁KEY
    1.默认情况下,会使用类名+函数名作为分布式锁的KEY。
    2.函数的入参可以添加@LockKey注解,分布式锁将使用函数中所有添加了@LockKey的参数值拼接作为分布式锁的KEY

    ![输入图片说明](https://images.gitee.com/uploads/images/2019/0310/222053_513b720b_1993405.png "使用方式二")