基于redis的分布式锁因为其易操作的特性被广泛应用,最新的redis api都是支持.set(key, value, “NX”, “EX”, expireSeconds); // SET IF NOT EXIST,而且还是原子的
,操作成功,返回“OK”,否则返回null。伴随着redis的版本升级,springboot的版本升级,相对应的springboot版本中的原子锁使用方法会变化,本文主要是讲述
SpringBoot 1.x 2.x 2.xx中对应原子锁的使用~~
.SpringBoot1.x 底层是jedis
//引入依赖
com.tal.px
jedis-spring-support
1.0.0-SNAPSHOT
//注入
@Resource
private MergeJedisCmd jedisCmd;
//秒级别使用,支持px ms
jedisCmd.set(createKey(postId), "1", "NX", "EX", 5);
SpringBoot2.x 底层是lettuce客户端,需要单独引入jedis的客户端2.x
//引入依赖
redis.clients
jedis
2.9.3
//基于s级别的加锁.支持px ms
public boolean setRedisLock(String key, int expireSecond) {
try {
RedisCallback callback = (connection) -> {
JedisCommands commands = (JedisCommands) connection.getNativeConnection();
return commands.set(key, "1", "NX", "EX", expireSecond);
};
String result = (String) redisTemplate.execute(callback);
return !StringUtils.isEmpty(result);
} catch (Exception e) {
logger.error("setRedis redis occured an exception", e);
}
return false;
}
SpringBoot2.xx 2.3.0.RELEASE 底层就是lettuce客户端,需要单独引入jedis的客户端3.x
org.springframework.boot
spring-boot-starter-data-redis
io.lettuce
lettuce-core
//引入依赖,跟着springboot走,使用的jedis版本为jedis-3.3.0
redis.clients
jedis
//使用
@Resource
private RedisTemplate redisTemplate;
@Resource
public SetParams setParams;
//完成方法封装
public boolean setRedisLock(String key, int expireSecond) {
try {
RedisCallback callback = (connection) -> {
JedisCommands commands = (JedisCommands) connection.getNativeConnection();
//如果jedis和redis的版本号冲突或者连接池配置有误,此处报错
return commands.set(key, "1",setParams.nx().ex(expireSecond));
};
String result = (String) redisTemplate.execute(callback);
return !StringUtils.isEmpty(result);
} catch (Exception e) {
logger.error("setRedis redis occured an exception", e);
}
return false;
}
上面就是我梳理SpringBoot中的redis分布式锁的应用,如果你刚好再应用分布式锁的话参考我的总结吧,如果你想跟我更多的交流,欢迎关注留言转发。
页面更新:2024-04-30
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号