Spring Boot 使用 Redis

1,Spring 是如何集成Redis的?

首先我们要使用jar包

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

2,我们使用的时候需要用到高级封装

2,配置Redis

# Redis服务器地址
spring.redis.host=10.1.30.222
# Redis数据库索引(默认为0)
spring.redis.database=0 
# Redis服务器连接端口
spring.redis.port=6379 
# Redis服务器连接密码(默认为空)
#spring.redis.password=
## 连接超时时间(毫秒)
spring.redis.timeout=30000# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=1#连接池中最大空闲等待时间,3s没有活干的时候直接驱逐该链接
spring.redis.lettuce.pool.min-evictable-idle-time-millis = 3000# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1

StringRedisTemplate

String

public class StringDemo {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private final String key = "zhengzhou";public void test() {stringRedisTemplate.opsForValue().set(key, "我的家乡", 30, TimeUnit.SECONDS);String value = stringRedisTemplate.opsForValue().get(key);System.out.println(value);}
}

Java

Hash

@Component
public class HashDemo {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private  final  String key ="zhouxingxing";public void  test(){stringRedisTemplate.opsForHash().put(key,"20220325","郑州");stringRedisTemplate.opsForHash().put(key,"20220326","洛阳");List<Object> values = stringRedisTemplate.opsForHash().values(key);for (Object value:values){System.out.println(value);}}
}

Java

List

