假设在您的Web应用程序中,您需要进行多次redis调用来渲染页面,例如,获得大量用户哈希。为了加快速度,您可以将您的redis命令包装在MULTI/EXEC节中,从而使用流水线,这样就避免了多次往返。但是,您还希望分片数据,因为其中有很多数据和/或您希望分发写入数据。然后流水线将无法工作,因为除非您对应用程序的数据布局和基于角色的分片有清晰的了解,而不是使用哈希函数,否则不同的 key 可能存在于不同的节点上。那么,什么是在不同服务器之间分担数据而不导致性能过度下降的最佳实践呢,因为要联系许多服务器来完成“概念上唯一的”工作?我相信答案取决于一个正在开发的Web应用程序,我最终将进行一些测试,但是了解其他人如何应对我提到的权衡会有帮助。

最佳答案

MULTI/EXEC和流水线是两个不同的东西。您可以执行MULTI/EXEC,而无需任何流水线操作,反之亦然。

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

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

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

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

关于Redis分片,流水线和往返,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10514872/

10-15 10:02