0

这可能是基本问题,但谷歌没有返回令人满意的结果。

如果我使用 Redis 作为缓存并向 Redis 发送大量相同的请求,它是否会将其合并为一个请求并仅将一个请求转发到服务器以防缓存未命中?

4

2 回答 2

0

不,recuasse 这需要大量的代码来支持它,并且没有服务器、HTTP 或 Redis 构建了它。来自 HTTP 服务器的每个请求都是它自己的连接,需要单独响应。在 HTTP 或 Redis 服务器的当前架构中,无法在一个连接上接收多个请求并在另一个连接上回复,同时消除其他请求路径。

此外,考虑到 Redis 的速度,确定哪些查询在请求和内容中相同的开销很可能会完全否定这种方案的任何可能的好处,并且可能会增加响应时间,而不仅仅是简单的对每一个的响应将汇总。Redis 无法知道客户端 A 对密钥 foo 的请求对于客户端 B 对 foo 的请求可以被忽略。如果一个请求被阻塞而另一个请求未被阻塞怎么办?如果两个客户端都在同一个 IP 但完全不同的进程怎么办?同样,Redis 也无法知道。

在您的缓存未命中示例中,Redis 必须以某种方式响应客户端,并且说“我没有给您任何东西”正是要走的路。请记住,与 Redis 服务器通信的最大开销部分是 TCP 连接,很明显,由于您希望保持连接打开以分摊多个请求,因此您仍然必须回复连接在请求中提出,并且没有办法知道连接 B 上的请求 A 可以与连接 D 上的请求 Z 相同。

这就是为什么需要对管道两端的基本通信协议和架构进行大量重写的原因。这听起来也很像没有数据支持其背后的推理的相当过早的优化。Redis 每秒能够处理超过一百万个请求,最好的情况是,提供示例的双方所有额外的复杂性和计算是否会改善这一点。

于 2017-01-30T04:18:08.203 回答
0

Redis 只是一个存储:您向其中添加内容并再次检索它们。它不知道您将其用于(缓存)什么,也不知道如何将未命中转发到其他后端,这取决于处理请求和使用 Redis 缓存的应用程序。

于 2017-01-27T11:40:32.123 回答