Jedis详解

article/2025/10/13 11:47:05

因为工作的需要,底层同事对Redis进行了部分改造,增加了几个命令,对应着也就需要对Jedis进行部分修改,于是就把Jedis相关的代码读了一遍,发现其设计还是非常简单但又巧妙使用。

通常而言,我们对于Redis集群的操作通常来讲不会真正对应多个节点,而是由底层单独分片处理,换句话说我们应用程序对应的节点是一个,因此我们目前主要用的是JedisPool的方式,而很少会采用JedisCluster的方式。

下面的解释也主要是对上述的方式进行说明。

Jedis操作主要涉及到的类:JedisPool、Jedis、Client、BinaryClient、Connection等,下面是对其处理过程的简要记录。

1、Connection类是使用原生的Socket进行连接,下面是连接的代码:

从代码中可以很清晰的看到,使用的是原生Socket进行处理(换句话说,这种没有使用netty的方式不见得多稳定),另外我们也可以看到每个Connection对应了一个输入流和输出流,结合Redis是单线程的处理机制,我们会发现Jedis的处理很巧妙。

2、下面是JedisPool的定义:

我们发现它其实用的是Pool,Pool是啥?Pool其实是apache提供的一种池子的管理工具,像数据库连接池也有很多用这个的。

我们在使用JedisPool的时候通常是用getResource()方法获取到一个可操作的连接:

其实我们获取到的是一个Jedis对象,那么肯定有一个疑问,那就是Pool里面到底存储的是什么,它是怎么存储的?首先可以确认,肯定是存储的Jedis,从Pool<Jedis>这种泛型的使用方式也是可以看出的。那么在Pool对象里面是怎么存储Jedis对象的呢?

通过代码查看我们可以知道:其实最终存储在Pool里面的是:

SoftReference<T>这个类熟悉的童鞋可能会了解,它是JDK自带的一个类,说的比较玄乎,是一个软连接的类,其实就是说这个对象引用不是强引用,比较容易被GC掉。

SoftReference<T>这个类继承自Reference<T>,我们跟踪一下会发现最终存储的是一个Queue:

我们再回来深入看一下getResource的代码,也就是看一下super.getResource(),可以看出最终其实是由apache的pool实现的:

同时,我们发现其实还有一个和它并列的方法:

这样我们就可以猜测,其实是一个队列的获取操作,那么里面的参数(borrowMaxWaitMillis)也就是借用时间了,换句话说就是多长时间可以从队列中获取到对象。下面是这部分的主要实现代码:

代码太多,就不全部截取了,其中p只是一个临时变量,实际的队列其实是idleObjects,它是一个链表实现的双向阻塞队列:

3、获取到Jedis对象之后,剩下的其实就是Jedis的操作,以set方法为例:

我们会发现它主要是两个操作:一个是set,一个是getStatusCodeReply。这就是我们所说的Jedis设计巧妙之处,根据我们一般的理解,都是发送一个命令,然后等待应答,换句话说就是阻塞的处理方式。我们从Jedis的处理中发现,其实不是,它的发送和它的接收是分开处理的,当然这种分开处理指的是代码,其实本质上并没有分开。

首先看一下set命令的处理:

Jedis中set命令其实是Client执行的过程,而Client的处理其实是调用的BinaryClient的处理,BinaryClient都是使用byte[]与Redis进行交互,因此更具有普遍性。下面是BinaryClient的处理过程:

它调用的是sendCommand方法,该方法是由最开始我们建立的那个Connection实现的,如下:

从代码中我们可以看出,其实最终调用的是Protocol.sendCommand命令,如下:

RedisOutputStream其实也是一种流,它继承自FilterOutputStream,主要是改动就是为了适应Redis的协议,增加了一些变量的处理:

同时,为了保证安全期间,它被定义为一个final类,不允许被继承。

接着上述的Protocol.sendCommand命令,这个命令的执行其实没有flush,也就是说可能会出现写入不完整的问题,作者肯定不会犯这种低级的错误,所以在后面的那个getStatusCodeReply方法中,它是这样实现的:

它首先flush了一下,以保证其全部写入,然后是进行read,readProtocolWithCheckingBroken()方法如下:

最终还是调用的Protocol,也就是对输入流的一种读取操作。

最终从InputStream中读出的数据就是应答的结果。Jedis在实现的时候区分了多种应答情况,有的应答是状态(OK)、(NIL)、(ERROR)等,有的应答是数字,也有的应答是结果(Value),对应着不同的方法。

 

上面就是Jedis的基本处理过程,其实很简单,相信大家看了之后也可以自己写一个了,下面附上几张Jedis中的UML图,其中带ExtensionXXX的是我因为需求加的,源码中肯定没有。

Jedis:

Client:

BinaryClient


http://chatgpt.dhexx.cn/article/akKBvBLv.shtml

相关文章

Jedis简介

Jedis用于java语言连接redis服务&#xff0c;并提供对应的操作API 一、准备工作 (1)jar包导入 下载地址&#xff1a;https://mvnrepository.com/artifact/redis.clients/jedis 基于maven <dependency> <groupId>redis.clients</groupId> <artifactId&…

jedis介绍

jedis是redis的java版本的客户端实现。下面演示jedis的相关操作&#xff1a;      首先在eclipse新建动态web工程&#xff1a;            将jedis所需的jar包导入到工程中&#xff1a;            编写Java代码测试连通性&#xff1a; import …

jedis相关详解

一、jedis是什么&#xff1f; Jedis是redis的java版本的客户端实现&#xff0c;使用Jedis提供的Java API对Redis进行操作&#xff0c;是Redis官方推崇的方式&#xff1b;并且&#xff0c;使用Jedis提供的对Redis的支持也最为灵活、全面&#xff1b;不足之处&#xff0c;就是编…

Redis 客户端:Jredis 和 spring-data-redis 整合

因为我使用的是 java &#xff0c;所以我学习的是java 的客户端 &#xff1a;Jredis 。整合结合自己的项目&#xff0c;把 Jredis 的客户端整合一下。 我们整合需要的工具&#xff1a; Redis Serviceredis.clients.jedis 2.9.0 &#xff08;java 客户端链接redis&#xff09;…

Redis使用教程(一)

Redis:单线程、高读写 redis数据库初识 Redis 简介 Redis 的安装配置 Redis 的常见操作 Redis 的数据类型 Redis 的事务控制 Java 操作 Redis 数据库 Redis简介 redis的作用 Redis:REmote DIctionary Server( 远程字典服务器 ) 是完全开源免费的&#xff0c;用 C 语言编写的…

html如何隐藏input,html如何让input隐藏

隐藏方法&#xff1a;1、设置input标签 type属性的值为“hidden”&#xff1b;2、利用input标签的style属性&#xff0c;添加“display:none”样式&#xff1b;3、利用input标签的style属性&#xff0c;添加“visibility:hidden”样式。 本教程操作环境&#xff1a;windows7系统…

使用java实现杨辉三角的输出

案例&#xff1a;杨辉三角 实现代码 结果输出

【Java】 杨辉三角 二维数组打印杨辉三角

Tips 打印三角的操作 : 每行打印前预留空格打印指定数量的星号后换行重复循环打印直至完成所有打印结果 杨辉三角: 三角规律空格最大对称值为 5 大于 5 则会变形三角规律为当前值为上一个值加上前一个值 首尾的数字值相等参考二维数组的规律生成数值 import java.util.Sca…

java输出杨辉三角(等腰三角形版)

网上转了一圈&#xff0c;各种形式都有&#xff0c;给出一种不用那些啥制表符的等腰三角形版本 杨辉三角 杨辉三角形各行的系数满足以下的规律&#xff1a; ①各行第一个数都是1&#xff1b; ②各行最后一个数都是1&#xff1b; ③从第3行起&#xff0c;除上面指出的第一个数…

用Java编写杨辉三角的几种实现方式

一、前言 最近在学习java&#xff0c;遇到了杨辉三角的编程代码题&#xff0c;这是一道经典的面试题&#xff0c;在经过网上搜索和老师的讲解之后&#xff0c;于是想把代码贴出来&#xff0c;分析一下思路。 二、杨辉三角 1.直角杨辉三角 2.等腰杨辉三角 这就是两种杨辉三角…

