一、springboot 集成 spring-boot-starter-data-redis

文章目录

  • 前言
      • 一、 springboot 版本
      • 二、引入 redis 依赖
      • 三、增加配置文件
      • 四、增加配置类
        • 1、 RedissonConfig
        • 2、RedisConfig
      • 五、增加操作类,主要操作 string
  • 总结


前言

一、 springboot 版本

        <spring-boot.version>2.3.5.RELEASE</spring-boot.version><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

二、引入 redis 依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

三、增加配置文件

spring:redis:cluster:nodes: 192.168.162.235:6379,192.168.162.235:6380,192.168.162.235:6381,192.168.162.235:6382,192.168.162.235:6383,192.168.162.235:6384max-redirects: 3pool:#最大空闲连接max-idle: 8#最小空闲连接min-idle: 0#最大连接数,-1表示是没有限制max-active: 8#最大阻塞等待时间,-1表示没有限制max-wait: -1#连接超时时间(毫秒)timeout: 60000commandTimeout: 5000password: 123456connectionTimeout: 60000```

四、增加配置类

1、 RedissonConfig
@Configuration
public class RedissonConfig {@Value("${spring.redis.cluster.nodes}")private String[] nodes;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.connectionTimeout}")private int connectionTimeout;@Bean(destroyMethod = "shutdown")public RedissonClient redissonClient() {Config config = new Config();ClusterServersConfig clusterServersConfig = config.useClusterServers();clusterServersConfig.addNodeAddress(Stream.of(nodes).map((node) -> "redis://" + node).toArray(String[]::new)).setConnectTimeout(connectionTimeout);if (StringUtils.isNotBlank(password)) {clusterServersConfig.setPassword(password);}return Redisson.create(config);}
}
2、RedisConfig
@Configuration
public class RedisConfig {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();// 配置连接工厂template.setConnectionFactory(factory);//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和publicom.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常// om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jacksonSeial.setObjectMapper(om);// 值采用json序列化template.setValueSerializer(jacksonSeial);//使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());// 设置hash key 和value序列化模式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(jacksonSeial);template.afterPropertiesSet();return template;}@Bean@ConditionalOnMissingBean(StringRedisTemplate.class)public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}
}

五、增加操作类,主要操作 string

Setter
@Service
public class StringRedisTemplateClient {@Resourceprivate StringRedisTemplate stringRedisTemplate;/*** 已废弃,不兼容低版本的spring-data-redis*/@Deprecatedpublic Boolean expire(String key, Integer seconds) {Boolean succeed=stringRedisTemplate.expire(key, Duration.ofSeconds(seconds));return succeed;}/*** 单独key的过期时间*/public Boolean expire(String key, long timeout, TimeUnit unit) {Boolean succeed=stringRedisTemplate.expire(key, timeout,unit);return succeed;}//get,set,setex,需要调用方自己序列化valuepublic String get(String key) {String value=stringRedisTemplate.opsForValue().get(key);return value;}public void set(String key, String value, long timeout, TimeUnit unit) {stringRedisTemplate.opsForValue().set(key, value, timeout, unit);}public void set(String key, String value) {stringRedisTemplate.opsForValue().set(key, value);}//对象或泛型版的 set,setex,get。不用自己手动序列化public void set(String key, Object value) {String jsonStr = JSONObject.toJSONString(value);set(key,jsonStr);}public void setex(String key, String value, Integer seconds) {stringRedisTemplate.opsForValue().set(key, value, Duration.ofSeconds(seconds));}public void setex(String key, String value, Long seconds) {stringRedisTemplate.opsForValue().set(key, value, Duration.ofSeconds(seconds));}public void setex(String key, Object value, Integer seconds) {String jsonStr = JSONObject.toJSONString(value);setex(key,jsonStr,seconds);}public long ttl(String key) {Long expiresIn = stringRedisTemplate.opsForValue().getOperations().getExpire(key, TimeUnit.SECONDS);return expiresIn;}public <T> T get(String key, Class<T> clazz) {String jsonStr = get(key);return JSONObject.parseObject(jsonStr, clazz);}public <T> List<T> getList(String key, Class<T> clazz) {String jsonStr = get(key);return JSONObject.parseArray(jsonStr, clazz);}/*** 检查某个key是否存在* @param key* @return*/public boolean exist(String key) {String value = get(key);return StringUtils.isNotBlank(value);}public Boolean delete(String key) {Boolean succeed=stringRedisTemplate.delete(key);return succeed;}public Long incr(String key) {Long increment = stringRedisTemplate.opsForValue().increment(key);return increment;}
}

总结

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

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

相关文章

TypeScript基础类型

