假设在你的 Web 应用程序中,你需要做一些 redis 调用来呈现一个页面,比如,获取一堆用户哈希。 为了加快速度,您可以将 redis 命令包装在 MULTI/EXEC 部分中,从而使用流水线,这样您就可以避免进行多次往返。 但是您还希望对数据进行分片,因为您拥有大量数据和/或想要分发写入。 然后流水线将不起作用,因为不同的键可能会位于不同的节点上,除非您清楚地了解基于角色的应用程序和分片的数据布局,而不是使用哈希函数。 那么,跨不同服务器分片数据的最佳实践是什么,而不会因为要联系许多服务器来完成"概念上唯一"的工作而对性能造成太大影响? 我相信答案取决于一个人正在开发的 Web 应用程序,我最终会运行一些测试,但了解其他人如何应对我提到的权衡会很有帮助。
MULTI/EXEC 和流水线是两个不同的东西。您可以在没有任何流水线的情况下执行 MULTI/EXEC,反之亦然。
如果要同时分片和管道,则需要将操作分组到每个 Redis 实例的管道,然后对每个实例使用流水线。
下面是一个使用 Ruby 的简单示例: https://gist.github.com/2587593
进一步提高性能的一种方法是在操作分组后并行化 Redis 实例上的流量(即对操作进行分组,将它们并行发送到所有实例,等待所有实例的答案(。
这有点复杂,因为需要异步非阻塞客户端。为了获得最佳性能,应在客户端使用 C/C++。这可以通过使用 hiredis + 您选择的事件循环轻松实现。