redis是一个cs模式的tcp
server,使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常
会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下
Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR
X
Server: 3
Client: INCR X
Server: 4
基
本上四个命令需要8个tcp报文才能完成。由于通信会有网络延迟,假如从client和server之间的包传输时间需要0.125秒。那么上面的四个命
令8个报文至少会需要1秒才能完成。这样即使redis每秒能处理100个命令,而我们的client也只能一秒钟发出四个命令。这显示没有充分利用
redis的处理能力。除了可以利用mget,mset 之类的单条命令处理多个key的命令外
我们还可以利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server:
1
Server: 2
Server: 3
Server: 4
假
设不会因为tcp
报文过长而被拆分。可能两个tcp报文就能完成四条命令,client可以将四个incr命令放到一个tcp报文一起发送,server则可以将四条命令
的处理结果放到一个tcp报文返回。通过pipeline方式当有大批量的操作时候。我们可以节省很多原来浪费在网络延迟的时间。需要注意到是用
pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打
包的命令越多越好。具体多少合适需要根据具体情况测试。下面是个jredis客户端使用pipeline的测试
package
jredisStudy;
import
org.jredis.JRedis;
import
org.jredis.connector.ConnectionSpec;
import
org.jredis.ri.alphazero.JRedisClient;
import
org.jredis.ri.alphazero.JRedisPipelineService;
import
org.jredis.ri.alphazero.connection.DefaultConnectionSpec;
public
class
PipeLineTest {
public
static
void
main(String[] args)
{
long
start =
System.currentTimeMillis();
usePipeline();
long
end =
System.currentTimeMillis();
System.out.println(end-start);
start =
System.currentTimeMillis();
withoutPipeline();
end =
System.currentTimeMillis();
System.out.println(end-start);
}
private
static
void
withoutPipeline()
{
try
{
JRedis jredis = new
JRedisClient("192.168.56.55"
,6379);
for
(int
i =0 ; i < 100000 ;
i++)
{
jredis.incr("test2"
);
}
jredis.quit();
} catch
(Exception
e) {
}
}
private
static
void
usePipeline()
{
try
{
ConnectionSpec spec = DefaultConnectionSpec.newSpec("192.168.56.55"
, 6379, 0,
null);
JRedis jredis = new
JRedisPipelineService(spec);
for
(int
i =0 ; i < 100000 ;
i++)
{
jredis.incr("test2"
);
}
jredis.quit();
} catch
(Exception
e) {
}
}
}
输出
103408 //使用了pipeline
104598 //没有使用
测试结果不是很明显,这应该是跟我的测试环境有关。我是在自己win连接虚拟机的linux。网络延迟比较小。所以pipeline
优势不明显。如果网络延迟小的话,最好还是不用pipeline。除了增加复杂外,带来的性能提升不明显。
分享到:
相关推荐
- **多模式操作**:支持单个命令、管道(pipeline)和事务(transaction)模式,允许一次性执行多个命令,提高效率。 - **异步编程支持**:提供异步API,适应.NET平台的异步编程模型,便于构建高并发的应用。 - *...
限流[Pipeline 介绍].mp4 │ 19.限流[简单限流].mp4 │ 20.限流[Redis-Cell].mp4 │ 21.限流[扩展客户端操作命令].mp4 │ 22.GeoHash算法介绍.mp4 │ 23.Redis 中使用 GeoHash.mp4 │ 24.Redis 之 Scan[简单...
限流[Pipeline 介绍].mp4 │ 19.限流[简单限流].mp4 │ 20.限流[Redis-Cell].mp4 │ 21.限流[扩展客户端操作命令].mp4 │ 22.GeoHash算法介绍.mp4 │ 23.Redis 中使用 GeoHash.mp4 │ 24.Redis 之 Scan[简单...
限流[Pipeline 介绍].mp4 │ 19.限流[简单限流].mp4 │ 20.限流[Redis-Cell].mp4 │ 21.限流[扩展客户端操作命令].mp4 │ 22.GeoHash算法介绍.mp4 │ 23.Redis 中使用 GeoHash.mp4 │ 24.Redis 之 Scan[简单...
6. **Pipeline和Multiplexing**:为了提高性能,ServiceStack.Redis引入了Pipeline和Multiplexer概念。Pipeline允许一次性发送多个命令,减少网络往返次数;Multiplexer允许多个客户端共享同一连接,节省资源。 7. ...
限流[Pipeline 介绍].mp4 │ 19.限流[简单限流].mp4 │ 20.限流[Redis-Cell].mp4 │ 21.限流[扩展客户端操作命令].mp4 │ 22.GeoHash算法介绍.mp4 │ 23.Redis 中使用 GeoHash.mp4 │ 24.Redis 之 Scan[简单...
Redis Pipeline 是 Redis 数据库操作中的一个高效特性,它允许客户端一次性发送多个命令到服务器,而无需等待每个命令的响应。这种技术显著提高了批量处理和高并发环境下的性能,因为减少了网络通信的开销。 首先,...
五.测试服务器 16 六.密码验证服务器 16 七.Log 16 八.DB数 17 九. Redis原理 17 1.数据结构 17 2.存储结构和存储格式 19 3.性能 20 4.网络IO模型 20 5.内存管理方面 20 6.数据一致性问题 20 7.存储方式及其它...
pipe = self.redis_client.pipeline() pipe.watch(*args) func(pipe, *args, **kwargs) pipe.multi() pipe.execute() ``` 在实际应用中,你还可以根据需要添加其他方法,如删除键、获取键的生存时间(TTL)等。...
redis命令实践 1.线程I0樽型,md 11.RedisDistributeLock.md 12.md 15.Redis主从同步,md ...4.Pipeline.md 5.redis transaction.md 6.Redis DelayQueue.md 7.Redis Pubsub 8.RedisStream.md 9.Redis小对象压缩.md
五、Redis 缓存管理与持久化机制 1. Redis 持久化机制包括RDB快照和AOF日志。 2. RDB在指定时间间隔保存全量数据,适合灾难恢复;AOF记录每次写操作,恢复更完整。 3. RDB 优点是数据一致性好,缺点是可能丢失部分...
redis基本命令 Redis深度历险:核心原理和应用实践 全部代码实现 1.线程10模型,md 11.RedisDistributeLock.md 12.md 15.Redis主从同步,md ...4.Pipeline.md 5.redis transaction,md 6.Redis DelayQueue.md
创建一个 Pipeline 对象,然后在循环中添加需要执行的命令,最后调用 `pipeline.sync()` 进行命令的执行。例如,批量删除键的操作可以通过 Pipeline 来优化。 4. 性能测试: 性能测试显示,Pipeline 相对于非 ...
2. 主要功能:Redis不仅能进行简单的键值存储,还支持发布/订阅(Publish/Subscribe)、事务(Transaction)、管道(Pipeline)、位操作(Bit Operations)等功能。 二、Redis性能特点 1. 内存存储:Redis将所有数据存储在...
Redis 作为消息队列,主要通过发布/订阅(Publish/Subscribe)和管道(Pipeline)机制实现。了解这部分源码有助于构建基于 Redis 的实时通信系统。 10. Redis 性能优化 Redis 源码中包含了各种性能优化技巧,如...
- 考虑使用Redis的Pipeline或Batch操作,批量处理命令以减少网络延迟。 9. Redis在面试中的常见问题: - Redis如何处理并发冲突? - 如何设计一个基于Redis的分布式锁? - Redis的内存管理机制如何理解? - ...
- 使用Pipeline或Transaction:减少网络通信的延迟。 以上是关于Redis的一些关键知识点,对于Java开发者来说,理解和熟练运用这些概念是至关重要的,特别是在面试和实际项目中。掌握Redis能有效提升应用程序的性能...
在处理大量数据导入时,为了提高效率,Redis 提供了一种称为 Pipeline 的技术,允许一次性发送多条命令,减少网络通信的开销。批量导入数据可以显著提升数据处理速度,尤其在需要初始化大量数据或进行数据迁移时。 ...
6. **性能优化**:Redis提供了多种性能优化选项,如批量操作、pipeline和Lua脚本,Rebus的Redis传输层可能会利用这些特性提升整体系统性能。 7. **扩展性**:Redis的集群支持可以帮助Rebus在高负载下扩展,确保系统...
前段时间在开发的时候,遇到了redis批量读的问题,由于在StackExchange.Redis里面我确实没有找到PipeLine命令,找到的是Batch命令,因此对其用法进行了探究一下。 下面的代码是我之前写的: public List...