当前位置: 首页 > 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;&…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...