JAVA杨辉三角的详细解释

近期java面试题中总会出现算法题&#xff0c;最近我看到了很多杨辉三角的面试题&#xff0c;自己当时手写也没分析好思路&#xff0c;在网上听老师一讲于是就写出来了&#xff0c;今天把代码贴出来看下&#xff0c;思路分析下; 首先看下排列的结果&#xff1a; 可以很清楚的看…

Java实现杨辉三角形

一&#xff1a;前言 实现杨辉三角&#xff0c;需要知道什么是杨辉三角。如下图&#xff0c;就是两种杨辉三角。这两种杨辉三角形是目前最常见的&#xff1a; &#xff08;1&#xff09;等边形状的杨辉三角 &#xff08;2&#xff09;直角形状的杨辉三角 二、杨辉三角形的规…

Java代码实现杨辉三角

一、杨辉三角的概念 杨辉三角是二项式系数在三角形中的一种几何排列&#xff0c;南宋数学家杨辉在《详解九章算法》中有记载&#xff0c;欧洲的帕斯卡也发现这一规律&#xff0c;故又称帕斯卡三角形&#xff0c;比杨辉晚几百年发现该规律 二、杨辉三角的特性 他的两条斜边都是…

杨辉三角形Java实现

一、杨辉三角形的特点 &#xff08;1&#xff09;每个数等于它上方两数之和。 &#xff08;2&#xff09;每行数字左右对称&#xff0c;由1开始逐渐变大。 &#xff08;3&#xff09;第n行的数字有n项。 &#xff08;4&#xff09;前六行的杨辉三角形如图&#xff1a; 二、J…

Java解决杨辉三角问题(这里提供了两种方法)

杨辉三角作为一个数学问题&#xff0c;所以我们在做这道题的时候可以用数学思维将其解决。 下面我将我的实现代码和测试结果附上&#xff1a; package practice;/*** 杨辉三角问题*/ public class Yanghuisanjiao {public static void main(String[] args) {print1(25);print2(…

基于Java的杨辉三角

直角杨辉三角 杨辉三角的规律是每行数字的第一列和最后一列的数字都是1&#xff0c;从第三行开始&#xff0c;除去第一列和最后一列都为数字1以外&#xff0c;其余每列的数字都等于它上方两个数字之和。例如下面图片中7字形圈起来的&#xff1a;4 3 1、35 15 20。 代码实…

杨辉三角形(Java版)

不为失败找理由&#xff0c;只为成功找方法。所有的不甘&#xff0c;因为还心存梦想&#xff0c;所以在你放弃之前&#xff0c;好好拼一把&#xff0c;只怕心老&#xff0c;不怕路长。 文章目录 1. 什么是杨辉三角形2. 实现思路&#xff08;方式&#xff09;2.1 递归方式2.2 递…

JAVA实现杨辉三角的三种方式

一、前言 既然是实现杨辉三角&#xff0c;就要知道什么是杨辉三角。如下图&#xff0c;就是两种杨辉三角。 &#xff08;1&#xff09;等边形状的杨辉三角 &#xff08;2&#xff09;直角形状的杨辉三角 在知道这两种都是杨辉三角之后&#xff0c;我们就来实现利用java语言打…

杨辉三角(Java)

实现思路&#xff1a;我们可以先把杨辉三角想象成一个空的二维数组&#xff0c;然后再给它赋值输出即可。 关键在于如何赋值&#xff1a;仔细观察上图可以得出除了每一行第一个数以及最后一个数&#xff08;都是1&#xff09;&#xff0c; 中间的数字规律就是&#xff1a;a[ i …

Java:杨辉三角

键盘录入数字n&#xff0c;输出n行杨辉三角&#xff08;Java&#xff09; 文章目录 前言一、杨辉三角是什么&#xff1f;二、代码拆分解释三、代码运行和结果 1.代码运行2.结果 前言 编写杨辉三角的程序会用到金字塔输出的知识点&#xff0c;点下面连接查看。输入一个整数n&…