当前位置: 首页 > news >正文

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序列化配置的模板。

相关文章:

Spring Boot 使用 Redis

1&#xff0c;Spring 是如何集成Redis的&#xff1f; 首先我们要使用jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><gro…...

火车头通过关键词采集文章的原理

随着互联网信息的爆炸式增长&#xff0c;网站管理员和内容创作者需要不断更新和发布新的文章&#xff0c;以吸引更多的用户和提升网站的排名。而火车头作为一款智能文章采集工具&#xff0c;在这一过程中发挥着重要作用。本文将探讨火车头如何通过关键词采集文章&#xff0c;以…...

Kafka 面试题及参考答案

目录 1. Kafka 的核心特性是什么? 2. Kafka 为什么能够实现高吞吐量? 3. Kafka 的消息丢失是...

【Qt 学习笔记】Day1 | Qt 背景介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Day1 | Qt 背景介绍 文章编号&#xff1a;Qt 学习笔记 / 01 文章目录…...

springboot3.2.4+Mybatis-plus在graalvm21环境下打包exe

springboot3.2.4Mybatis-plus在graalvm21环境下打包exe 前提条件为之前已经能直接打包springboot3.2.4项目了然后在此基础上接入Mybatis-plus&#xff0c;然后能够正常进行打包exe并且执行&#xff0c;参考之前的文章进行打包 核心配置如下 package com.example.demo.config…...

Kubernetes(K8S)学习(二):K8S常用组件

K8S常用组件 一、 Controllers1、ReplicationController(RC)2、ReplicaSet(RS)3、Deployment 二、Labels and Selectors三、Namespace&#xff08;命名空间&#xff09;1、简介2、测试2.1、创建namespace2.2、创建pod 四、Network1、集群内&#xff1a;同一个Pod中的容器通信2、…...

如何使用群晖WebDAV实现固定公网地址同步Zotero文献管理器

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…...

【JavaSE】初识线程,线程与进程的区别

文章目录 ✍线程是什么&#xff1f;✍线程和进程的区别✍线程的创建1.继承 Thread 类2.实现Runnable接口3.匿名内部类4.匿名内部类创建 Runnable ⼦类对象5.lambda 表达式创建 Runnable ⼦类对象 ✍线程是什么&#xff1f; ⼀个线程就是⼀个 “执行流”. 每个线程之间都可以按…...

