Spring Data Redis切换底层Jedis 和 Lettuce实现
1 简介
Spring Data Redis是 Spring Data 系列的一部分,它提供了Spring应用程序对Redis的轻松配置和使用。它不仅提供了对Redis操作的高级抽象,还支持Jedis和Lettuce两种连接方式。
可通过简单的配置就能连接Redis,并且可以切换Jedis和Lettuce两个连接方式。下面先来看看我们该如何使用它。
2 使用
2.1 引入Redis依赖
使用Spring Boot 提供的spring-boot-starter-data-redis依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>3.1.0</version>
</dependency>
2.2 自定义配置类
自定义配置类,用于设置Key和Value的序列化。
@Configuration
public class RedisTemplateConfig {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());return redisTemplate;}
}
2.3 修改Redis连接配置
配置由Spring Boot提供,如果不改,会使用默认配置。支持单节点、哨兵模式和集群模式,可自由切换。
spring:data:redis:host: localhostport: 6379database: 1
2.4 使用RedisTemplate
注入RedisTemplate后,就可操作Redis。
RedisTemplate有两个泛型:
- K表示Redis中的Key值类型,一般 String 类型
- V表示Redis中的Value值类型,V可以是一个对象
@SpringBootTest
public class RedisTemplateTest {@Resourceprivate RedisTemplate<String, String> redisTemplate;@Testpublic void test_set() {redisTemplate.opsForValue().set("test-key", "test-value");}@Testpublic void test_get() {String value = redisTemplate.opsForValue().get("test-key");System.out.println(value);}
}
3 源码分析
从使用来看,不知道用Jedis or Lettuce或如何切换。
3.1 Redis自动配置类:RedisAutoConfiguration
熟悉Spring Boot家族的组件时,一般从它的自动配置类开始,Redis自动配置类RedisAutoConfiguration:
它引入两个连接Redis配置类:
- Lettuce使用LettuceConnectionConfiguration
- Jedis使用JedisConnectionConfiguration
3.2 Lettuce连接配置类:LettuceConnectionConfiguration
条件注解控制当前配置类能否生效:
- @ConditionalOnClass:指定一个或多个目标类,若目标类在类路径下能找到,则当前配置类生效;只要有一个目标类未找到,则不生效
- @ConditionalOnProperty:通过与配置文件的配置项,进行匹配来控制是否生效
这两个条件注解,只要有一个不生效,则当前配置类不生效。当该配置类生效后,会使用Lettuce相关依赖,来生成一个RedisConnectionFactory的Bean,用于获取Redis连接。
package org.springframework.boot.autoconfigure.data.redis;@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisClient.class)
@ConditionalOnProperty(name = "spring.data.redis.client-type", havingValue = "lettuce", matchIfMissing = true)
class LettuceConnectionConfiguration extends RedisConnectionConfiguration {...
}
io.lettuce.core.RedisClient类能找到,说明已引入Lettuce相关依赖。spring-boot-starter-data-redis确实就有lettuce-core依赖,即 Spring Data Redis 默认用Lettuce。
3.3 Jedis连接配置类:JedisConnectionConfiguration
同理,会校验类路径中是否有Jedis相关依赖类。
同样该配置类生效后,会使用Jedis相关依赖,来生成一个RedisConnectionFactory的Bean,用于获取Redis连接。
该类中还有一个注解@ConditionalOnMissingBean,用于保证只有一个RedisConnectionFactoryBean被注入。
redis.clients.jedis.Jedis类未找到,即无Jedis相关依赖包,则当前配置类无效。
3.4 如何将连接方式切换为Jedis
有两种方式,但前提条件是先引入Jedis相关依赖。
① 利用@ConditionalOnClass注解
排除Lettuce依赖,只保留Jedis依赖。通过@ConditionalOnClass注解的校验,切换成Jedis。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions>
</dependency>
② 利用@ConditionalOnProperty注解
不排除Lettuce的依赖,即这两种方式的依赖同时存在。
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>
通过@ConditionalOnProperty注解的校验,将配置spring.redis.client-type设为jedis,这样也可以切换至Jedis方式。
③ 评估
第一种优点:不加载多余的依赖包,推荐。
第二种优点:可通过修改配置文件,自由切换连接方式。
本文由博客一文多发平台 OpenWrite 发布!
相关文章:

