springboot中怎么整合redis实现分布式锁
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,本篇文章给大家分享的是有关springboot中怎么整合redis实现分布式锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 总结:sp
千家信息网最后更新 2025年02月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安全错误
数据库的锁怎样保障安全
网络技术vlsm例题讲解
杭州启川网络技术有限公司
大小型网站的服务器架设区别
牛牛软件开发哪家好
画数据库表结构图
云服务器秒杀是什么意思
病例收集用什么数据库好
便携服务器
软件开发设备清单
正确道德取向成为网络安全主流
网络安全进入新时代
服务器的管理界面怎么办
腾讯软件开发工程师每月工资
嘉赢网络技术有限公司怎么样
戴尔服务器远程管理口操作
数据库新技术介绍
网络技术毕业生自我鉴定
叛乱沙漠风暴主机版服务器
西藏企业党建软件开发
公大网络安全与执法分数线
服务器拒绝我发送文件的请求
网络安全黑客漫画
乌鲁木齐软件开发外包团队
国家中小学网络安全
mys漫威数据库
老是显示服务器丢失
绝地求生自创服务器
阴阳师超鬼王服务器异常
石家庄网络安全宣传周启动
密码编码学与网络安全教材