SpringBoot3整合Redission

news/2025/1/10 13:15:26/文章来源:https://www.cnblogs.com/lwx11111/p/18663793

1.依赖

<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.25.0</version>
</dependency>

2.yml

spring:data:redis:# 数据库database: 0# 主机host: 10.43.119.175# 端口port: 6379# 密码password: 123456# 读超时timeout: 5s# 连接超时connect-timeout: 5sredis:redisson:# 编码。默认值: org.redisson.codec.JsonJacksonCodeccodec: org.redisson.codec.JsonJacksonCodec# 线程池数量。默认值: 当前处理核数量 * 2threads: 16# Netty线程池数量。默认值: 当前处理核数量 * 2nettyThreads: 32# 传输模式。默认值: NIOtransportMode: "NIO"# 监控锁的看门狗超时,单位:毫秒。默认值: 30000lockWatchdogTimeout: 30000# 是否保持订阅发布顺序。默认值: truekeepPubSubOrder: true# Redisson 单实例配置singleServerConfig:# 节点地址。格式:redis://host:portaddress: "redis://10.43.119.175:6379"# 密码。默认值: nullpassword: 123456# 数据库编号。默认值: 0database: 0# 客户端名称(在Redis节点里显示的客户端名称)。默认值: nullclientName: null# 连接超时,单位:毫秒。默认值: 10000connectTimeout: 10000# 命令等待超时,单位:毫秒。默认值: 3000timeout: 3000# 命令失败重试次数。默认值: 3retryAttempts: 3# 命令重试发送时间间隔,单位:毫秒。默认值: 1500retryInterval: 1500# 最小空闲连接数。默认值: 32connectionMinimumIdleSize: 24# 连接池大小。默认值: 64connectionPoolSize: 64# 单个连接最大订阅数量。默认值: 5subscriptionsPerConnection: 5# 发布和订阅连接的最小空闲连接数。默认值: 1subscriptionConnectionMinimumIdleSize: 1# 发布和订阅连接池大小。默认值: 50subscriptionConnectionPoolSize: 50# DNS监测时间间隔,单位:毫秒。默认值: 5000dnsMonitoringInterval: 5000# 连接空闲超时,单位:毫秒。默认值: 10000idleConnectionTimeout: 10000

3.工具类