Spring Data Redis切换底层Jedis 和 Lettuce实现
1 简介 Spring Data Redis是 Spring Data 系列的一部分,它提供了Spring应用程序对Redis的轻松配置和使用。它不仅提供了对Redis操作的高级抽象,还支持Jedis和Lettuce两种连接方式。 可通过简单的配置就能连接Redis,并且可以切换Jedis和Lett…...

wireshark自定义协议插件开发
目录 脚本代码 报文显示 脚本代码 local NAME "test" test_proto Proto("test", "test Protocol") task_id ProtoField.uint16("test.task_id", "test id", base.DEC) cn ProtoField.uint8("test.cn", &qu…...

一文读懂MongoDB的全部知识点(1),惊呆面试官。
文章目录 01、mongodb是什么?02、mongodb有哪些特点?03、你说的NoSQL数据库是什么意思?NoSQL与RDBMS直接有什么区别?为什么要使用和不使用NoSQL数据库?说一说NoSQL数据库的几个优点?04、NoSQL数据库有哪些类型?05、M…...

仅仅通过提示词,GPT-4可以被引导成为多个领域的特定专家
The Power of Prompting:提示的力量,仅通过提示,GPT-4可以被引导成为多个领域的特定专家。微软研究院发布了一项研究,展示了在仅使用提策略的情况下让GPT 4在医学基准测试中表现得像一个专家。研究显示,GPT-4在相同的基…...

23.Oracle11g的UNDO表空间
Oracle的UNDO表空间 一、UNDO表空间概述1、什么是UNDO表空间2、UNDO表空间的作用2.1 提供一致性读2.2 回滚事务2.3 实例恢复 3、UNDO表空间的工作机制 二、UNDO表空间的相关操作1、UNDO表空间的创建2、UNDO表空间的管理 三、Oracle 11g中UNDO表空间的新特性1、UNDO表空间自动管…...

Mybatis 操作续集2(结合上文)
Mybatis 是一个持久层框架,用于简化数据库的操作,和Spring 没有任何关系,我们现在能使用它是因为 Spring Boot 把Mybatis 的依赖给引入进来了,在 pom.xml 里面 Mybatis 如何进行重命名? 看最后两行代码,这样就能重命名了 package com.example.mybatisdemo.mapper;import com…...

LangChain 19 Agents Reason+Action自定义agent处理OpenAI的计算缺陷
LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…...

12.整数转罗马数字
C不能像Python那样使用c*num的形式,重复字符,老老实实减吧。 class Solution { public:string intToRoman(int num) {string ans "";int res num;while (res ! 0) {if (res > 1000) {ans M;res - 1000;} else if (res > 900) {ans …...

免费AI洗稿软件【2023最新】
很多时候我们需要通过文字来表达观点、推广产品或服务。然而,长时间的文稿创作不仅费时费力,还容易陷入表达瓶颈。许多写手和从业者纷纷寻找一款方便、高效的AI洗稿工具。 文心一言洗稿软件。这款软件以其独特的文风生成和洗稿功能而备受瞩目。用户只需…...

PTA:平方回文数
题干 在数学里面,有一种数字正着读和反着读结果都一样,我们把这种数称为回文数。如果一个回文数,它同时还是某一个数的平方,这样的数字叫做平方回数。 本题要求输出小于正整数N的所有平方回数。 (注:个位数…...

从“AI证件照”到“AI译制片”,爆款AIGC应用的商业化迷思
让郭德纲飙英文、让霉霉说中文的翻译视频生成工具HeyGen和掀起AI证件照热潮的“妙鸭相机”一样,在一阵疯狂刷屏之后,又迅速在各大群里销声匿迹了。 十月份,由HeyGen制作的各种明星跨语言翻译视频,在全网疯传,大家震撼于…...

JAVA代码优化:Easy Excel(操作Excel文件的开源工具)
Easy Excel官网: EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com) https://easyexcel.opensource.alibaba.com/ Easy Excel的特点和优势: 简单易用:Easy Excel提供了简洁的API,使用起来非常方便。开发…...

Linux Python ping3库使用教程(ping3命令、ping命令)
文章目录 Linux Python ping3库使用教程1. 环境准备2. ping3库安装3. ping3基本使用4. ping3进阶使用5. 常见问题解答5.1 ping3库可以在Windows系统中使用吗?5.2 如何处理ping操作超时的情况?5.3 ping3库支持IPv6吗? Linux Python ping3库使用…...

分享一些基于php商城案例
案例1: http://www.9520.xin/ 案例2: http://ptll.hasbuy.com/ 案例3: http://likeshop.9520.xin/mobile 案例4: http://www.hasbuy.com/...

SpringSecurity 三更草堂 学习笔记
SpringSecurity从入门到精通 0. 简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的…...

基于Java SSM仓库管理系统
企业仓库有多个库房,用来分别存放生产需要的各种零件,仓库管理系统对此进行科学的管理。仓库管理系统管理的对象及操作如下: 管理员信息:工号、姓名、性别、年龄、电话、工资等。 库房信息:编号、地址、面积等。 零件信…...

基于Spark对消费者行为数据进行数据分析开发案例
原创/朱季谦 本文适合入门Spark RDD的计算处理。 在日常工作当中,经常遇到基于Spark去读取存储在HDFS中的批量文件数据进行统计分析的案例,这些文件一般以csv或者txt文件格式存在。例如,存在这样一份消费者行为数据,字段包括消费…...

Docker镜像制作与推送
目录 Docker镜像制作 搭建私服 将本地镜像推送到私有库 Docker镜像制作 以创建一个新ubuntu镜像,并安装vim命令示例 运行一个ubuntu镜像,发现在镜像里面无法使用vim命令,因为该ubuntu镜像只包括了其最基本的内核命令 [rootlocalhost ~]…...

Pandas时序数据分析实践—基础(1)
目录 1. Pandas基本结构2. Pandas数据类型2.1. 类型概述2.1.1. 整数类型(int):2.1.2. 浮点数类型(float):2.1.3. 布尔类型(bool):2.1.4. 字符串类型(object&a…...

5.C转python
新始: 13.列表可被改变(数据),元组不可被改变(数据),二者皆与C中的数组的大致相同 14.创建列表方法: 1.一个[ ]就是一个空的列表 2.使用list函数来创建列表 如: 15.可以在[ ]内部指定列表的初始值,打印方法: 如: 16.在python中,在同一个列表中,可以放不同类型的变量(也可…...

输出SearchFacesResponse对象的JSON格式字符串回包乱码解决方案
输出SearchFacesResponse对象的JSON格式字符串设置响应内容类型为"application/json;charsetutf-8"获取响应的字符输出流将SearchFacesResponse对象转化为JSON字符串并输出。 代码片段 System.out.println(SearchFacesResponse.toJsonString(resp)); response.setC…...

P7 链表 链表头前方插入新节点
目录 前言 01 链表头插入数据 示例代码 02 指定节点前方插入新节点 测试代码 前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C》✨✨✨ 🔥 推荐专栏2: 《 Linux C应用编程(概念类)_ChenPi的博客-CSDN博客》✨…...

SCAU:主对角线上的元素之和
主对角线上的元素之和 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC 描述 输入一个3行4列的整数矩阵,计算并输出主对角线上的元素之和输入格式 3行4列整数矩阵输出格式 主对角线上的元素之和输入样例 1 2 3 4 5 6 7 8 9 10 11 12输出…...

c语言——简单客户端demo
以下是一个简单的C语言客户端示例,用于连接到服务器并发送和接收数据: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h…...

日志检索场景ES->Doris迁移最佳实践:函数篇
函数列表 函数:term函数功能说明:查询某个字段里含有某个关键词的文档参数说明:返回值说明:ES使用示例: {"query": {"term": {"title": "blog"}} }Doris使用示例…...

【高效开发工具系列】jackson入门使用
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

深入理解网络非阻塞 I/O:NIO
🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…...

Hdoop学习笔记(HDP)-Part.07 安装MySQL
目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …...

[数据结构]HashSet与LinkedHashSet的底层原理学习心得
我们区分list和set集合的标准是三个:有无顺序,可否重复,有无索引。 list的答案是:有顺序,可重复,有索引。这也就是ArrayList和LinkedList的共性 set的答案是:顺序内部再区分,不可以重复…...

使用unity开发Pico程序,场景中锯齿问题
1、问题 使用unity【非HDR】开发Pico程序,场景中锯齿问题,设置了unity的抗锯齿和渲染方式,及悬挂抗锯齿的脚本,都不能很好的解决项目中图片、文字的锯齿问题,通过摸索找到了妥善的方法 1、修改项目中图片的 GenerateMIpMaps 为勾…...