西塞山区建设局网站,呼和浩特制作网站,做知乎网站社区要多少钱,跨境网站有哪些概念梳理#xff1a;
redis是缓存服务器#xff0c;jedis、lettuce都是Java语言下的redis客户端#xff0c;用于与redis服务器进行交互。springboot项目中一般使用的是spring data redis#xff0c;spring data redis依赖与jedis或lettuce#xff0c;可以进行配置#x…概念梳理
redis是缓存服务器jedis、lettuce都是Java语言下的redis客户端用于与redis服务器进行交互。springboot项目中一般使用的是spring data redisspring data redis依赖与jedis或lettuce可以进行配置默认使用的是lettuce。lettuce依赖了netty网络通信框架。 TCP协议
Redis主要是以TCP协议对外提供服务先来简单了解下TCP协议
TCPTransmission Control Protocol是一种面向连接的、可靠的传输层协议用于在网络上可靠地传输数据。以下是TCP协议的一些特性和工作原理的详细介绍 面向连接TCP在通信之前需要建立一个连接通过三次握手来确保双方的通信可靠性。连接建立后通信双方可以进行数据的可靠传输。 可靠性TCP提供的传输是可靠的通过序列号和确认应答机制来确保数据按顺序传输和不丢失。接收方会对收到的数据进行确认应答发送方在收到确认应答后才会发送下一批数据。 流量控制TCP使用滑动窗口机制来进行流量控制。接收方通过发送窗口大小告知发送方自己的接收能力发送方根据接收方的窗口大小来控制发送的数据量以避免数据的丢失和网络拥塞。 拥塞控制TCP使用拥塞控制算法来避免网络拥塞的发生。通过动态调整发送方的发送速率和接收方的接收速率以适应网络的状况保持网络的稳定性和公平性。 双向通信TCP是一种全双工的协议即通信双方可以同时发送和接收数据实现双向的数据传输。
TCP的工作原理如下 连接建立通信双方通过三次握手来建立连接。首先客户端发送一个SYN同步报文给服务器服务器收到后回复一个SYN-ACK同步-确认报文给客户端客户端再发送一个ACK确认报文给服务器完成连接的建立。 数据传输连接建立后通信双方可以通过发送和接收数据来进行通信。发送方将数据分割成适当大小的报文段并添加序列号然后通过IP协议将报文段发送给接收方。接收方收到报文段后进行确认应答并按序重组数据。如果有丢失的报文段接收方会要求发送方重新发送。 连接释放当通信结束时通信双方可以通过四次握手来释放连接。首先一方发送一个FIN结束报文给对方对方收到后回复一个ACK报文表示收到了FIN报文。然后对方也发送一个FIN报文给另一方另一方收到后回复一个ACK报文表示同意关闭连接。这样连接就被正常释放了。 Redis管道模式
Redis的管道Pipeline模式是一种优化Redis客户端与服务器之间交互的方式。它可以在减少网络往返延迟的同时提高命令的执行效率。
在传统的Redis交互模式中客户端发送一个命令给服务器后需要等待服务器完成该命令的执行并返回结果然后才能发送下一个命令。这样的方式在需要执行多个命令时会存在较大的延迟。
而在管道模式下客户端可以一次性发送多个命令给服务器并在之后一次性接收服务器返回的结果。这样可以减少网络往返的次数从而提高命令的执行效率。
具体的管道模式使用步骤如下 创建管道客户端通过调用Redis的管道命令例如pipeline创建一个管道。 发送命令客户端可以通过调用管道对象的命令方法例如set、get等来发送多个命令给服务器。这些命令会被缓存到管道中而不会立即执行。 执行命令客户端通过调用管道对象的execute或sync方法来执行管道中的命令。在这一步客户端会将管道中的命令一次性发送给服务器。 接收结果客户端可以通过调用管道对象的相应方法例如get_response来一次性接收服务器返回的结果。这些结果与命令的发送顺序相对应。
通过使用管道模式可以将多个命令一次性发送给服务器减少了网络往返的次数从而提高了命令的执行效率。管道模式尤其适用于需要批量处理命令或需要进行多个命令的批量操作的场景。
需要注意的是管道模式虽然可以提高命令的执行效率但也有一些潜在的问题比如如果某个命令执行失败整个管道的执行结果可能会受到影响。因此在使用管道模式时需要注意异常处理和结果的正确性验证。 与redis交互时jedis、lettuce有哪些相同之处
1、这俩都是Java语言下的Redis客户端用于与Redis服务器进行交互
2、都支持同步和异步的命令执行方式
3、内部都维护了线程池负责与redis进行交互
4、都支持连接池管理都可以复用连接资源以提高性能和效率。
先看下第3点。应用程序中的主逻辑线程通过异步调用的方式把redis命令交给jedis或lettucejedis或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服务器并将响应结果返回给应用程序主逻辑线程。这种异步的线程交互方式可以提高并发性能和吞吐量。