/*** Redis工具类*/
@Component
@RequiredArgsConstructor(onConstructor_ = @Autowired)
public class RedisService {private final RedissonClient redissonClient;// ============================= String类型操作 ============================/*** 将值存储到Redis中** @param key   键* @param value 值*/public <T> void setString(String key, T value) {RBucket<T> bucket = redissonClient.getBucket(key);bucket.set(value);}/*** 将值存储到Redis中** @param key      键* @param value    值* @param timeout  过期时间* @param timeUnit 时间单位*/public <T> void setString(String key, T value, long timeout, TimeUnit timeUnit) {RBucket<T> bucket = redissonClient.getBucket(key);bucket.set(value, timeout, timeUnit);}/*** 根据键获取Redis中的值** @param key 键* @return 值*/public <T> T getString(String key) {RBucket<T> bucket = redissonClient.getBucket(key);return bucket.get();}// ============================= Hash类型操作 ============================/*** 将值存储到Redis中** @param key   键* @param field hash键* @param value 值*/public <T> boolean addToHash(String key, Object field, T value) {RMap<Object, T> hash = redissonClient.getMap(key);return hash.fastPut(field, value);}/*** 将值存储到Redis中** @param key      键* @param field    hash键* @param value    值* @param timeout  过期时间* @param timeUnit 时间单位*/public <T> boolean addToHash(String key, Object field, T value, long timeout, ChronoUnit timeUnit) {RMap<Object, T> hash = redissonClient.getMap(key);boolean fastPut = hash.fastPut(field, value);boolean expire = hash.expire(Instant.now().plus(timeout, timeUnit));return fastPut && expire;}/*** 根据键和Hash键获取Redis中的值** @param key   键* @param field hash键* @return 值*/public <T> T getFromHash(String key, Object field) {RMap<Object, T> hash = redissonClient.getMap(key);return hash.get(field);}/*** 根据键获取Redis中的值** @param key 键* @return 值*/public <T> Map<Object, T> getFromHash(String key) {RMap<Object, T> hash = redissonClient.getMap(key);return hash.readAllMap();}/*** 根据键和Hash键更新Redis中的值** @param key   键* @param field hash键* @param value 值* @return 更新成功返回true,否则返回false*/public <T> boolean updateToHash(String key, Object field, T value) {RMap<Object, T> hash = redissonClient.getMap(key);return hash.fastReplace(field, value);}/*** 根据Key,删除Hash类型的数据** @param key      键* @param hashKeys hash键* @return 删除成功的数量*/public <T> long removeFromHash(String key, T... hashKeys) {RMap<Object, T> hash = redissonClient.getMap(key);return hash.fastRemove(hashKeys);}// ============================= List类型操作 ============================/*** 向List数据类型中添加值** @param key   键* @param value 值*/public <T> boolean addToList(String key, T value) {RList<T> list = redissonClient.getList(key);return list.add(value);}/*** 向List数据类型中添加值** @param key   键* @param value 值*/public <T> boolean addToList(String key, List<T> value) {RList<T> list = redissonClient.getList(key);return list.addAll(value);}/*** 向List数据类型中添加值** @param key      键* @param value    值* @param timeout  过期时间* @param timeUnit 时间单位*/public <T> boolean addToList(String key, T value, long timeout, ChronoUnit timeUnit) {RList<T> list = redissonClient.getList(key);list.add(value);return list.expire(Instant.now().plus(timeout, timeUnit));}/*** 从List数据类型中获取值** @param key   键* @param start 起始位置* @param end   结束位置* @return 值*/public <T> List<T> getFromList(String key, int start, int end) {RList<T> list = redissonClient.getList(key);return list.range(start, end);}/*** 获取List数据类型中的所有值** @param key 键* @return 值*/public <T> List<T> getFromList(String key) {RList<T> list = redissonClient.getList(key);return list.readAll();}/*** 移除集合左侧第一个元素** @param key 键*/public void removeListLeft(String key) {RList<Object> list = redissonClient.getList(key);list.fastRemove(0);}/*** 移除集合右侧第一个元素** @param key 键*/public void removeListRight(String key) {RList<Object> list = redissonClient.getList(key);list.fastRemove(list.size() - 1);}/*** 移除集合指定位置元素** @param key   键* @param index 索引*/public void removeFromList(String key, int index) {RList<Object> list = redissonClient.getList(key);list.fastRemove(index);}/*** 移除集合指定元素** @param key   键* @param value 值*/public <T> boolean removeFromList(String key, T value) {RList<T> list = redissonClient.getList(key);return list.removeIf(o -> o.equals(value));}// ============================= Set类型操作 ============================/*** 添加值到Set数据类型中** @param key   键* @param value 值*/public <T> boolean addToSet(String key, T value) {RSet<T> set = redissonClient.getSet(key);return set.add(value);}/*** 添加值到Set数据类型中** @param key      键* @param value    值* @param timeout  过期时间* @param timeUnit 时间单位* @return 是否成功*/public <T> boolean addToSet(String key, T value, long timeout, ChronoUnit timeUnit) {RSet<T> set = redissonClient.getSet(key);boolean add = set.add(value);boolean expire = set.expire(Instant.now().plus(timeout, timeUnit));return add && expire;}/*** 添加值到Set数据类型中** @param key    键* @param values 值* @return 是否成功*/public <T> boolean addToSet(String key, List<T> values) {RSet<T> set = redissonClient.getSet(key);return set.addAll(values);}/*** 添加值到Set数据类型中** @param key      键* @param values   值* @param timeout  过期时间* @param timeUnit 时间单位* @return 是否成功*/public <T> boolean addToSet(String key, List<T> values, long timeout, ChronoUnit timeUnit) {RSet<T> set = redissonClient.getSet(key);set.addAllCounted(values);return set.expire(Instant.now().plus(timeout, timeUnit));}/*** 获取Set的所有元素。** @param key 键* @return 所有值*/public <T> Set<T> getFromSet(String key) {RSet<T> set = redissonClient.getSet(key);return set.readAll();}/*** 从Set数据类型中删除值** @param key    键* @param values 值*/public <T> void removeFromSet(String key, List<T> values) {RSet<T> set = redissonClient.getSet(key);values.forEach(set::remove);}/*** 从Set数据类型中删除值** @param key   键* @param value 值*/public <T> boolean removeFromSet(String key, T value) {RSet<T> set = redissonClient.getSet(key);return set.remove(value);}// ============================= ZSet类型操作 ============================/*** 添加值到ZSet数据类型中** @param key   键* @param value 值* @param score 分值*/public <T> void addToZSet(String key, T value, double score) {RScoredSortedSet<T> sortedSet = redissonClient.getScoredSortedSet(key);sortedSet.add(score, value);}/*** 在ZSet数据类型中添加值** @param key      键* @param value    值* @param score    分值* @param timeout  过期时间* @param timeUnit 时间单位*/public <T> void addToZSet(String key, T value, double score, long timeout, ChronoUnit timeUnit) {RScoredSortedSet<T> sortedSet = redissonClient.getScoredSortedSet(key);sortedSet.add(score, value);sortedSet.expire(Instant.now().plus(timeout, timeUnit));}/*** 获取ZSet的范围元素。** @param key   键* @param start 起始位置* @param end   结束位置* @return Set类型的值*/public <T> Set<Object> getFromZSet(String key, int start, int end) {RScoredSortedSet<T> sortedSet = redissonClient.getScoredSortedSet(key);return new HashSet<>(sortedSet.valueRange(start, end));}/*** 删除ZSet数据类型中的值** @param key    键* @param values 值*/public <T> void removeFromZSet(String key, List<T> values) {RScoredSortedSet<T> sortedSet = redissonClient.getScoredSortedSet(key);sortedSet.removeAll(values);}/*** 删除ZSet数据类型中的值** @param key   键* @param value 值*/public <T> void removeFromZSet(String key, T value) {RScoredSortedSet<T> sortedSet = redissonClient.getScoredSortedSet(key);sortedSet.remove(value);}// ============================= Common ============================/*** 判断Key是否存在** @param key 键* @return 存在返回true,否则返回false*/public boolean exists(String key) {return redissonClient.getBucket(key).isExists();}/*** 删除Key** @param key 键*/public boolean remove(String key) {long delete = redissonClient.getKeys().delete(key);return delete > 0;}/*** 设置Key的过期时间** @param key      键* @param timeout  过期时间* @param timeUnit 时间单位* @return 设置成功返回true,否则返回false*/public boolean expire(String key, long timeout, ChronoUnit timeUnit) {return redissonClient.getBucket(key).expire(Instant.now().plus(timeout, timeUnit));}/*** 获取Key的过期时间** @param key 键* @return 过期时间*/public Long getExpire(String key) {return redissonClient.getBucket(key).getExpireTime();}/*** 递增操作** @param key   键* @param delta 增加的值* @return 递增后的值,如果键不存在,则返回-1*/public long increment(String key, long delta) {RAtomicLong atomicLong = redissonClient.getAtomicLong(key);return atomicLong.addAndGet(delta);}/*** 递减操作** @param key   键* @param delta 减少的值* @return 递减后的值,如果键不存在,则返回-1*/public long decrement(String key, long delta) {RAtomicLong atomicLong = redissonClient.getAtomicLong(key);return atomicLong.decrementAndGet();}/*** 递增操作** @param key   键* @param delta 增加的值* @return 递增后的值,如果键不存在,则返回-1*/public double increment(String key, double delta) {RAtomicDouble atomicDouble = redissonClient.getAtomicDouble(key);return atomicDouble.addAndGet(delta);}/*** 递减操作** @param key   键* @param delta 减少的值* @return 递减后的值,如果键不存在,则返回-1*/public double decrement(String key, double delta) {RAtomicDouble atomicDouble = redissonClient.getAtomicDouble(key);return atomicDouble.decrementAndGet();}
}

