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

Redis中的Java客户端

一、Jedis

Jedis是一个Java实现的Redis客户端连接工具。

Jedis使用非常简单,直接引入依赖。基于默认参数的Jedis连接池,初始化连接池类(使用默认连接池参数)JedisPool,获取一个Jedis连接Jedis jedis=jp.getResource()。

Jedis是线程不安全的,多线程使用同一个Jedis实例,会出现并发问题,原因是底层共用了一个输入输出流

1.1  Jedis快速入门

Jedis的官网地址: GitHub - redis/jedis: Redis Java client,我们先来个快速入门:

① 新建一个Maven工程并引入以下依赖  

<!--引入Jedis依赖-->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.2.0</version>
</dependency><!--引入单元测试依赖-->
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope>
</dependency>

② 编写测试类并与Redis建立连接

private Jedis jedis;@BeforeEach //被该注解修饰的方法每次执行其他方法前自动执行
void setUp(){// 1. 获取连接jedis = new Jedis("192.168.230.88",6379);// 2. 设置密码jedis.auth("132537");// 3. 选择库(默认是下标为0的库)jedis.select(0);
}

③ 编写一个操作数据的方法(这里以操作String类型为例)

@Test
public void testString(){// 1.往redis中存放一条String类型的数据并获取返回结果String result = jedis.set("url", "https://www.oz6.cn");System.out.println("result = " + result);// 2.从redis中获取一条数据String url = jedis.get("url");System.out.println("url = " + url);
}

④ 最后不要忘记编写一个释放资源的方法

    @AfterEach //被该注解修饰的方法会在每次执行其他方法后执行void tearDown(){// 1.释放资源if (jedis != null){jedis.close();}}

⑤ 执行testString()方法后测试结果如图所示

1.2  Jedis连接池

Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式

public class JedisConnectionFactory {private static final JedisPool jedisPool;static {//配置连接池JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(8);jedisPoolConfig.setMaxIdle(8);jedisPoolConfig.setMinIdle(0);jedisPoolConfig.setMaxWaitMillis(200);//创建连接池对象jedisPool = new JedisPool(jedisPoolConfig,"192.168.230.88",6379,1000,"132537");}public static Jedis getJedis(){return jedisPool.getResource();}
}

二、SpringDataRedis介绍

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis

官网地址:Spring Data Redis

