Springboot整合redis實現分散式鎖
阿新 • • 發佈:2019-01-14
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分鐘,多個請求同時請求,只有一個能獲取鎖成功,其他的獲取失敗之後返回。