private static final int maxIdle = 8;
/**
-
初始化redis
-
@return
*/
public static Jedis getJedis() {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxIdle(maxIdle);
JedisPool jedisPool = new JedisPool(poolConfig, HOST, PORT);
return jedisPool.getResource();
}
}
===============================================================
/**
-
通过setnx加锁
-
@param key
-
@param val
-
@param expireTime 加锁时间,单位ms
-
@return
*/
public static boolean lock(String key, String val, int expireTime) {
try {
long re = getJedis().setnx(key, val);
if (re == 1) {
getJedis().expire(key, expireTime);
return true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
getJedis().close();
}
return false;
}
测试加锁效果
我们通过设置加锁时间为60s,在60s内对同一个key进行操作,看看是否能够操作成功
@Slf4j
@RestController
public class RedisTestController {
@GetMapping(“/setnx/{key}/{val}”)
public String setnx(@PathVariable String key, @PathVariable String val) {
String result = null;
if (RedisUtils.lock(key, val, 60 * 1000)) {//在此处将key进行加锁
result = “key:” + key + “,value:” + val + " 加锁成功";
log.info(result);
} else {
result = “key:” + key + “,value:” + val + " 加锁失败";
log.error(r