Springboot 整合 Redisson
前言
redisson的整合很简单,这里直接上代码和演示“读写锁”测试,其他更多的“并发锁”,详情见官方文档(地址见文章末尾),官方写得很详细,这里不赘述了。
1、引入依赖
<!-- 导入 redission 依赖 -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
</dependency>
2、添加配置类
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @description Redisson 配置类
*/
@Configuration
public class MyRedissonConfig {
@Value(value = "${spring.redis.host}")
private String host;
@Value(value = "${spring.redis.port}")
private int port;
@Value(value = "${spring.redis.database}")
private int database;
@Value(value = "${spring.redis.password}")
private String password;
/**
* 单Redis节点模式配置方法
* 其他配置參數,看:
* <a href = "https://github.com/redisson/redisson/wiki/2.-配置方法">
* 单Redis节点模式配置方法
* </a>
*
* @return {@link RedissonClient}
*/
@Bean(destroyMethod = "shutdown")
RedissonClient redisson() {
Config config = new Config();
//Redis多节点
// config.useClusterServers()
// .addNodeAddress("redis://127.0.0.1:6379", "redis://127.0.0.1:7001");
//Redis单节点
SingleServerConfig singleServerConfig = config.useSingleServer();
//可以用"rediss://"来启用SSL连接
String address = "redis://" host ":" port;
singleServerConfig.setAddress(address);
//设置 数据库编号
singleServerConfig.setDatabase(database);
singleServerConfig.setPassword(password);
//连接池大小:默认值:64
// singleServerConfig.setConnectionPoolSize()
return Redisson.create(config);
}
}
读写锁 (ReadWriteLock)
演示“读写锁”测试,其他更多的“并发锁”,详情见官方文档(地址见文章末尾),官方写得很详细,这里不赘述了。
测试要点:
- 读锁和写锁共用一个锁key,命名为:readWriteLock;
- 读锁接口只负责读, JMeter压测每秒并发20,持续压测;
- 写锁接口负责向缓存中写入随机字符串 UUID ,线程睡眠3秒, 模拟业务处理;
- 先启动压测并发20读接口,然后发起“写锁请求1”,再发起“写锁请求2”。观察控制台打印的结果。
测试代码:
/**
* 读写锁(ReadWriteLock) 测试1
* 读锁:共享锁,所有线程共享读锁
* 写锁: 独占锁,只能单独线程占用,执行完才能执行其他“读写锁”。
*/
@ResponseBody
@GetMapping("/test/readWriteLock/toRead")
public String toReadLock() {
//获取 锁
RReadWriteLock readWriteLock = redisson.getReadWriteLock("readWriteLock");
RLock rLock = readWriteLock.readLock();
//上 读锁
rLock.lock();
String writeValue = "";
try {
log.info("【读锁-{}】加锁成功,读数据...", Thread.currentThread()
.getId());
writeValue = redisTemplate.opsForValue()
.get("writeValue");
} finally {
log.info("【读锁-{}】解锁成功,uuid={}", Thread.currentThread()
.getId(),writeValue);
//解锁
rLock.unlock();
}
return writeValue;
}
/**
* 读写锁(ReadWriteLock) 测试2
*/
@ResponseBody
@GetMapping("/test/readWriteLock/toWrite")
public String toWriteLock() {
//获取 锁
RReadWriteLock readWriteLock = redisson.getReadWriteLock("readWriteLock");
RLock rLock = readWriteLock.writeLock();
//上 写锁
rLock.lock();
String uuid = UUID.randomUUID()
.toString();
try {
log.info("【写锁-{}】加锁成功,睡眠3秒,模拟执行业务...", Thread.currentThread()
.getId());
Thread.sleep(3000);
redisTemplate.opsForValue()
.set("writeValue", uuid);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
log.info("【写锁-{}】解锁成功,uuid={}", Thread.currentThread()
.getId(),uuid);
//解锁
rLock.unlock();
}
return "writeLock ok,uuid = " uuid;
}
测试结果:
并发20读锁接口,观察redis缓存值变化,如下图:
写锁接口请求时,观察redis缓存值变化,如下图:
写锁请求1,控制台打印,如下图:
写锁请求2,控制台打印,如下图:
结论:
- ”读-读-读…读“,并发读时,“读锁”相当于没有锁。
- “读-写”或者“写-读”,只要有”写锁“的存在,就要等待”写锁“的释放,才能”读“。写锁时独占锁。
结论:读锁是共享锁,写锁是独占锁。
3、参考地址:
- Redis 分布式锁:关于使用 Redlock 算法的官方说明(英文版)
- Redis 分布式锁:关于使用 Redlock 算法的官方说明(中文版)
- Redisson 官方GitHub地址主页
- Redisson 官方说明文档地址
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgjfbkj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13