4.测试

@RestController
@RequestMapping("/redission")
@Slf4j
public class RedissionAPI {@Resourceprivate RedisService redisService;private static final String STRING_KEY = "redis:string";private static final String LIST_KEY = "redis:list";private static final String SET_KEY = "redis:set";private static final String HASH_KEY = "redis:hash";@PostMapping("/redis1")public void redisStringTest() {log.info("Redis String 数据类型测试");redisService.setString(STRING_KEY, LocalDateTime.now().toString());String redisGetStringData = redisService.getString(STRING_KEY);log.info("Redis String Get:{}", redisGetStringData);boolean remove = redisService.remove(STRING_KEY);log.info("Redis String Remove:{}", remove);redisGetStringData = redisService.getString(STRING_KEY);log.info("Redis String Get After Delete:{}", redisGetStringData);}@PostMapping("/redis2")public void redisListTest() {// 填充数据List<Integer> list = new ArrayList<>();for (int i = 0; i < 5; i++) {list.add(LocalDateTime.now().getNano());ThreadUtil.sleep(5);}boolean addItemResult = redisService.addToList(LIST_KEY, LocalDateTime.now().getNano());redisService.getFromList(LIST_KEY).forEach(s -> log.info("Redis List Get After Add Item:{}", s));boolean addListDataResult = redisService.addToList(LIST_KEY, list);log.info("Redis List Add List:{}", addListDataResult);redisService.getFromList(LIST_KEY).forEach(s -> log.info("Redis List Get After Add List:{}", s));redisService.getFromList(LIST_KEY, 0, 2).forEach(s -> log.info("Redis List Get By Index:{}", s));log.info("Redis List Size Before Delete:{}", redisService.getFromList(LIST_KEY).size());redisService.removeFromList(LIST_KEY, 0);log.info("Redis List Size After Delete:{}", redisService.getFromList(LIST_KEY).size());boolean remove = redisService.remove(LIST_KEY);log.info("Redis List Remove:{}", remove);}public void redisSetTest() {log.info("Redis Set 数据类型测试");// 填充数据List<Integer> list = new ArrayList<>();for (int i = 0; i < 5; i++) {list.add(LocalDateTime.now().getNano());ThreadUtil.sleep(5);}boolean addItemResult = redisService.addToSet(SET_KEY, LocalDateTime.now().getNano());log.info("Redis Set Add item:{}", addItemResult);redisService.getFromSet(SET_KEY).forEach(s -> log.info("Redis Set Get After Add Item:{}", s));boolean addListDataResult = redisService.addToSet(SET_KEY, list);log.info("Redis Set Add List:{}", addListDataResult);redisService.getFromSet(SET_KEY).forEach(s -> log.info("Redis Set Get After Add List:{}", s));log.info("Redis Set Size Before Delete:{}", redisService.getFromSet(SET_KEY).size());redisService.removeFromSet(SET_KEY, LocalDateTime.now().getNano());log.info("Redis Set Size After Delete:{}", redisService.getFromSet(SET_KEY).size());boolean remove = redisService.remove(SET_KEY);log.info("Redis Set Remove:{}", remove);}public void redisHashTest() {log.info("Redis Hash 数据类型测试");Integer key = LocalDateTime.now().getNano();boolean addItemResult = redisService.addToHash(HASH_KEY, key, LocalDateTime.now().toString());log.info("Redis Hash Add item:{}", addItemResult);redisService.getFromHash(HASH_KEY).forEach((k, v) -> log.info("Redis Hash Get After Add Item:{} - {}", k, v.toString()));log.info("Redis Hash Get By Key:{}", redisService.getFromHash(HASH_KEY, key).toString());log.info("Redis Hash Size Before Delete:{}", redisService.getFromHash(HASH_KEY).size());redisService.removeFromHash(HASH_KEY, key);log.info("Redis Hash Size After Delete:{}", redisService.getFromHash(HASH_KEY).size());boolean remove = redisService.remove(HASH_KEY);log.info("Redis Hash Remove:{}", remove);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867110.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ETL之kettle版本安装包免费下载地址

想真正学习或者提升自己的ETL领域知识的朋友欢迎进群,一起学习,共同进步。由于群内人员较多无法直接扫描进入,公众号后台加我微信入群,备注kettle/hop。 1、群里经常有小伙伴询问kettle安装包或者私下找我要,今天群里的三倍镜大佬分享了一个kettle全家桶版本,今天我整理下…

Win电脑日历、日程表怎么固定到桌面显示?

使用Win电脑办公,想要随时查看今天的待办任务怎么办?如何快速记录临时安排的工作事项呢?如果能够把日历、日程表固定到电脑桌面上显示就很方便了! 那么Win电脑桌面日历/日程表,怎么固定到桌面显示呢?其实用敬业签就可以轻松实现! 它是一款能一直悬挂在Win桌面上显示的便…

【每日一题】20250110

可人生就是要不断地做选择啊。总不能因为怕选择,就永远停留在原地吧。【每日一题】从区间 \([0,1]\) 随机抽取 \(2n\) 个数 \(x_1,x_2,\ldots,x_n,y_1,y_2,\ldots,y_n\),构成 \(n\) 个数对 \(( x_1, y_1)\), \(( x_2, y_2) , \ldots\), \(( x_n, y_n)\),其中两数的平方和小于…

龙哥量化:文华8程序化名词解释WH8程序化交易:支持一开一平的信号过滤模型,也支持多次开仓多次平仓的加减仓模型;支持一根K线一个信号的模型,也支持一根K线多个信号的模型。

如果您需要代写技术指标公式, 请联系我。 龙哥QQ:591438821 龙哥微信:Long622889 也可以把您的通达信,文华技术指标改成TB交易开拓者、金字塔、文华8的自动交易量化策略 WH8程序化交易:支持一开一平的信号过滤模型,也支持多次开仓多次平仓的加减仓模型;支持一根K线一个信…

2024年终总结-gxngxngxn

2024年终总结-gxngxngxn 引言 原本应该早就写完这一篇年终总结的,但由于期末和一些琐事,一直没时间,一拖再拖。到了最近放假了,才得空下笔。 想写年终总结的想法起源于去年的这个时候,也就是2024年的一月份左右。 那时我如往常一样打开收藏的大佬们的博客,映入眼帘的便是…

AI正在悄悄接管互联网:超过半数内容已是 AI 生成!

序言:这个世界任何时候都会因为利益冲突而变得精彩,人工智能写作是不是一种侵权行为,美国人内部闹得很欢,人工智能对人类的模仿到底算不算侵权? 如果法律裁定这种行为就是侵权,那也将是划时代的,因为:模仿不付费将会犯罪,那这个世界会不会就因此停滞发展呢?因为人类的…

【模拟电子技术】04-二极管的直流等效电路

【模拟电子技术】04-二极管的直流等效电路 上节提到PN结形成到二极管,并且了解到二极管V-A特性曲线每一段都能利用,并且可以规定电流路径。使用二极管的时候需要关注它的主要参数这四个参数中的每一个在使用的时候都需要考虑,如果没有选择好规格的话,使用时就可能烧坏。不难…

详解GaussDB事务和并发控制机制,提升事务并发处理效率

本文着重介绍了GaussDB的事务管理和并发控制机制,GaussDB采用多版本并发控制和两阶段锁相结合的机制。摘要:本文着重介绍了GaussDB的事务管理和并发控制机制,GaussDB采用多版本并发控制和两阶段锁相结合的机制。本文分享自华为云社区《华为云开发者云主机体验【玩转华为云】…

php NFA灾难回溯

php NFA灾难回溯正则分为NFA和DFA两种,而php中使用的是NFA.php通过pcre.backtrack_limit来限制回溯次数,如果超过了这个限制,就会返回false.pcre.backtrack_limit默认值是100万. 因此我们可以通过传入大量的垃圾字符或是触发灾难性回溯来超过限制,从而绕过preg_match. 除此以外…

如何构建适合MCN团队的文档管理系统

一、MCN团队运营中的文档管理痛点 每到年末,MCN团队都会面临一场“信息战”。团队成员需要汇总全年合作数据、内容产出情况、以及运营数据报表。这些繁重的任务中,文档管理是最基础但也最容易被忽视的一环。 痛点包括:文件分布零散:不同项目成员习惯使用不同的存储方式,难…

CDS标准视图:一次性账户的客户行项目 I_ONETIMEACCOUNTCUSTOMER

视图名称:一次性账户的客户行项目 视图类型:基础 视图代码:点击查看代码 @EndUserText.label: One-Time Account Data for Customer Items @Analytics: { dataCategory:#DIMENSION} @Analytics.internalName:#LOCAL @VDM.viewType: #BASIC @AbapCatalog.sqlViewName: IONETI…