@Component
public class ListDemo {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private  final  String key ="onewayroad";void  test(){stringRedisTemplate.opsForList().leftPush(key,"周星星");stringRedisTemplate.opsForList().leftPush(key,"张敏");stringRedisTemplate.opsForList().leftPush(key,"李大锤");String value = stringRedisTemplate.opsForList().rightPop(key);System.out.println(value);}
}@Testvoid test6() {// 如果一些原生命令,spring 没有给我们封装,redisTemplate.execute(new RedisCallback)while (true){System.out.println("开始一轮监听");List<byte[]> rawResults = redisTemplateProduct.execute(new RedisCallback<List<byte[]>>() {@Overridepublic List<byte[]> doInRedis(RedisConnection connection) throws DataAccessException {return connection.bRPop(5,"product.hot".getBytes());}});if(ObjUtil.isNotEmpty(rawResults)){byte[] rawKey = rawResults.get(0);byte[] rawValue = rawResults.get(1);Product product = (Product)redisTemplateProduct.getValueSerializer().deserialize(rawValue);System.out.println(product);}}

Java

Set

@Component
public class SetDemo {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private final  String zhouxingxing ="zhouxingxing";private  final  String zhangmin = "zhangming";public void  test(){//添加周星星同学感兴趣的科目stringRedisTemplate.opsForSet().add(zhouxingxing,"语文");stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");//添加张敏同学感兴趣的科目stringRedisTemplate.opsForSet().add(zhangmin,"数学");stringRedisTemplate.opsForSet().add(zhangmin,"英语");//获取两位同学共同感兴趣的科目Set<String> values = stringRedisTemplate.opsForSet().intersect(zhouxingxing, zhangmin);System.out.println("周星星和张敏共同感兴趣的科目为:");for(String value : values){System.out.println(value);}}
}

Java

ZSet

@Component
public class ZSetDemo {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private final  String key ="zhouxingxing";public void  test(){//添加周星星同学成绩stringRedisTemplate.opsForZSet().add(key,"语文",98);stringRedisTemplate.opsForZSet().add(key,"数学",87);stringRedisTemplate.opsForZSet().add(key,"英语",75);//获取分数最高的成绩ZSetOperations.TypedTuple<String> values = stringRedisTemplate.opsForZSet().popMax(key);//打印值System.out.println("周星星最好成绩科目是:"+values.getValue());System.out.println("周星星最好成绩:"+values.getScore());}
}

Java

BitMap

@Component
public class BitMapDemo {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private final  String key ="sign#2022#zhouxingxing";public void test(){//设置签到stringRedisTemplate.opsForValue().setBit(key,2,true);stringRedisTemplate.opsForValue().setBit(key,85,true);//获取周星星同学的签到天数RedisCallback<Long> callback = connection -> { return  connection.bitCount(key.getBytes(),0,365);};Long count = stringRedisTemplate.execute(callback);//打印周星星2022年签到天数System.out.println("周星星2022年一共签到天数:"+count);}
}

Java

3.RedisTemplate

3.1泛型约束的使用

@Component
public class RedisTemplateDemo {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate RedisTemplate<String, String> redisTemplate_string_string;@Resourceprivate RedisTemplate<String, User> redisTemplate;@Resource(name="redisTemplate")private ValueOperations<String,User> valueOperations;private final String key = "useris#01";public void test() {User user = User.builder().id(1).name("李四").build();redisTemplate.opsForValue().set(key,user );User value = redisTemplate.opsForValue().get(key);valueOperations.set(key,user );User value2 = valueOperations.get(key);System.out.println(value);}
}

4,乱码的问题

JdkSerializationRedisSerializer  serializer = new JdkSerializationRedisSerializer();byte[] serialize = serializer.serialize("user#01");System.out.println(new String(serialize));

自定义序列化工具

@Configuration
public class RedisConfig {@Bean //主动注册了一个名字叫redisTemplate 的beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer jackson = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper  mapper = new ObjectMapper();// 启用默认类型推理,将类型信息作为属性写入JSON// 就是把对象的全类名写入jsonmapper.activateDefaultTyping( mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);jackson.setObjectMapper(mapper);template.setKeySerializer(StringRedisSerializer.UTF_8);template.setValueSerializer(jackson);template.setHashKeySerializer(StringRedisSerializer.UTF_8);template.setHashValueSerializer(jackson);return template;}}

为什么要自定话应该序列化工具,因为他自己提供的不是很好,所以我们要自己定义一个,这样的话可以把java对象转化成json和字节码存入Redis 里,反序列化就是把json和字节码转化为java对象,泛型指定为 Object.class 表示可以处理任何类型的对象。

最后返回配置好的 RedisTemplate 实例,这样在整个Spring Boot应用中,当需要使用RedisTemplate进行操作时,将自动使用这个经过JSON序列化配置的模板。

详细的介绍:

  1. @Configuration 注解表明这是一个配置类,Spring IoC容器将会读取该类中的bean定义。

  2. @Bean 注解的方法表示该方法会返回一个对象,该对象会被注册为Spring容器中的bean。在这个例子中,方法名为 redisTemplate,所以生成的bean的名字也是 "redisTemplate"。

  3. 方法体中首先创建了一个 RedisTemplate<Object, Object> 实例,并将其连接工厂设置为传入的 RedisConnectionFactory,这是连接Redis的基础配置。

  4. 创建了 Jackson2JsonRedisSerializer 实例,用于将Java对象序列化为JSON字符串,反序列化时则将JSON字符串转回为Java对象。泛型指定为 Object.class 表示可以处理任何类型的对象。

  5. 初始化 ObjectMapper,它是Jackson库中用于处理JSON的核心类。这里启用了默认类型推理(activateDefaultTyping),这样在序列化时,即使目标类没有显式地声明类型信息,也能根据实际运行时类型推断并在JSON中包含类型信息,这对于处理多态类型的场景非常有用。

  6. 将初始化好的 ObjectMapper 设置给 Jackson2JsonRedisSerializer

  7. 配置RedisTemplate的序列化策略:

    • template.setKeySerializer(StringRedisSerializer.UTF_8); 设置键(key)的序列化器为 StringRedisSerializer,以UTF-8格式进行字符串序列化。
    • template.setValueSerializer(jackson); 设置值(value)的序列化器为刚才创建的 Jackson2JsonRedisSerializer,即所有值都将转化为JSON字符串存储。
    • template.setHashKeySerializer(StringRedisSerializer.UTF_8); 设置哈希表键(hash key)的序列化器也为 StringRedisSerializer,同样以UTF-8格式进行字符串序列化。
    • template.setHashValueSerializer(jackson); 设置哈希表值(hash value)的序列化器为 Jackson2JsonRedisSerializer,意味着哈希表中的每个值也将被转化为JSON字符串存储。

最后,返回配置好的 RedisTemplate 实例,这样在整个Spring Boot应用中,当需要使用RedisTemplate进行操作时,将自动使用这个经过JSON序列化配置的模板。

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

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

相关文章

ROS中IMU惯性测量单元

一、IMU惯性测量单元消息包 IMU 是安装在机器人内部的一种传感器模块&#xff0c;用于测量机器人的空间姿态。 IMU的消息包定义在sensor_msgs包中的Imu中。头部是header&#xff0c;记录了消息发送的时间戳和坐标系ID。第二个是角速度。第三个是矢量加速度。三个数据成员都各…

从姿态估计到3D动画

在本文中&#xff0c;我们将尝试通过跟踪 2D 视频中的动作来渲染人物的 3D 动画。 在 3D 图形中制作人物动画需要大量的运动跟踪器来跟踪人物的动作&#xff0c;并且还需要时间手动制作每个肢体的动画。 我们的目标是提供一种节省时间的方法来完成同样的任务。 我们对这个问题…

C++数据类型(一):一文看懂引用的本质

一.引言 函数的参数传递方式主要有传值和传指针。 1.传值 在函数域中为参数分配内存&#xff0c;而把实参的数值传递到新分配的内存中。它的优点是有效避免函数的副作用。 例如&#xff1a; #include <iostream>void swap_val(int x,int y) {int tmp;tmp x;x y;y …

P6学习:Oracle Primavera P6 OBS/责任人解析

前言 Primavera P6 EPPM 责任人用于管理 P6 企业项目组合管理 (EPPM) 系统中的项目所有权和权限。 Primavera P6 EPPM 中的所有项目都至少围绕三个结构进行组织&#xff1a;称为企业项目结构 (EPS) 的用于组织项目的结构、称为工作分解结构 (WBS) 的用于组织项目内活动的结构…

08:HAL---通用定时器功能(输入捕获功能)

前言&#xff1a; 下面的以通用定时器为例&#xff0c;当然高级定时器具有通用定时器的全部功能 ICP1S&#xff1a;上面经过分频后的信号&#xff1b;这里的捕获指的是产生一个捕获事件。 一&#xff1a;输入捕获功能 1:简历 IC&#xff08;Input Capture&#xff09;输入…

Multi-task Lung Nodule Detection in Chest Radiographs with a Dual Head Network

全局头增强真的有用吗&#xff1f; 辅助信息 作者未提供代码

媒体偏见从何而来?--- 美国MRC(媒体评级委员会)为何而生?

每天当我们打开淘宝&#xff0c;京东&#xff0c;步入超市&#xff0c;逛街或者逛展会&#xff0c;各种广告铺天盖地而来。从原来的平面广告&#xff0c;到多媒体广告&#xff0c;到今天融合AR和VR技术的数字广告&#xff0c;还有元宇宙虚拟世界&#xff0c;还有大模型加持的智…

LangChain入门:2.OpenAPI调用ChatGPT模型

引言 在本文中&#xff0c;我们将带您深入探索如何通过OpenAPI与ChatGPT模型进行高效交互&#xff0c;实现智能文本问答功能。通过LangChain库的实践&#xff0c;您将学习构建一个能够与用户进行自然语言对话的系统的关键步骤。 准备步骤 在动手编码之前&#xff0c;请确保您…

八、大模型之Fine-Tuning(1)

1 什么时候需要Fine-Tuning 有私有部署的需求开源模型原生的能力不满足业务需求 2 训练模型利器Hugging Face 官网&#xff08;https://huggingface.co/&#xff09;相当于面向NLP模型的Github基于transformer的开源模型非常全封装了模型、数据集、训练器等&#xff0c;资源…

[Windows]修改默认远程端口3389

文章目录 注册表编辑器找到注册信息找到端口配置修改端口重启远程连接服务远程连接 因为不想使用windos默认远程3389端口&#xff0c;所以考虑换成其他的端口。保证安全&#xff08;虽然windows不是那么安全&#xff09;。 注册表编辑器 windos搜索注册表编辑器 找到注册信息…

网上国网App启动鸿蒙原生应用开发,鸿蒙开发前景怎么样?

从华为宣布全面启动鸿蒙生态原生应用一来&#xff0c;各种各样的新闻就没有停过&#xff0c;如&#xff1a;阿里、京东、小红书……等大厂的加入&#xff0c;而这次他们又与一个国企大厂进行合作&#xff1a; 作为特大型国有重点骨干企业&#xff0c;国家电网承担着保障安全、经…

HAL库 USART通讯

1、UASRT简介 串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式&#xff0c;因为它简单便捷&#xff0c;因此大部分电子设备都支持该通讯方式&#xff0c;电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 按位发送和接收的接口。如RS-232/422/…

C语言-文件操作

&#x1f308;很高兴可以来阅读我的博客&#xff01;&#x1f31f;我热衷于分享&#x1f58a;学习经验&#xff0c;&#x1f3eb;多彩生活&#xff0c;精彩足球赛事⚽&#x1f517;我的CSDN&#xff1a; Kevin ’ s blog&#x1f4c2;专栏收录&#xff1a;C预言 1. 文件的作用 …

【核弹级软安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件

Red Hat 发布了一份“紧急安全警报”&#xff0c;警告称两款流行的数据压缩库XZ Utils&#xff08;先前称为LZMA Utils&#xff09;的两个版本已被植入恶意代码后门&#xff0c;这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094&#xff0c;其CVS…

基于SSM远程同步课堂系统

基于SSM远程同步课堂系统的设计与实现 摘要 在这样一个网络数据大爆炸的时代&#xff0c;人们获取知识、获取信息的通道非常的多元化&#xff0c;通过网络来实现数据信息的获取成为了现在非常常见的一种方式&#xff0c;而通过网络进行教学&#xff0c;在网络上进行远程的课堂…

vue3 视频播放功能整体复盘梳理

回顾工作中对视频的处理&#xff0c;让工作中处理的问题的经验固化成成果&#xff0c;不仅仅是完成任务&#xff0c;还能解答任务的知识点。 遇到的问题 1、如何隐藏下载按钮&#xff1f; video 标签中的controlslist属性是可以用来控制播放器上空间的显示&#xff0c;在原来默…

视觉里程计之对极几何

视觉里程计之对极几何 前言 上一个章节介绍了视觉里程计关于特征点的一些内容&#xff0c;相信大家对视觉里程计关于特征的描述已经有了一定的认识。本章节给大家介绍视觉里程计另外一个概念&#xff0c;对极几何。 对极几何 对极几何是立体视觉中的几何关系&#xff0c;描…

LeetCode刷题【链表,图论,回溯】

目录 链表138. 随机链表的复制148. 排序链表146. LRU 缓存 图论200. 岛屿数量994. 腐烂的橘子207. 课程表 回溯 链表 138. 随机链表的复制 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节…

搜索与图论——Floyd算法求最短路

floyd算法用来求多源汇最短路 用邻接矩阵来存所有的边 时间复杂度O(n^3) #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 20010,INF 1e9;int n,m,k; int g[N][N];void floyd(){for(int k 1;k < n;k ){f…

C++从入门到精通——引用()

C的引用 前言一、C引用概念二、引用特性交换指针引用 三、常引用保证值不变权限的方法权限的放大权限的缩小权限的平移类型转换临时变量 四、引用的使用场景1. 做参数2. 做返回值 五、传值、传引用效率比较值和引用的作为返回值类型的性能比较 六、引用和指针的区别引用和指针的…