Springboot集成redis实现分布式锁

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangyunsheng11/article/details/84977970

1、在pom.xml文件中新增如下依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、application.yml文件增加redis配置

3、新建RedisConfig的bean

@Component
public class RedisConfig {
}

4、在RedisConfig文件中注入StringRedisTemplate,如:

@Autowired
    private StringRedisTemplate stringRedisTemplate;

完整的RedisConfig.java:

@Component
public class RedisConfig {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;



    /**
     * Set value for key, only if key does not exist.
     * @param key
     * @param value
     * @param seconds 过期时间
     * @return
     */
    public boolean setNX(final String key, final String value, final int seconds) {
        boolean result = stringRedisTemplate.execute(new RedisCallback<Boolean>() {

            @Override
            public Boolean doInRedis(RedisConnection connection)
                    throws DataAccessException {
                RedisSerializer<String> serializer = stringRedisTemplate
                        .getStringSerializer();
                byte[] keyByte = serializer.serialize(key);
                byte[] nameByte = serializer.serialize(value);
                boolean flag = connection.setNX(keyByte, nameByte);
                if (flag) {
                    connection.expire(keyByte, seconds);
                }
                return flag;
            }

        });
        return result;
    }

    /**
     * 获取value
     * @param key
     * @return
     */
    public String get(final String key){
        String result = (String)stringRedisTemplate.execute(new RedisCallback<String>() {

            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                RedisSerializer<String> serializer = stringRedisTemplate
                        .getStringSerializer();
                byte[] keyByte = serializer.serialize(key);
                byte[] valueByte = connection.get(keyByte);
                if (valueByte == null) {
                    return null;
                }
                String value = serializer.deserialize(valueByte);
                return value;
            }

        });
        return result;
    }

    /**
     * 获取过期时间
     * @param key
     * @return
     */
    public Long getExpiry(final String key) {
        return stringRedisTemplate.getExpire(key, TimeUnit.SECONDS);
    }



    public  void  ceshi(){
        //key,value,过期时间,时间单位 s
        stringRedisTemplate.opsForValue().set("key","value",20,TimeUnit.SECONDS);
        //获取对应key的value
        stringRedisTemplate.opsForValue().get("key");
    }

}

5、使用如下

 String redisKey = Constants.TUC_REGISTER_MOBILE + ":" + mobile;
                boolean lock = redisConfig.setNX(redisKey, "1", 1800);
                if (!lock) {
                    return;
                }

表示设置键的过期时间为30分钟,多个请求同时请求,只有一个能获取锁成功,其他的获取失败之后返回。

猜你喜欢

转载自blog.csdn.net/zhangyunsheng11/article/details/84977970