gpt4 book ai didi

redis - redis pipe-lining 在 pyredis 中是如何工作的?

转载 作者:IT王子 更新时间:2023-10-29 06:14:29 27 4
gpt4 key购买 nike

我想了解,redis 中的管道衬里是如何工作的?根据我读到的一篇博客,对于这段代码

Pipeline pipeline = jedis.pipelined();
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
pipeline.set("" + i, "" + i);
}
List<Object> results = pipeline.execute();


每次调用 pipeline.set() 都会有效地将 SET 命令发送到 Redis(您可以通过在循环内设置断点并使用 redis-cli 查询 Redis 来轻松地看到这一点)。对 pipeline.execute() 的调用是在读取所有未决响应时发生的。

所以基本上,当我们使用流水线时,当我们执行上面设置的任何命令时,该命令会在服务器上执行,但在执行 pipeline.execute() 之前我们不会收集响应。

然而,根据pyredis的文档,
管道是 Redis 基类的子类,它支持在单个请求中向服务器缓冲多个命令。

我认为,这意味着,当我们执行 pipe.execute() 时,我们使用流水线,所有命令都被缓冲并发送到服务器,因此这种行为与上述行为不同。

有人可以告诉我使用 pyreids 时什么是正确的行为吗?

最佳答案

这不仅仅是 redis-py 的事情。在 Redis 中,流水线操作始终 意味着缓冲一组命令,然后将它们一次性全部发送到服务器。流水线的要点是避免无关的网络来回——这通常是针对 Redis 运行命令时的瓶颈。如果在管道运行之前将每个命令发送到 Redis,情况就不会如此。

您可以在实践中对此进行测试。打开 python 并:

import redis
r = redis.Redis()
p = r.pipeline()
p.set('blah', 'foo') # this buffers the command. it is not yet run.
r.get('blah') # pipeline hasn't been run, so this returns nothing.
p.execute()
r.get('blah') # now that we've run the pipeline, this returns "foo".

关于redis - redis pipe-lining 在 pyredis 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33272153/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com