springboot中怎么整合redis实现分布式锁
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇文章给大家分享的是有关springboot中怎么整合redis实现分布式锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 总结:sp
千家信息网最后更新 2025年12月02日springboot中怎么整合redis实现分布式锁
本篇文章给大家分享的是有关springboot中怎么整合redis实现分布式锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
总结:springboot整合redis简单而言是比较简单的,导包(导入redis pom文件), 在配置文件里面写redis的基本配置, 自定义一个redisTemplate(模板), 自己写一个工具类
其中注意的就是需要自己导入一个fastJson pom文件,为了方便对象的序列化的操作
第一:导入pom文件
org.springframework.boot
spring-boot-starter-data-redis
com.alibaba
fastjson
1.2.56
第二步:在配置文件中配置redis中的属性
redis:
database: 0
host: localhost
port: 6379
password:
pool:
max-active: 200
max-wait: -1 #连接池最大阻塞时间,负值表示没有限制
max-idle: 10
min-idle: 0 #最小空闲数
timeout: 1000
第三步:自定义模板类
/**
* 自定义一个redis模板并且实现序列化
* @param factory
* @return
*/
@Bean
@SuppressWarnings("all") //作用告诉编辑器不要在编译完成后出现警告信息
public RedisTemplate redisTemplate(RedisConnectionFactory factory){
//引入原来的redisTemplate来实现注入
RedisTemplate template = new RedisTemplate<>();
//将工厂注入进stringTemplate中
template.setConnectionFactory(factory);
//采用了jackSon序列化对象
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//对String进行序列化
StringRedisSerializer stringRedisTemplate = new StringRedisSerializer();
template.setKeySerializer(stringRedisTemplate);
template.setHashKeySerializer(stringRedisTemplate);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
第四步:自己编写一个工具类
@Component
public class RedisUtil {
@Autowired
private RedisTemplate redisTemplate;
/**
* 给指定的key指定失效时间
* @param key
* @param time
* @return
*/
public boolean expire(String key, long time){
try{
if (time > 0){
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
/**
* 获取到指定的key失效时间
* @param key
* @return
*/
public long getExpire(String key){
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
/**
* 判断是否key存在
* @param key
* @return
*/
public boolean hasKey(String key){
return redisTemplate.hasKey(key);
}
/**
* 删除多个key
* @param key
*/
public void delete(String... key){
//对key值进行判断
if (key != null && key.length > 0){
if (key.length == 1){
redisTemplate.delete(key[0]);
}else{
redisTemplate.delete((Collection) CollectionUtils.arrayToList(key));
}
}
}
/**
* 获取到key值对应的值大小
* @param key
* @return
*/
public Object get(String key){
return key==null ? null : redisTemplate.opsForValue().get(key);
}
/**
* 存放key,value值
* @param key
* @param value
* @return
*/
public void set(String key, Object value){
redisTemplate.opsForValue().set(key, value);
}
/**
* 对key 存放一个有效值
* @param key
* @param value
* @param time
*/
public void set(String key, Object value, long time){
if (time > 0){
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
}else{
redisTemplate.opsForValue().set(key, value);
}
}
/**
* 对key递增dalta因素
* @param key
* @param dalta
* @return
*/
public long incr(String key, long dalta ){
if (dalta < 0){
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, dalta);
}
/**
* 对key进行递减多少个元素
* @param key
* @param delta
* @return
*/
public long decr(String key, long delta){
if (delta < 0){
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().decrement(key, delta);
}
/**
* hash取值
* @param key
* @param item
* @return
*/
public Object hget(String key, String item){
return redisTemplate.opsForHash().get(key, item);
}
/**
* 获取key下面的所有值
* @param key
* @return
*/
public Map Redssion 实现分布式锁的流程主要是五个步骤
导入pom文件, 编写一个获取分布式锁接口, 定义一个分布式锁的管理接口, 定义一个类用来实现刚才定义分布式接口管理, 定义一个没有获取到分布式锁的异常
这部分代码是上面springboot整合redis基础实现的,导入的pom文件:
org.redisson
redisson
3.7.0
第二步:定义获取锁后
public interface AquiredLockWorker {
/**
* 获取锁之后处理具体业务逻辑的方法
* @return
* @throws Exception
*/
T invokeAfterLockAquire() throws Exception;
第三步:分布式管理接口
public interface DistributedLocker {
/**
* 获取锁时需要填写的参数
* @param resourceName
* @param worker
* @param
* @return
* @throws Exception
*/
T lock(String resourceName, AquiredLockWorker worker) throws Exception;
/**
* 获取锁时候的需要填写参数,同时设置了锁的有效期
* @param
* @param resourceName
* @param worker
* @param time
* @throws Exception
*/
T lock(String resourceName, AquiredLockWorker worker, long time) throws Exception;
第四步:定义一个类-实现分布式接口的类
@Component
public class RedisLock implements DistributedLocker {
private final static String name = "redisLock";
@Autowired
private RedissonConnector redissonConnector;
@Override
public T lock(String resourceName, AquiredLockWorker worker) throws Exception {
return lock(resourceName, worker, 100);
}
@Override
public T lock(String resourceName, AquiredLockWorker worker, long time) throws Exception {
RedissonClient redissonClient = redissonConnector.getRedissonClient();
RLock lock = redissonClient.getLock(name + resourceName);
//等待100秒释放锁
boolean flag = lock.tryLock(100, time, TimeUnit.SECONDS);
if(flag){
//代码必须这样设计
try{
//拿取到锁之后执行的业务的方法
return worker.invokeAfterLockAquire();
}finally {
lock.unlock();
}
}
//没有拿取到锁时,会报没有拿取锁异常
throw new UnsupportedOperationException();
}
第五步:定义异常类
public class UnableToAquireLockException extends RuntimeException {
/**
* 定义一个无参构造
*/
public UnableToAquireLockException(){};
/**
* 打印出错误的信息
* @param message
*/
public UnableToAquireLockException(String message){
super(message);
}
/**
* 打印错误信息与异常类型
* @param message
* @param cause
*/
public UnableToAquireLockException(String message, Throwable cause){
super(message, cause);
}
调用下:
@RestController
public class RedisController {
@Autowired
private DistributedLocker distributedLocker;
@RequestMapping(value = "index")
public String index() throws Exception {
distributedLocker.lock("test", new AquiredLockWorker(){
@Override
public Object invokeAfterLockAquire() throws Exception {
System.out.println("这里直接进行逻辑处理");
Thread.sleep(100);
return null;
}
});
return "hello redis";
}
以上就是springboot中怎么整合redis实现分布式锁,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
分布式
文件
时间
接口
整合
序列
配置
信息
元素
对象
模板
管理
有效
业务
代码
参数
因子
就是
工具
数据
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
DM数据库SQL注入
网络安全教育片视频剧情
东莞通讯软件开发费用是多少
如何将网页登录的数据库导出
700亿的网络安全市场
大疆飞行安全数据库更新不了
腾讯网络安全竞技综艺
通用网络技术咨询质量保障
德州直播软件开发推荐
南京小程序软件开发流程
大喆网络技术有限公司
小迪课程网络安全
文件实时同步服务器
服务器资源分配动态规划算法
通信工程和网络安全薪酬比较
查看数据库表索引的命令
南京炒股软件开发
腾讯视频无法连接服务器怎么办
数据库复制功能吗
常州企业软件开发业务流程
服务器bios中网卡选项在哪
成都玖崟互联网科技有限公司
阿里云服务器管理器
加强网络安全和信息化培训
英雄联盟lol服务器
云数据库api数据请求
广州php软件开发真本事
央企网络安全系统
上海高磊软件开发有限公司
数据库支持大小写