1. 程式人生 > >Springboot整合redis實現分散式鎖

Springboot整合redis實現分散式鎖

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分鐘,多個請求同時請求,只有一個能獲取鎖成功,其他的獲取失敗之後返回。