6

假设在您的 Web 应用程序中,您需要执行许多 redis 调用来呈现页面,例如获取一堆用户哈希。为了加快速度,您可以将您的 redis 命令包装在 MULTI/EXEC 部分中,从而使用流水线,这样您就可以避免多次往返。但是你也想分片你的数据,因为你有很多数据和/或你想分发写入。然后流水线将不起作用,因为不同的键可能存在于不同的节点上,除非您清楚地了解应用程序的数据布局和基于角色而不是使用散列函数的分片。那么,在不同服务器之间分片数据的最佳实践是什么,而不会因为要联系许多服务器来完成“概念上唯一”而对性能造成太大影响 工作?我相信答案取决于一个正在开发的 Web 应用程序,我最终会运行一些测试,但了解其他人如何应对我提到的权衡取舍会很有帮助。

4

1 回答 1

4

MULTI/EXEC 和流水线是两个不同的东西。您可以在没有任何流水线的情况下执行 MULTI/EXEC,反之亦然。

如果要同时分片和流水线,则需要将操作分组到每个 Redis 实例的流水线,然后对每个实例使用流水线。

这是一个使用 Ruby 的简单示例:https ://gist.github.com/2587593

进一步提高性能的一种方法是在对操作进行分组后并行化 Redis 实例上的流量(即对操作进行分组,将它们并行发送到所有实例,然后等待所有实例的答案)。

这有点复杂,因为需要异步非阻塞客户端。为了获得最佳性能,应在客户端使用 C/C++。这可以通过使用hiredis +您选择的事件循环轻松实现。

于 2012-05-09T12:01:38.207 回答