一文带你搞懂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. 用途
  • 管道:主要用于提升性能,通过一次性批量发送多个命令,减少网络往返时间
  • 事务:主要用于将一系列命令视为一个原子操作,确保在失误执行期间不会被其他客户端中断。

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

相关推荐
leobertlan12 分钟前
2025年终总结
前端·后端·程序员
面向Google编程35 分钟前
从零学习Kafka:数据存储
后端·kafka
易安说AI1 小时前
Claude Opus 4.6 凌晨发布,我体验了一整晚,说说真实感受。
后端
易安说AI2 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
易安说AI2 小时前
用 Claude Code 远程分析生产日志,追踪 Claude Max 账户被封原因
后端
JH30732 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
颜酱3 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
Coder_Boy_3 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble3 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
发现一只大呆瓜4 小时前
前端性能优化:图片懒加载的三种手写方案
前端·javascript·面试