  • 提供了对不同Redis客户端的整合(LettuceJedis

  • 提供了RedisTemplate统一API来操作Redis

  • 支持Redis的发布订阅模型

  • 支持Redis哨兵和Redis集群

  • 支持基于Lettuce的响应式编程

  • 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化

  • 支持基于Redis的JDKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

三、SpringDataRedis快速入门

SpringBoot已经提供了对SpringDataRedis的支持,使用非常简单

① 首先新建一个Spring Boot工程

② 然后引入连接池依赖

<!--连接池依赖-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

③ 编写配置文件application.yml(连接池的配置在实际开发中是根据需求来的)

spring:redis:host: 192.168.230.88 #指定redis所在的hostport: 6379  #指定redis的端口password: 132537  #设置redis密码lettuce:pool:max-active: 8 #最大连接数max-idle: 8 #最大空闲数min-idle: 0 #最小空闲数max-wait: 100ms #连接等待时间

④ 编写测试类执行测试方法

@SpringBootTest
class RedisDemoApplicationTests {@Resourceprivate RedisTemplate redisTemplate;@Testvoid testString() {// 1.通过RedisTemplate获取操作String类型的ValueOperations对象ValueOperations ops = redisTemplate.opsForValue();// 2.插入一条数据ops.set("blogName","Vz-Blog");// 3.获取数据String blogName = (String) ops.get("blogName");System.out.println("blogName = " + blogName);}
}

四、RedisSerializer配置

RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的

缺点:

  • 可读性差

  • 内存占用较大

那么如何解决以上的问题呢?我们可以通过自定义RedisTemplate序列化的方式来解决。

编写一个配置类RedisConfig :

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){// 1.创建RedisTemplate对象RedisTemplate<String ,Object> redisTemplate = new RedisTemplate<>();// 2.设置连接工厂redisTemplate.setConnectionFactory(factory);// 3.创建序列化对象StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 4.设置key和hashKey采用String的序列化方式redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setHashKeySerializer(stringRedisSerializer);// 5.设置value和hashValue采用json的序列化方式redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);return redisTemplate;}
}

此时我们已经将RedisTemplate的key设置为String序列化,value设置为Json序列化的方式,再来执行方法测试

由于我们设置的value序列化方式是Json的,因此我们可以直接向redis中插入一个对象

@Test
void testSaveUser() {redisTemplate.opsForValue().set("user:100", new User("Vz", 21));User user = (User) redisTemplate.opsForValue().get("user:100");System.out.println("User = " + user);
}

尽管Json序列化可以满足我们的需求,但是依旧存在一些问题。

如上图所示,为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。

那么我们如何解决这个问题呢?我们可以通过下文的StringRedisTemplate来解决这个问题。

五、StringRedisTemplate

为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。

Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程

我们可以直接编写一个测试类使用StringRedisTemplate来执行以下方法:

@SpringBootTest
class RedisStringTemplateTest {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Testvoid testSaveUser() throws JsonProcessingException {// 1.创建一个Json序列化对象ObjectMapper objectMapper = new ObjectMapper();// 2.将要存入的对象通过Json序列化对象转换为字符串String userJson1 = objectMapper.writeValueAsString(new User("Vz", 21));// 3.通过StringRedisTemplate将数据存入redisstringRedisTemplate.opsForValue().set("user:100",userJson1);// 4.通过key取出valueString userJson2 = stringRedisTemplate.opsForValue().get("user:100");// 5.由于取出的值是String类型的Json字符串,因此我们需要通过Json序列化对象来转换为java对象User user = objectMapper.readValue(userJson2, User.class);// 6.打印结果System.out.println("user = " + user);}}

执行完毕回到Redis的图形化客户端查看结果

六、总结

RedisTemplate的两种序列化实践方案,两种方案各有各的优缺点,可以根据实际情况选择使用。

方案一:

  1. 自定义RedisTemplate

  2. 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

方案二:

  1. 使用StringRedisTemplate

  2. 写入Redis时,手动把对象序列化为JSON

  3. 读取Redis时,手动把读取到的JSON反序列化为对象

相关文章:

Redis中的Java客户端

一、Jedis Jedis是一个Java实现的Redis客户端连接工具。 Jedis使用非常简单&#xff0c;直接引入依赖。基于默认参数的Jedis连接池&#xff0c;初始化连接池类&#xff08;使用默认连接池参数&#xff09;JedisPool&#xff0c;获取一个Jedis连接Jedis jedisjp.getResource()…...

线性代数——行列式相关性质

目录 一、行列式与它的转置列行列式相等 二、对换行列式的两行&#xff08;列&#xff09;&#xff0c;行列式变号 三、行列式某行&#xff08;列&#xff09;有公因子k&#xff0c;则k可以提到行列式外 四、行列式中若两行成比例&#xff0c;则行列式为0 五、行列式的某一行…...

跟着cherno手搓游戏引擎【5】layer(层)、Glad

编写基类层&#xff1a; Layer.h:提供Attach链接、Detach解绑、Update刷新、Event事件、GetName方法 #pragma once #include"YOTO/Core.h" #include"YOTO/Event/Event.h" namespace YOTO {class YOTO_API Layer{public:Layer(const std::string& nam…...

Windows无法登录管理路由器故障排查

问题描述 家里的路由器使用拨号上网&#xff0c;路由器DHCP分发IP的范围是192.168.1.0/24。默认使用192.168.1.1管理路由器。然后拨号上网成功后&#xff0c;修改了私网IP的分发范围&#xff1a;192.168.5.1-192.168.5.10。为了防止有人蹭网&#xff0c;只分配的10个IP地址。修…...

通义灵码 - 免费的阿里云 VS code Jetbrains AI 编码辅助工具

系列文章目录 前言 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;并针对阿里云 SDK/OpenAPI 的使用…...

山脉数组的峰顶索引

一、题目描述 852. 山脉数组的峰顶索引 符合下列属性的数组 arr 称为 山脉数组 &#xff1a; arr.length > 3存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] < arr[1] < ... arr[i-1] < arr[i] arr[i] > arr[i1] > .…...

openssl3.2 - 官方demo学习 - cms - cms_ver.c

文章目录 openssl3.2 - 官方demo学习 - cms - cms_ver.c概述运行结果笔记END openssl3.2 - 官方demo学习 - cms - cms_ver.c 概述 CMS验签, 将单独签名和联合签名出来的签名文件都试试. 验签成功后, 将签名数据明文写入了文件供查看. 也就是说, 只有验签成功后, 才能看到签名…...

数据结构:堆和堆排序

数据结构&#xff1a;堆和堆排序 文章目录 数据结构&#xff1a;堆和堆排序1.二叉树的存储结构1.顺序结构2.链式结构 2.堆3.堆的实现4.堆排序&#xff08;选择排序中的一类&#xff09;1. 基本思想2.代码实现 1.二叉树的存储结构 1.顺序结构 顺序结构存储就是使用数组来表示一…...

力扣精选算法100题——水果成篮(滑动窗口专题)

本题链接&#x1f449;水果成篮 第一步&#xff1a;了解题意 我就按照实例1来进行对这题的理解。 1代表种类类型&#xff0c;这个数组里面有2个种类类型 ps:种类1和种类2 &#xff0c;只不过种类1是有2个水果&#xff0c;种类2有一个水果&#xff0c;共计3个水果。 本题需要解…...

【提示学习论文六】MaPLe: Multi-modal Prompt Learning论文原理

文章目录 MaPLe: Multi-modal Prompt Learning 多模式提示学习文章介绍动机MaPLe:Multi-modal Prompt Learning 模型结构1、Deep Language Prompting 深度语言提示2、Deep Vision Prompting 深度视觉提示3、Vision Language Prompt Coupling 视觉语言提示耦合提示耦合过程 实验…...

wpf使用Popup封装数据筛选框

(关注博主后,在“粉丝专栏”,可免费阅读此文) 类似于DevExpress控件的功能 这是DevExpress的winform筛选样式,如下: 这是DevExpress的wpf筛选样式,如下: 这是Excel的筛选样式,如下: 先看效果 本案例使用wpf原生控件封装,功能基本上都满足,只是颜色样式没有写…...

微信小程序 - 视图与逻辑 介绍

文章目录 视图与逻辑一、页面导航1、页面导航 - 声明式导航1.1 导航到tabBar页面1.2 导航到非tabBar页面1.3 后退导航 2、页面导航 - 编程式导航2.1 导航到tabBar页面2.2 导航到非tabBar页面2.3 后退导航 3、页面导航 - 导航传参3.1 声明式导航传参3.2 编程式导航传参3.3 在 on…...

大创项目推荐 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习疫情社交安全距离检测算法 ** 该项目较为新颖&#xff0c;适合作为竞赛…...

c语言-库函数strstr()、strtok()、strerror()介绍

文章目录 前言一、库函数strstr()1.1 strstr()介绍1.2 strstr()模拟实现 二、库函数strtok()2.1 strtok()介绍 三、库函数strerror()3.1 strerror()介绍 总结 前言 本篇文章介绍c语言库函数strstr()、strtok()、strerror()的使用。 一、库函数strstr() 1.1 strstr()介绍 str…...

RIP【新华三与华为区别】

【介绍】 rip分为rip 1 与 rip 2 &#xff0c;rip 2 是对 rip 1 的一种升级&#xff0c;rip 2 可以进行认证等功能 【命令】 新华三&#xff1a; [HC3-R1] rip #启用rip [HC3-R1-rip] version 2 #告知rip 版本号 [HC3-R1-rip] network 192.168.1.0 #宣告其网段 [HC3-R1-rip] …...

Python从入门到精通秘籍四

Python速成,知识点超详细,跟着这个系列边输入边学习体会吧! 一、Python的判断语句的综合案例 下面是一个使用代码示例来详细说明Python判断语句的综合案例,通过用户输入来实现简单的登录验证: # 提示用户输入用户名和密码 username = input("请输入用户名:")…...

rk3568下SoftBusDumpDeviceInfo执行错误—鸿蒙开发已解决

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了rk3568下SoftBusDumpDeviceInfo执行错误的问题。 命令行运行 SoftBusDumpDeviceInfo,测…...

Vue 3 Composition API 详解

一、引言 在Vue 3中&#xff0c;引入了一个新的Composition API&#xff0c;旨在提供一种更灵活和可重用的方式来组织组件代码。Composition API基于函数式编程思想&#xff0c;允许开发者将逻辑和状态管理逻辑分离&#xff0c;使代码更加清晰和可维护。 二、Composition API…...

API设计:从基础到最佳实践

1*vWvkkgG6uvgmJT8GkId98A.png 在这次深入探讨中&#xff0c;我们将深入了解API设计&#xff0c;从基础知识开始&#xff0c;逐步进阶到定义出色API的最佳实践。 作为开发者&#xff0c;你可能对许多这些概念很熟悉&#xff0c;但我将提供详细的解释&#xff0c;以加深你的理解…...

每日汇评:由于中东危机削弱了风险偏好,欧元将在1.0900附近波动

随着中东危机的加深&#xff0c;欧元兑美元面临大幅抛售&#xff1b; 由于高通胀&#xff0c;欧洲央行决策者推迟了市场对早期降息的预期&#xff1b; 市场将受到周三公布的美国零售销售数据的影响&#xff1b; 持续的中东紧张局势增强了对避险资产的吸引力&#xff0c;而风险感…...

STM32 HAL库驱动NRF24L01避坑指南:SPI时钟配置、引脚命名那些容易出错的地方

STM32 HAL库驱动NRF24L01实战避坑手册&#xff1a;从SPI配置到中断处理的深度解析 当你在深夜的实验室里盯着示波器上杂乱的SPI波形&#xff0c;或是面对编译器抛出的"undefined reference"错误时&#xff0c;是否曾怀疑过NRF24L01这个看似简单的2.4GHz射频模块为何如…...

熬夜改论文?2026年一键生成论文工具排行榜权威发布,一次过审不是梦!

写论文效率低、熬夜赶稿、查重不过关&#xff1f;别慌&#xff01;2026 年最新 AI 论文写作工具合集来了&#xff0c;覆盖选题、大纲、初稿、润色、降重、格式、文献引用全流程&#xff0c;帮你精准匹配最适合的学术助手&#xff0c;彻底告别论文内耗&#xff01;&#x1f3c6;…...

混合数据聚类算法实战:k-prototypes深度解析与应用

混合数据聚类算法实战&#xff1a;k-prototypes深度解析与应用 【免费下载链接】kmodes Python implementations of the k-modes and k-prototypes clustering algorithms, for clustering categorical data 项目地址: https://gitcode.com/gh_mirrors/km/kmodes kmodes…...

(毕业必看)实测好用的一键生成论文工具,毕业生收藏备用

毕业季论文写作真的太难了吗&#xff1f;选题卡壳、文献找不全、写起来没思路、查重反复修改、格式总出错…… 这份实测好用的AI论文工具合集&#xff0c;涵盖中英文写作、全流程辅助、专项功能、免费与高性价比类型&#xff0c;从开题到定稿全程帮你搞定&#xff0c;毕业生快收…...

基于随机森林的加州房价二分类实验

一、加州房价数据集介绍 本实验使用模拟加州房价数据集完成随机森林二分类任务&#xff0c;通过构建房屋特征与房价等级的映射关系&#xff0c;实现房价高低二分类预测&#xff0c;掌握随机森林集成学习算法、模型评估、特征重要性分析与参数调优方法。 数据集简介 数据集名称&…...

测试工程师用 Claude :它修得了选择器,修不了你的需求理解

测试架构这行有个一直没解决的尴尬:开发一周能写完的功能,QA 写测试要追两周。 你越想把覆盖率补齐,这个口子张得越大。 所以当 Claude Code 加上 Playwright 这套东西开始能"自己写测试"的时候, QA 圈子是真的盯着看。但我想先泼一句:它确实改变了一些事, 但改变的…...

在不同网络环境下测试Taotoken API端点的连接稳定性与路由表现

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在不同网络环境下测试Taotoken API端点的连接稳定性与路由表现 对于依赖大模型API进行开发的团队而言&#xff0c;服务的连接稳定性…...

黑苹果配置终极简化:OpCore Simplify三步搞定OpenCore EFI

黑苹果配置终极简化&#xff1a;OpCore Simplify三步搞定OpenCore EFI 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置而烦恼吗…...

100行代码实现扩散模型:PyTorch版终极入门指南

100行代码实现扩散模型&#xff1a;PyTorch版终极入门指南 【免费下载链接】Diffusion-Models-pytorch Pytorch implementation of Diffusion Models (https://arxiv.org/pdf/2006.11239.pdf) 项目地址: https://gitcode.com/gh_mirrors/di/Diffusion-Models-pytorch 你…...

AI 协同革命背后:多智能体系统的失控风险

子玥酱 &#xff08;掘金 / 知乎 / CSDN / 简书 同名&#xff09; 大家好&#xff0c;我是 子玥酱&#xff0c;一名长期深耕在一线的前端程序媛 &#x1f469;‍&#x1f4bb;。曾就职于多家知名互联网大厂&#xff0c;目前在某国企负责前端软件研发相关工作&#xff0c;主要聚…...