jedis、lettuce与redis交互分析

概念梳理:

redis是缓存服务器,jedis、lettuce都是Java语言下的redis客户端,用于与redis服务器进行交互。springboot项目中一般使用的是spring data redis,spring data redis依赖与jedis或lettuce,可以进行配置,默认使用的是lettuce。lettuce依赖了netty网络通信框架。

TCP协议:

Redis主要是以TCP协议对外提供服务,先来简单了解下TCP协议:

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,用于在网络上可靠地传输数据。以下是TCP协议的一些特性和工作原理的详细介绍:

  1. 面向连接:TCP在通信之前需要建立一个连接,通过三次握手来确保双方的通信可靠性。连接建立后,通信双方可以进行数据的可靠传输。

  2. 可靠性:TCP提供的传输是可靠的,通过序列号和确认应答机制来确保数据按顺序传输和不丢失。接收方会对收到的数据进行确认应答,发送方在收到确认应答后才会发送下一批数据。

  3. 流量控制:TCP使用滑动窗口机制来进行流量控制。接收方通过发送窗口大小告知发送方自己的接收能力,发送方根据接收方的窗口大小来控制发送的数据量,以避免数据的丢失和网络拥塞。

  4. 拥塞控制:TCP使用拥塞控制算法来避免网络拥塞的发生。通过动态调整发送方的发送速率和接收方的接收速率,以适应网络的状况,保持网络的稳定性和公平性。

  5. 双向通信:TCP是一种全双工的协议,即通信双方可以同时发送和接收数据,实现双向的数据传输。

TCP的工作原理如下:

  1. 连接建立:通信双方通过三次握手来建立连接。首先,客户端发送一个SYN(同步)报文给服务器,服务器收到后回复一个SYN-ACK(同步-确认)报文给客户端,客户端再发送一个ACK(确认)报文给服务器,完成连接的建立。

  2. 数据传输:连接建立后,通信双方可以通过发送和接收数据来进行通信。发送方将数据分割成适当大小的报文段,并添加序列号,然后通过IP协议将报文段发送给接收方。接收方收到报文段后进行确认应答,并按序重组数据。如果有丢失的报文段,接收方会要求发送方重新发送。

  3. 连接释放:当通信结束时,通信双方可以通过四次握手来释放连接。首先,一方发送一个FIN(结束)报文给对方,对方收到后回复一个ACK报文,表示收到了FIN报文。然后,对方也发送一个FIN报文给另一方,另一方收到后回复一个ACK报文,表示同意关闭连接。这样,连接就被正常释放了。

Redis管道模式:

Redis的管道(Pipeline)模式是一种优化Redis客户端与服务器之间交互的方式。它可以在减少网络往返延迟的同时提高命令的执行效率。

在传统的Redis交互模式中,客户端发送一个命令给服务器后,需要等待服务器完成该命令的执行并返回结果,然后才能发送下一个命令。这样的方式在需要执行多个命令时会存在较大的延迟。

而在管道模式下,客户端可以一次性发送多个命令给服务器,并在之后一次性接收服务器返回的结果。这样可以减少网络往返的次数,从而提高命令的执行效率。

具体的管道模式使用步骤如下:

  1. 创建管道:客户端通过调用Redis的管道命令(例如pipeline)创建一个管道。

  2. 发送命令:客户端可以通过调用管道对象的命令方法(例如setget等)来发送多个命令给服务器。这些命令会被缓存到管道中而不会立即执行。

  3. 执行命令:客户端通过调用管道对象的executesync方法来执行管道中的命令。在这一步,客户端会将管道中的命令一次性发送给服务器。

  4. 接收结果:客户端可以通过调用管道对象的相应方法(例如get_response)来一次性接收服务器返回的结果。这些结果与命令的发送顺序相对应。

通过使用管道模式,可以将多个命令一次性发送给服务器,减少了网络往返的次数,从而提高了命令的执行效率。管道模式尤其适用于需要批量处理命令或需要进行多个命令的批量操作的场景。

需要注意的是,管道模式虽然可以提高命令的执行效率,但也有一些潜在的问题,比如如果某个命令执行失败,整个管道的执行结果可能会受到影响。因此,在使用管道模式时需要注意异常处理和结果的正确性验证。

与redis交互时,jedis、lettuce有哪些相同之处?

1、这俩都是Java语言下的Redis客户端,用于与Redis服务器进行交互;

2、都支持同步和异步的命令执行方式;

3、内部都维护了线程池,负责与redis进行交互;

4、都支持连接池管理,都可以复用连接资源,以提高性能和效率。

