- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
作为我上一个问题的后续,How does Redis achieve the high throughput and performance?
我有以下问题
我亲眼目睹了 Redis 的运行,并对它的能力印象深刻和敬畏。想更多地了解这种魔法。我已经看到,当 Redis 框和查询框更接近时,即使在高 QPS (1kps) 下,响应时间也是 5ms。当它们在地理上更远时(相同的数据中心与不同的数据中心),响应时间可达 50 毫秒。这只是网络延迟还是 Redis 必须保持一些开销,直到整个数据被刷新。
连接数会影响Redis吞吐量吗?想象一下,Redis 能够在 500 微秒内对每个请求做出响应。想象一下,在一个给定的实例中有 1000 个不同的请求,来自 1000 个不同的客户端连接。最后一个请求是否需要 500muSec * 1000 = 500ms?
响应大小可以在这里产生影响吗?想象一下每个响应的大小为 100 KB 的数量级,Redis 上的 TCP 连接必须等到最后一个数据包交付,如果网络连接很慢,它会减慢 Redis 的速度吗?
最佳答案
以下是我的回答:
想更多地了解这种魔法。
Redis 很棒,但没有魔法。它只是对非常务实的概念的巧妙而有效的实现。而且因为它是一个人性化的项目,通过查看源代码,实际上很容易理解为什么。
这只是网络延迟还是 Redis 必须保持一些开销,直到整个数据被刷新。
当然,Redis 必须维护通信缓冲区,以便处理较慢的网络链接。也就是说,这对感知延迟的影响应该很小。在您的情况下,50 毫秒可能主要是由于网络延迟,您可以通过运行 ping 命令或任何其他类似工具来检查。
连接数会影响Redis吞吐量吗?
当然,它可以,就像任何服务器软件一样。现在,您需要区分每个连接的吞吐量和服务器的全局吞吐量。
每个连接的吞吐量受到连接数量的严重影响。考虑到服务器只能提供一定的带宽,而这个带宽是跨连接共享的。连接越多,每个连接的带宽越少。
另一方面,服务器的全局吞吐量仅受连接数的轻微影响。 Redis 可以毫无问题地接受数以万计的连接。但是仍然有开销。根据经验,请考虑在 30000 个连接时,Redis 仅支持其在 100 个连接时所能支持的吞吐量的一半。查看 Redis benchmark page 上提供的精美图表.
最后一个请求是否需要 500muSec * 1000 = 500ms?
是的,但你的数字可能是错误的。
是的,所有事件都是序列化的(单线程设计),因此必须添加每个命令的处理时间。当同时收到多个命令时,最后一个将在所有其他命令之后执行。如果每个命令需要 5 us 来处理,同时收到 1000 个,那么最后一个回复将在 5 ms 内发送。
现在,在实践中,真正并发查询的数量并没有那么高。 Redis 在同一个事件循环迭代中很少会同时收到 1000 个查询。
此外,您混淆了响应时间(在客户端测量)和处理时间(在 Redis 端测量)。响应时间可以是500us,但处理时间更接近5us,区别在于网络和OS进程调度所花费的时间。请记住,只需累积处理时间,其他所有内容都通过连接并行化(例如网络延迟)。
要计算实例的平均处理时间,只需使用 redis-benchmark 使实例饱和。使用流水线时,经常会看到实例处理速度高达 400 Kop/s 或更高,平均处理时间为 2.5 us。
响应大小可以在这里产生影响吗?
当然,它可以,就像任何服务器软件一样。超过一定规模后,延迟总是受数据量的影响,因为带宽和网络速度都是有限的。对于以太网网络,此阈值与 MTU 的大小密切相关。
Redis 上的 TCP 连接必须等到最后一个数据包被传递,如果网络连接很慢,它会减慢 Redis 的速度吗?
绝对不。由于事件循环,Redis 系统地缓冲回复(无论它们的大小),并以非阻塞方式管理所有套接字。如果一个连接很慢(或一个客户端很慢),Redis 会尽可能多地填充相应的套接字缓冲区,在事件循环中注册套接字,然后移动到另一个连接。当套接字缓冲区中再次有空间时,事件循环将继续在慢速连接上发送流量。没有什么会阻塞。
关于Redis - QPS、响应时间、连接数、响应大小和网络连接速度之间的相关性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28241728/
我需要修复 getLineNumberFor 方法,以便如果 lastName 的第一个字符位于 A 和 M 之间,则返回 1;如果它位于 N 和 Z 之间,则返回 2。 在我看来听起来很简单,但我不
您好,感谢您的帮助!我有这个: 0 我必须在每次点击后增加“pinli
Javascript 中是否有一种方法可以在不使用 if 语句的情况下通过 switch case 结构将一个整数与另一个整数进行比较? 例如。 switch(integer) { case
我有一列是“日期”类型的。如何在自定义选项中使用“之间”选项? 最佳答案 请注意,您有2个盒子。 between(在SQL中)包含所有内容,因此将框1设置为:DATE >= startdate,将框2
我有一个表,其中包含年、月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 20
这个问题已经有答案了: Extract a substring between double quotes with regular expression in Java (2 个回答) how to
我有一个带有类别的边栏。正如你在这里看到的:http://kees.een-site-bouwen.nl/ url 中类别的 ID。带有 uri 段(3)当您单击其中一个类别时,例如网页设计。显示了一
这个问题在这里已经有了答案: My regex is matching too much. How do I make it stop? [duplicate] (5 个答案) 关闭 4 年前。 我
我很不会写正则表达式。 我正在尝试获取括号“()”之间的值。像下面这样的东西...... $a = "POLYGON((1 1,2 2,3 3,1 1))"; preg_match_all("/\((
我必须添加一个叠加层 (ImageView),以便它稍微移动到包含布局的左边界的左侧。 执行此操作的最佳方法是什么? 尝试了一些简单的方法,比如将 ImageView 放在布局中并使用负边距 andr
Rx 中是否有一些扩展方法来完成下面的场景? 我有一个开始泵送的值(绿色圆圈)和其他停止泵送的值(簧片圆圈),蓝色圆圈应该是预期值,我不希望这个命令被取消并重新创建(即“TakeUntil”和“Ski
我有一个看起来像这样的数据框(Dataframe X): id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个看起来
所以,我正在尝试制作正则表达式,它将解析存储在对象中的所有全局函数声明,例如,像这样 const a = () => {} 我做了这样的事情: /(?:const|let|var)\s*([A-z0-
我正在尝试从 Intellivision 重新创建 Astro-Smash,我想让桶保持在两个 Angular 之间。我只是想不出在哪里以及如何让这个东西停留在两者之间。 我已经以各种方式交换了函数,
到处检查但找不到答案。 我有这个页面,我使用 INNER JOIN 将两个表连接在一起,获取它们的值并显示它们。我有这个表格,用来获取变量(例如开始日期、结束日期和卡号),这些变量将作为从表中调用值的
我陷入了两个不同的问题/错误之间,无法想出一个合适的解决方案。任何帮助将不胜感激 上下文、FFI 和调用大量 C 函数,并将 C 类型包装在 rust 结构中。 第一个问题是ICE: this pat
我在 MySQL 中有一个用户列表,在订阅时,时间戳是使用 CURRENT_TIMESTAMP 在数据库中设置的。 现在我想从此表中选择订阅日期介于第 X 天和第 Y 天之间的表我尝试了几个查询,但不
我的输入是开始日期和结束日期。我想检查它是在 12 月 1 日到 3 月 31 日之间。(年份可以更改,并且只有在此期间内或之外的日期)。 到目前为止,我还没有找到任何关于 Joda-time 的解决
我正在努力了解线程与 CPU 使用率的关系。有很多关于线程与多处理的讨论(一个很好的概述是 this answer )所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU
我正在尝试编写 PHP 代码来循环遍历数组以创建 HTML 表格。我一直在尝试做类似的事情: fetchAll(PDO::FETCH_ASSOC); ?>
我是一名优秀的程序员,十分优秀!