string、number、bolean 直接在变量后面添加即可。 let myName: string Tomfunction sayHello(person: string) {return hello, person } let user Tom let array [1, 2, 3] console.log(sayHello(user))function greet(person: string, date: Date): string {console.lo…

基于python+vue城市交通管理系统的设计与实现flask-django-php-nodejs

此系统设计主要采用的是python语言来进行开发&#xff0c;采用django/flask框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一…

数学建模综合评价模型与决策方法

评价方法主要分为两类&#xff0c;其主要区别在确定权重的方法上 一类是主观赋权法&#xff0c;多次采取综合资讯评分确定权重&#xff0c;如综合指数法&#xff0c;模糊综合评判法&#xff0c;层次评判法&#xff0c;功效系数法等 另一类是客观赋权法&#xff0c;根据各指标…

力扣HOT100 - 15. 三数之和

解题思路&#xff1a; 排序 双指针 注意&#xff1a; 在nums[ k ]&#xff0c;nums[ i ]&#xff0c;nums[ j ]的值与自身重复时均会进行跳过&#xff0c;防止重复添加。 如代码中&#xff1a; 防止nums[ k ]重复&#xff1a;if(k>0&&nums[k]nums[k-1]) continue…

Web前端全栈HTML5通向大神之路

本套课程共三大阶段&#xff0c;六大部分&#xff0c;是WEB前端、混合开发与全栈开发必须要掌握的技能&#xff0c;从基础到实践&#xff0c;是从编程小白成长为全栈大神的最佳教程&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1S_8DCORz0N2ZCdtJg0gHsw?pwdtjyv 提取…

Java进阶—GC回收(垃圾回收)

1. 什么是垃圾回收 垃圾回收(Garbage Collection&#xff0c;GC)是Java虚拟机(JVM)的一项重要功能&#xff0c;用于自动管理程序中不再使用的内存。在Java中&#xff0c;程序员不需要手动释放内存&#xff0c;因为GC会自动检测并回收不再使用的对象&#xff0c;从而减少内存泄…

力扣|两数相加|链表

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

面试算法-98-随机链表的复制

题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节…

Git的原理和使用(四)

目录 远程操作 理解分布式版本控制系统 远程仓库 新建远程仓库 克隆远程仓库 向远程仓库推送 拉取远程仓库 配置Git 忽略特殊文件 为命令配置别名 标签管理 理解标签 创建标签 操作标签 远程操作 理解分布式版本控制系统 1、每个人的电脑上都是一个完整的版本库…

MFC CListCtrl 列表框排序 单击列头排序(完整源码)

初级代码游戏的专栏介绍与文章目录-CSDN博客 这是一个通用CListCtrl排序的源代码。 对列表框CListCtrl进行排序&#xff0c;使用列表框的自定义排序功能SortItems支持任意多个排序列和多种排序规则单击列头排序可在控件通知HDN_ITEMCLICK事件中调用&#xff0c;示例代码就在头…

网络行为管理系统招标模板

项目名称&#xff1a;网络行为管理系统招标 一、项目背景 随着信息技术的迅猛发展&#xff0c;网络安全和数据保护已成为企业和组织面临的关键挑战。为了确保网络环境的安全、合规&#xff0c;并实现对网络行为的有效管理和审计&#xff0c;我们特此启动网络行为管理系统的招…

AI程序员革命:探析Devin的登场与编程未来

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

基于python+vue超市货品信息管理系统flask-django-php-nodejs

在此基础上&#xff0c;结合现有超市货品信息管理体系的特点&#xff0c;运用新技术&#xff0c;构建了以 python为基础的超市货品信息管理信息化管理体系。首先&#xff0c;以需求为依据&#xff0c;根据需求分析结果进行了系统的设计&#xff0c;并将其划分为管理员和用户二种…

每日一练:LeeCode-498、对角线遍历【二维数组+边界判断】

给你一个大小为 m x n 的矩阵 mat &#xff0c;请以对角线遍历的顺序&#xff0c;用一个数组返回这个矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,4,7,5,3,6,8,9] 示例 2&#xff1a; 输入&#xff1a;ma…

C语言分支和循环

目录 一.分支 一.if 二.if else 三.if else嵌套 四.else if 五.switch语句 二.循环 一.while (do while&#xff09;break : 二.for函数&#xff1a; 三.goto语句: 四.猜数字: 一.分支 一.if if要条件为真才执行为假不执行而且if只能执行后面第一条如果要执行多条就…

Ubuntu共享文件夹创建及访问 Windows 最简单的方法!

第一步&#xff1a;在Windows下随便建一个文件夹&#xff0c;这里我是在D盘建了一个文件夹叫share 第二步&#xff1a;安装VMware tools&#xff0c;这里就不细说了 第三步&#xff1a;vmware的上方选择 虚拟机-->设置 第四步&#xff1a; 在虚拟机设置里面选择 选项-…

EFcore的实体类配置

1 约定配置 约定大于配置&#xff0c;框架默认了许多实体类配置的规则&#xff0c;在约定规则不满足要求时&#xff0c;可以显示地定义规则 1 数据库表明在不指定的情况下&#xff0c;默认使用的是数据库上下文类【DBContext】中DbSet 的属性名&#xff1b; 2 数据库表列的名字…

19、【qlib】【其他组件/特性/主题】任务管理

简介 工作流部分介绍了如何松耦合地运行研究流程,但使用qrun时只能执行单个任务。为了自动地生成和执行不同的任务,任务管理模块提供了一整套流程,包括任务生成、任务存储、任务训练及任务收集。借助这个模块,用户可以在不同时间段、不同损失函数或甚至不同模型下自动运行…

简单的简单

现在有一个函数需要同时修改2个列表list且他们要保持相同长度&#xff0c;列表中的数据计算是CPU计算密集型&#xff0c;然后有很多个访问程序去读取这两个列表的值 import threading # 创建锁对象 lock threading.Lock() # 全局变量 global_list1 [] global_list2 [] def m…

摘录笔记——2024年3月22日

目录 一、背景 1.1 新人的选择困局 1.2 高人才密度环境下普通员工的成长效率困局 1.3 业务发展和个人成长的二元对立困局 1.4 中年打工人低费效比引发的职场生涯终结困局 二、人的本质 2.1 人的本质的定义 2.2 由“人的本质”引出的几个关键过程 2.2.1 认知指引实践&a…