先看下第3点。应用程序中的主逻辑线程通过异步调用的方式,把redis命令交给jedis或lettuce,jedis或lettuce中的线程池中的线程与redis交互完成之后,回调主逻辑线程,主逻辑线程再进行结果处理,这样可以保证主逻辑线程不被阻塞而可以继续干其他事情。

重点看下第4点。所谓的连接池是一个抽象概念,类似于线程池,只不过线程池管理的是线程的生命周期,而连接池管理的是连接的生命周期,但无论是连接池还是线程池都是为了复用,避免频繁资源的创建及销毁,提高性能。连接池里的一个连接是与Redis服务器建立的一个网络连接,包含了与Redis服务器通信所需的相关信息,如IP地址、端口号、认证信息等,可以理解为就是一个TCP连接。

无论是jedis还是lettuce,在于redis进行交互时,内部都使用了连接池技术,通过连接池可以实现连接的复用,避免了TCP连接的频繁创建及销毁,避免了一次次繁琐的三次握手及四次挥手。

在与redis交互中,jedis 与 lettuce有什么不同之处?

1、实现方式:Jedis是基于阻塞IO的方式实现的,而Lettuce是基于非阻塞IO和Reactive编程模型实现的。

2、连接方式:Jedis在每个线程中使用一个连接,而Lettuce使用基于Netty的连接池,可以在多个线程之间共享连接。

3、性能和效率:由于Lettuce使用了非阻塞IO和连接池的方式,相对于Jedis在高并发场景下具有更好的性能和效率。

这里重点分析下第2点。Jedis和Lettuce都有连接池,而且都可以实现连接复用的效果,这一点是前提。但是Lettuce的骚操作来了:Lettuce连接池中的一个连接可以在某个时刻同时被多个线程使用,而Jedis连接池中的连接每次只能被一个线程独占。所以Lettuce的连接池复用效果更好,性能更高,并发性更好。

以lettuc与redis的交互为例,进行流程梳理:

1、应用程序主逻辑线程调用Spring Data Redis提供的RedisTemplate或者ReactiveRedisTemplate进行Redis操作。

2、RedisTemplate会将操作转化为相应的Redis命令,并将命令提交给Lettuce线程池。

3、Lettuce线程池中的线程从任务队列中获取任务,并进行Redis命令的序列化。

4、序列化后的命令通过Netty的事件循环线程发送到Redis服务器。

5、Netty事件循环线程将命令发送给Redis服务器,并等待响应。

6、当Redis服务器处理完命令后,将响应返回给Netty事件循环线程。

7、Netty事件循环线程将响应数据反序列化,并将结果返回给Lettuce线程池中的线程。

8、Lettuce线程池中的线程将结果返回给应用程序主逻辑线程,完成Redis操作。

在这个过程中,应用程序主逻辑线程通过RedisTemplate提交任务给Lettuce线程池,Lettuce线程池使用线程从任务队列中获取任务并处理,最终通过Netty事件循环线程将命令发送到Redis服务器,并将响应结果返回给应用程序主逻辑线程。这种异步的线程交互方式可以提高并发性能和吞吐量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/139837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网AI MicroPython学习之语法 network网络配置模块

学物联网,来万物简单IoT物联网!! network介绍 模块功能: 用于管理Wi-Fi和以太网的网络模块参考用法: import network import time nic network.WLAN(network.STA_IF) nic.active(True) if not nic.isconnected():…

要找事做,我真怕被闲死

要找事做,我真怕被闲死 | 昨晚睡足了5个多小时,元气开始恢复,今晨6点钟醒来,如厕后无睡意,便窝在被子里闭目养神,同时想心事。 7点钟翻身起床穿衣洗刷后,烧瓶开水泡杯浓茶,打开电脑…

无人机航迹规划:五种最新智能优化算法(GRO、SWO、COA、LSO、KOA)求解无人机路径规划MATLAB

一、五种算法(GRO、SWO、COA、LSO、KOA)简介 1、淘金优化算法GRO 淘金优化算法(Gold rush optimizer,GRO)由Kamran Zolf于2023年提出,其灵感来自淘金热,模拟淘金者进行黄金勘探行为。VRPTW&am…

idea配置tomcat参数,防止nvarchar保存韩文、俄文、日文等乱码

描述下我的场景: 数据库服务器在远程机器上,数据库使用的Oracle,字符集是ZHS16GBK,但保存韩文、俄文、日文等字段A的数据类型是nvarchar(120),而nvarchar使用的是Unicode 编码,有点乱。。 遇到的问题&…

Thinkphp8 - 连接多个数据库

// 数据库连接配置信息connections > [mysql > [// 数据库类型type > mysql,// 服务器地址hostname > 127.0.0.1,// 数据库名database > thinkphp,// 用户名username > env(DB_USER, root),// 密码password >…

