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客户端的整合(
Lettuce
和Jedis
) -
提供了
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的两种序列化实践方案,两种方案各有各的优缺点,可以根据实际情况选择使用。
方案一:
-
自定义RedisTemplate
-
修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
方案二:
-
使用StringRedisTemplate
-
写入Redis时,手动把对象序列化为JSON
-
读取Redis时,手动把读取到的JSON反序列化为对象
相关文章:

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

线性代数——行列式相关性质
目录 一、行列式与它的转置列行列式相等 二、对换行列式的两行(列),行列式变号 三、行列式某行(列)有公因子k,则k可以提到行列式外 四、行列式中若两行成比例,则行列式为0 五、行列式的某一行…...

跟着cherno手搓游戏引擎【5】layer(层)、Glad
编写基类层: 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无法登录管理路由器故障排查
问题描述 家里的路由器使用拨号上网,路由器DHCP分发IP的范围是192.168.1.0/24。默认使用192.168.1.1管理路由器。然后拨号上网成功后,修改了私网IP的分发范围:192.168.5.1-192.168.5.10。为了防止有人蹭网,只分配的10个IP地址。修…...

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

山脉数组的峰顶索引
一、题目描述 852. 山脉数组的峰顶索引 符合下列属性的数组 arr 称为 山脉数组 : arr.length > 3存在 i(0 < i < arr.length - 1)使得: 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验签, 将单独签名和联合签名出来的签名文件都试试. 验签成功后, 将签名数据明文写入了文件供查看. 也就是说, 只有验签成功后, 才能看到签名…...

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

力扣精选算法100题——水果成篮(滑动窗口专题)
本题链接👉水果成篮 第一步:了解题意 我就按照实例1来进行对这题的理解。 1代表种类类型,这个数组里面有2个种类类型 ps:种类1和种类2 ,只不过种类1是有2个水果,种类2有一个水果,共计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 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习疫情社交安全距离检测算法 ** 该项目较为新颖,适合作为竞赛…...

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 ,rip 2 是对 rip 1 的一种升级,rip 2 可以进行认证等功能 【命令】 新华三: [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中,引入了一个新的Composition API,旨在提供一种更灵活和可重用的方式来组织组件代码。Composition API基于函数式编程思想,允许开发者将逻辑和状态管理逻辑分离,使代码更加清晰和可维护。 二、Composition API…...

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

每日汇评:由于中东危机削弱了风险偏好,欧元将在1.0900附近波动
随着中东危机的加深,欧元兑美元面临大幅抛售; 由于高通胀,欧洲央行决策者推迟了市场对早期降息的预期; 市场将受到周三公布的美国零售销售数据的影响; 持续的中东紧张局势增强了对避险资产的吸引力,而风险感…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...