全国青少年软件编程(Python)等级考试三级考试真题2023年9月——持续更新.....

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;三级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 一、单选题(共25题&#xff0c;共50分) 1.有一组数据存在列表中,things[“桌子”,“椅子”,“茶几”,“沙发”,“西瓜”,“苹果”,“草莓”,“…...

react-navigation:

我的仓库地址&#xff1a;https://gitee.com/ruanjianbianjing/bj-hybrid react-navigation&#xff1a; 学习文档&#xff1a;https://reactnavigation.org 安装核心包: npm install react-navigation/native 安装react-navigation/native本身依赖的相关包: react-nativ…...

nginx负载均衡模式

轮询 (Round Robin) 用法&#xff1a;这是Nginx默认的负载均衡策略。每个请求会按顺序分配给upstream中的后端服务器&#xff0c;即按照配置的服务器列表顺序依次分配。 upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.…...

手写简易操作系统(十七)--编写键盘驱动

前情提要 上一节我们实现了锁与信号量&#xff0c;这一节我们就可以实现键盘驱动了&#xff0c;访问键盘输入的数据也属于临界区资源&#xff0c;所以需要锁的存在。 一、键盘简介 之前的 ps/2 键盘使用的是中断驱动的&#xff0c;在当时&#xff0c;按下键盘就会触发中断&a…...

springboot中基于RestTemplate 类 实现调用第三方API接口【POST版本】

https://blog.csdn.net/Drug_/article/details/135111675 这一篇的升级版 还是先配置文件 package com.init.config;import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.clie…...

编程器固件修改教程

首发csdn&#xff0c;转载请说明出处&#xff0c;保留一切权益。 关于编程器固件 所谓编程器固件是用编程器读取嵌入式设备的FLASH存储数据生成的文件&#xff0c;类似于直接用工具复制整个硬盘 编程器固件与普通固件的差异 编程器固件是用特定的结构(按顺序、大小)将一些文件系…...

Python从原Excel表中抽出数据存入同一文件的新的Sheet(附源码)

python读取excel数据。Python在从原Excel表中抽出数据并存储到同一文件的新的Sheet中的功能&#xff0c;充分展示了其在数据处理和自动化操作方面的强大能力。这一功能不仅简化了数据迁移的过程&#xff0c;还提高了数据处理的效率&#xff0c;为数据分析和管理工作带来了极大的…...

计算机网络实验六:路由信息协议RIP

目录 6 实验六:路由信息协议RIP 6.1 实验目的 6.2 实验步骤 6.2.1 构建网络拓扑、配置各网络设备 6.2.2 网络功能验证测试 6.3 实验总结 6 实验六:路由信息协议RIP 6.1 实验目的 (1)学习RIP协议的工作原理和特点 (2)学习如何选择最短路径路由。 (3)进一步掌握…...

MySQL数据库备份策略与实践详解

目录 引言 一、MySQL数据库备份的重要性 &#xff08;一&#xff09;数据丢失的原因 &#xff08;二&#xff09;数据丢失的后果 二、MySQL备份类型 &#xff08;一&#xff09;根据数据库状态 &#xff08;二&#xff09;根据数据的完整性 &#xff08;三&#xff09;…...

String类相关oj练习

前言&#xff1a; 此处练习对应博客文章&#xff1a;公主&#xff0c;王子&#xff0c;请点击​​​​​​​ 1.第一次只出现一次的字符 做题首先看清要求和提示&#xff1a; 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不…...

【Linux】进程实践项目 —— 自主shell编写

送给大家一句话&#xff1a; 不管前方的路有多苦&#xff0c;只要走的方向正确&#xff0c;不管多么崎岖不平&#xff0c;都比站在原地更接近幸福。 —— 宫崎骏《千与千寻》 自主shell命令编写 1 前言2 项目实现2.1 创建命令行2.2 获取命令2.3 分割命令2.4 运行命令 3 源代码…...

基于SpringBoot和Vue的学生笔记共享平台的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的学生笔记共享平台的设计与实现 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&…...

C++心决之命名空间、重载函数和引用

目录 1. C关键字(C98) 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 3. C输入&输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理--名字修饰(name Mangling) 6. 引用 6.1 引用概念 6.2 引用特性…...

higress使用了解

higress使用了解 了解下 http-echo、httpbin 镜像使用 未按文档实际搭建&#xff0c;但大致是这样 官方文档&#xff1a;https://higress.io/zh-cn/docs/overview/what-is-higress 了解&#xff1a;利用sealos快速安装kubernetes集群&#xff1a;https://note.youdao.com/s…...

Swagger3探索之游龙入海

引言 后端开发中常用的接口调用工具一般使用Postman、ApiPost工具&#xff0c;但后期需要与前端联调&#xff0c;要补充接口文档花费大量时间&#xff0c;此时Swagger3应运而生&#xff0c;大大提高沟通交流的效率。 引用依赖 <!-- Swagger3 调用方式 http://ip:port/swa…...

javaWeb项目-学生考勤管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JAVA技术 JavaSc…...

云备份项目认识、环境搭建以及所使用的库的介绍

一、云备份认识 将本地计算机一个受监管的文件夹的文件上传到服务器中&#xff0c;有服务器组织&#xff0c;客户端可以通过网页将文件查看并且下载下来&#xff0c;下载过程支持断点续传功能&#xff0c;并且服务器会对上传的文件进行热点管理&#xff0c;长时间没人访问的文…...

汇编语言第四版-王爽第2章 寄存器

二进制左移四位&#xff0c;相当于四进制左移一位。 debug命令实操&#xff0c;win11不能启动&#xff0c;需要配置文件 Windows64位系统进入debug模式_window10系统64位怎么使用debugger-CSDN博客...

MoonBit MeetUp回顾——张正、宗喆:编程语言在云原生与区块链领域的技术探索

宗喆和张正分别给我们带了 KCL 相关的最新进展&#xff0c;由蚂蚁集团开发的 Rust 编写的开源 DSL&#xff0c;目标是优化云原生策略配置和用户体验。它通过引入动态配置管理、配置校验和基础设施抽象等核心概念&#xff0c;解决开发者认知负担、配置膨胀和标准化工具缺乏的问题…...

云原生靶场kebernetesGoat、Metarget

靶场 文章目录 靶场kebernetesGoat靶场安装Docker in DockerSSRF漏洞容器逃逸到主系统Docker CIS 基线分析Kubernetes CIS 安全基线分析分析被部署挖矿软件的容器镜像获取环境信息Hidden in layersRBAC最低权限配置错误使用 Sysdig Falco 进行运行时安全监控和检测 Metarget ke…...

【3D目标检测】Det3d—SE-SSD模型训练(前篇):KITTI数据集训练

SE-SSD模型训练 1 基于Det3d搭建SE-SSD环境2 自定义数据准备2.1 自定义数据集标注2.2 训练数据生成2.3 数据集分割 3 训练KITTI数据集3.1 数据准备3.2 配置修改3.3 模型训练 1 基于Det3d搭建SE-SSD环境 Det3D环境搭建参考&#xff1a;【3D目标检测】环境搭建&#xff08;OpenP…...

k8s1.28.8版本安装prometheus并持久化数据

本文参考 [k8s安装prometheus并持久化数据_/prometheus-config-reloader:-CSDN博客](https://blog.csdn.net/vic_qxz/article/details/119598466)前置要求: 已经部署了NFS或者其他存储的K8s集群. 这里注意networkpolicies网络策略问题&#xff0c;可以后面删除这个策略&#x…...

网站图片列表怎么做/推广搜索引擎

一、设置默认参数 ES6之前&#xff0c;给函数设置默认参数是这样做的: function fn(a) {if(typeof y undefined){a a || hello;}console.log(a); } fn(hi); // hi fn(false); // false 这里之所以要判断一下&#xff0c;是因为我们本意是函数没有传值时才给参数 a 设置为…...

品牌餐饮加盟网站建设/油烟机seo关键词

IT在短短的十几年内&#xff0c;已经成为我国重要的经济增长点&#xff0c;国家更是大力扶持。目前&#xff0c;IT产业已经进入全产业IT化的时代&#xff0c;各个行业都在IT化、互联网化、信息化&#xff0c;这意味着你只要掌握了IT技术&#xff0c;就业范围将不会仅限于IT互联…...

网站论坛制作/郑州网站建设七彩科技

DevOps是一种实践方法&#xff0c;旨在保证高质量的前提下实现研发运维一体化&#xff0c;从而大幅缩短系统变更从提交到部署生产环境的时间。其中&#xff0c;持续集成是DevOps中非常重要的一环&#xff0c;它涉及集成多个开发人员的代码&#xff0c;并不断编译和测试&#xf…...

作业3 主题资源网站建设/产品推广的目的和意义

NGS建库试剂 一、基本信息&#xff1a; 1、产品名称&#xff1a;SynplSeq DNA Library Prep Kit for Illumina 2、货号及规格 3、保存条件&#xff1a;-20℃ 二、产品描述&#xff1a; 1、产品介绍 文库构建是NGS测序的关键环节。SynplSeq DNA Library Prep Kit for illu…...

济南软件开发培训机构/杭州网站seo价格

一次在使用json.dumps()过程中&#xff0c;出现错误提示&#xff1a;ERROR&#xff1a;"UnicodeDecodeError: utf8 codec cant decode byte 0xe1 in position 5: unexpected end of data"通过错误提示我们知道&#xff0c;肯定是编码问题&#xff0c;找到问题所在&am…...

中企动力网站建设方案/建设优化网站

有些网站图片做了防盗处理&#xff0c;这时可以通过伪造http_referer &#xff0c;让网站认为是网站内的访问之后把相应的内容保存下来&#xff01;步骤一&#xff1a;引入dll: /Files/xiachufeng/Interop.MSXML2.rar步骤二: 编写函数 /// <summary>/// 伪造http_refere…...