Java图像编程之:Graphics

一、概念介绍 1、Java图像编程的核心类 Java图像编程的核心类包括: BufferedImage:用于表示图像的类,可以进行像素级的操作。Image:表示图像的抽象类,是所有图像类的基类。ImageIcon:用于显示图像的类&a…

3、FFmpeg基础

1、FFmpeg 介绍 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库。 2、FFmpeg 组成 - libavformat:用于各种音视频[封装…

敏捷开发是什么?敏捷开发流程是怎么样的?

1. 什么是敏捷开发? 敏捷开发是一种迭代、增量式的软件开发方法,旨在通过灵活、协作和快速响应变化的方式,提高开发团队的效率和产品的质量。相较于传统的瀑布式开发模型,敏捷开发更加注重用户需求的响应和团队协作&#xff0…

tomcat+idea--如何在idea上发布项目

对应于idea2022以后的版本 (一)如何配置idea上的tomcat? 1、新建一个项目,左上角File,new,project,新建后就和普通的java项目一样。 2、然后点击项目名,右键选择“Add framework s…

JUL日志

文章目录 JUL日志JUL日志讲解Properties配置文件编写日志配置文件Lombok快速开启日志Mybatis日志系统 JUL日志 如果使用System.out.println来打印信息,项目中存在大量的控制台输出语句,会显得很凌乱,而且日志的粒度是不够细的,假…

汽车ECU的虚拟化技术初探(二)

目录 1.概述 2.U2A虚拟化方案概述 3.U2A的虚拟化功能概述 4.虚拟化辅助功能的使能 5.留坑 1.概述 在汽车ECU的虚拟化技术初探(一)-CSDN博客里,我们聊到虚拟化技术比较关键的就是vECU的虚拟地址翻译问题,例如Cortex-A77就使用MMU来进行虚实地址的转换…

C语言——贪吃蛇

一. 游戏效果 贪吃蛇 二. 游戏背景 贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 贪吃蛇起源于1977年的投币式墙壁游戏《Blockade》,后移植到各种平台上。具体如下: 起源。1977年,投币式…

KDE Plasma 6 将不支持较旧的桌面小部件

KDE Plasma 6 进行了一些修改,需要小部件作者进行调整。开发人员,移植时间到了! KDE Plasma 6 是备受期待的桌面环境版本升级版本。 最近,其发布时间表公布,第一个 Alpha 版本将于 2023 年 11 月 8 日上线&#xff0…

Elasticsearch概述

Elasticsearch(ES)是一个基于Lucene库构建的开源搜索引擎。它提供了一个分布式、多租户的全文搜索引擎,具有RESTful Web界面。Elasticsearch的主要特点包括: 分布式搜索引擎: Elasticsearch被设计为一个分布式系统&…

SpringCloud——负载均衡——OpenFeign

Feign是一个声明式的客户端接口,相比RestTemplate,更好的简化了微服务之间的调用方式。而且Feign默认集成了Ribbon,可以实现负载均衡。 1.OpenFeign与Feign OpenFeign在Feign的基础上支持SpringMVC的注解。OpenFeign的FeignClient可以解析Re…

NestJS——基于Node.js 服务器端应用程序的开发框架

文章目录 前言什么是 NestJS? 一、NestJS特性?二、使用步骤Typescript 知识后端开发基本知识新建项目目录结构 前言 Nestjs中文文档 什么是 NestJS? Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用…

HuggingFace模型头的自定义

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 在本文中我们将介绍如何使HuggingFace的模型适应你的任务,在Pytorch中建立自定义模型头并将其连接到HF模型的主体&#…

Web相机和浏览器的二维码扫描方案

Web相机和适用于浏览器的二维码扫描方案 qr-camera 在线体验 | English 功能 支持浏览器扫描二维码支持拍照支持录像功能支持二维码解析和生成 quickstart npm i qr-cameraimport {QRCamera} from qr-camera;function main(){const camera new QRCamera();document.body…

编写http接口api及接口自动化测试

片言 此文中代码都是笔者工作中源码,所以不会很完整,主要摘常见场景的api片段用以举例说明 另:此文主要针对自动化测试人员,尤其有python基础阅读更佳。 笔者使用 python3.6 postgresql10 flask 0.12 的环境 场景介绍 我们要实现后台…

如何导出PPT画的图为高清图片?插入到world后不压缩图像的设置方法?

期刊投稿的时候,需要图片保持一定的清晰度数,那么我们怎么才能从PPT中导出符合要求的图片呢? 对于矢量图绘图软件所画的图,直接导出即可。 而PPT导出的图片清晰度在60pi,就很模糊。 整体思路: PPT绘图——…