一文带你搞懂redis通道

redis管道

Redis是一种基与客户端-服务端模型以及请求/响应协议的TCP服务。这意味着一个请求遵循以下两个步骤:

  • 客户端向服务端发送一个查询请求,并监听socket返回,通常是阻塞等待服务器响应
  • 服务器处理命令,将结果发送给客户端

什么是redis管道?

管道技术(pipeline)是客户端提供的一种批处理技术,可以在服务器未返回响应时,发送多个redis命令请求给服务器,并一次性获得服务器所有的响应。减少多个命令的网络交互(请求-响应),从而提高redis的性能。

redis管道的使用

下面在java的使用场景下进行代码,来验证管道的性能提升效果,GlobalRedisMgr代码谅解

java 复制代码
public static void main(String[] args) throws IOException {
	int num = 10000;
	//	session可以看做封装的jedis
	try(RedisSession session = GlobalRedisMgr.Instance.getSession()) {
		Pipeline pipelined = session.pipelined();
		long start = System.currentTimeMillis();
		for (int i = 0; i < num; i++) {
			String key = "myKey_" + i;
			pipelined.set(key, String.valueOf(i));
			pipelined.del(key);
		}

		long end = System.currentTimeMillis();


		System.out.println("need millis : "  + (end - start));

	}

	try(RedisSession session = GlobalRedisMgr.Instance.getSession()){
		long start = System.currentTimeMillis();
		for (int i = 0; i < num; i++) {
			String key = "myKey_" + i;
			session.set(key, String.valueOf(i));
			session.del(key);
		}

		long end = System.currentTimeMillis();

		System.out.println("need millis : "  + (end - start));
	}
}

/**
 * 结果:
 * need millis : 30
 * need millis : 653
 */

由上可知,10000次命令1 + 命令2管道的执行效率比普通执行要快21倍。

redis管道的使用场景

Redis管道适用于那些可以并行执行的、相对独立的多个命令的场景。在这些场景中,管道可以有效地提高性能和吞吐量。下面举几个例子

  1. 实时统计:一次性获取多个计数器或多个键的值,可以减少通道延迟,提高实时性。
  2. 多键值关联操作:同时处理多个键的操作,并且这些操作没有依赖关系
  3. 数据导入和导出:将大量数据从一个Redis实例导入到另一个实例
  4. 批量写入或读取操作:需要进行大量写入或读取操作时

redis管道和事务的异同

管道事务是两种不同的机制,虽然都是执行一系列命令,但有一些关键的区别:

  1. 原子性
  • 管道:管道是非原子的,即使在使用管道的期间发生了错误,管道依旧会继续执行剩余的命令。
  • 事务:事务是原子的,要么全部执行,要么全部不执行。在执行事务期间,不会中断事务,也不会执行其他客户端命令。如果在事务在执行过程中有任何语法错误,整个事务都会被回滚。
  1. 执行方式
  • 管道:管道是一次性发送多个命令到服务器,然后一次性接受所有命令的响应。在管道中,多个命令可以同时被发送到服务器,而无需等待每个命令的响应
  • 事务:事务是将多个命令打包成一个事务块,通过MULTI开始,EXEC结束。在MULTIEXEC中间的所有命令都属于同一个事务。
  1. 错误处理
  • 管道:管道中的某个命令失败,会继续执行后续的命令。
  • 事务:事务中的某个命令失败,不会影响其他命令的执行。整个事务会被执行,但如果有错误,事务会回滚
  1. 用途
  • 管道:主要用于提升性能,通过一次性批量发送多个命令,减少网络往返时间
  • 事务:主要用于将一系列命令视为一个原子操作,确保在失误执行期间不会被其他客户端中断。

总体而言,事务用于确保原子性,而管道则用于提高批量命令的执行效率。在选择使用事务还是管道时,需要根据具体的业务需求和性能优化考虑

相关推荐
aristo_boyunv2 分钟前
【线程池】ThreadPoolExecutor应用
java·线程池·并发
Xua305529 分钟前
浅谈Spring Cloud:OpenFeign
后端·spring·spring cloud
工程师老罗30 分钟前
Java笔试面试题AI答之设计模式(4)
java·开发语言·设计模式
KuaiKKyo34 分钟前
c++9月20日
java·c++·算法
xmh-sxh-131444 分钟前
java缓存介绍
java
超级小的大杯柠檬水1 小时前
SpringBoot lombok(注解@Getter @Setter)
java·前端·spring
国通快递驿站1 小时前
理解JVM中的死锁:原因及解决方案
android·java·jvm·spring·诊断
一丝晨光1 小时前
语言的条件语句
java·开发语言·c++·程序员·c·条件语句·algol
Kixuan2141 小时前
ES学习笔记
java·笔记·学习·elasticsearch·搜索引擎
fat house cat_1 小时前
volatile,原来是这么回事
java·jvm·面试·volatile