- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不太熟悉 Redis
.目前我正在设计一些实时服务,我想依赖它。我预计每分钟 ~10000-50000 个 key 是 SET
有一些合理的EX
并使用 SCAN
匹配它们很少足以不打扰性能瓶颈。
我怀疑的是“输入/输出速率”以及可能与某些匹配的键的溢出 SCAN
查询,因此它永远不会终止(即总是用最新的光标位置回复并强制您继续;如果使用 x items per second
并且有 x + y items per second coming in
和 y > 0
,这很容易发生)。
显然,我可以设置所需的 SCAN
尺寸足够长;但我想知道是否存在更好的解决方案或Redis
本身保证SCAN
在这种情况下会自动增加大小吗?
最佳答案
首先是一些上下文,最后是 解决方案 :
来自 SCAN command > Guarantee of termination
The SCAN algorithm is guaranteed to terminate only if the size of the iterated collection remains bounded to a given maximum size, otherwise iterating a collection that always grows may result into SCAN to never terminate a full iteration.
This is easy to see intuitively: if the collection grows there is more and more work to do in order to visit all the possible elements, and the ability to terminate the iteration depends on the number of calls to SCAN and its COUNT option value compared with the rate at which the collection grows.
Important: there is no need to use the same COUNT value for every iteration. The caller is free to change the count from one iteration to the other as required, as long as the cursor passed in the next call is the one obtained in the previous call to the command.
- A given element may be returned multiple times. It is up to the application to handle the case of duplicated elements, for example only using the returned elements in order to perform operations that are safe when re-applied multiple times.
- Elements that were not constantly present in the collection during a full iteration, may be returned or not: it is undefined.
DBSIZE
或
INFO keyspace
命令,您可以随时获取您拥有的 key 数量:
> DBSIZE
(integer) 200032
> info keyspace
# Keyspace
db0:keys=200032,expires=0,avg_ttl=0
DEBUG htstats index
,只是为了感受一下:
> DEBUG htstats 0
[Dictionary HT]
Hash table 0 stats (main hash table):
table size: 262144
number of elements: 200032
different slots: 139805
max chain length: 8
avg chain length (counted): 1.43
avg chain length (computed): 1.43
Chain length distribution:
0: 122339 (46.67%)
1: 93163 (35.54%)
2: 35502 (13.54%)
3: 9071 (3.46%)
4: 1754 (0.67%)
5: 264 (0.10%)
6: 43 (0.02%)
7: 6 (0.00%)
8: 2 (0.00%)
[Expires HT]
No stats available for empty dictionaries
COUNT
参数。
F
单位为 Hz)调用 SCAN,并且您希望在 5 秒内完成(
T
单位为 s)。因此,您希望在
N = F*T
调用中完成此操作,在此示例中为
N = 50
。
RP = 1
(100%)。
SCAN
调用之前(或者,如果您想保存
DBSIZE
调用的往返时间 (RTT),那么您想要调整 COUNT 的每个给定调用次数),您调用
DBSIZE
以获取
K
键的数量。
COUNT = K*RP/N
COUNT = 200032*1/50 = 4000
。
RP = 1 - ReversedCursor/NextPowerOfTwo(K)
。
N = 30
(剩余调用次数)。你调用
DBSIZE
并得到
K = 281569
。这意味着
NextPowerOfTwo(K) = 524288
,这是 2^19。
000011100010101101
。由于表大小为 2^19,我们用 18 位表示。
101101010001110000
= 185456 的十进制。这意味着我们已经涵盖了 524288 个中的 185456 个。并且:
RP = 1 - ReversedCursor/NextPowerOfTwo(K) = 1 - 185456 / 524288 = 0.65 or 65%
COUNT = K*RP/N = 281569 * 0.65 / 30 = 6100
SCAN
调用中,您使用
6100
。它增加是有道理的,因为:
PM
(匹配百分比)作为因子添加到
COUNT
计算中。
COUNT = PM * K*RP/N
PM = keysFound / ( K * ReversedCursor/NextPowerOfTwo(K))
keysFound = 2000
键,则:
PM = 2000 / ( 281569 * 185456 / 524288) = 0.02
COUNT = PM * K*RP/N = 0.02 * 6100 = 122
COUNT
编号上运行一些基准测试,以测量您的
SCAN
占用了多少毫秒,因为您可能需要降低对需要多少调用 (
N
) 的期望合理的时间而不阻塞服务器,并相应地调整您的
F
和
T
。
关于Redis `SCAN` : how to maintain a balance between newcomming keys that might match and ensure eventual result in a reasonable time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59564896/
我是 AWS 新手。我开始学习 ALB 和 NLB。我知道 ALB 在第 7 层协议(protocol)中工作,而 NLB 在第 4 层协议(protocol)中工作。 谁能解释一下ALB和NLB的实
我正在使用平衡付款ruby api并意外创建了几个额外的测试市场。虽然 api 公开了一个用于创建测试市场的清晰界面,但我似乎找不到任何方法来删除它,即使没有 api。有人知道删除市场的方法吗? 最佳
我有在 Google Compute Engine 上运行的服务。我在欧洲的目标池中有几个实例,在美国的目标池中也有几个实例。目前我有一个域名,它连接到欧洲目标池 IP,并且可以很好地在这两个实例之间
我在golang中遇到以下错误 # go.etcd.io/etcd/clientv3/balancer/picker
我在 Google CE(计算引擎)上有一个 Node.js 应用程序,它在 nginx 服务器后面运行。 我应该使用 nginx 负载均衡器和 Google Cloud 负载均衡器吗? 或者它们是相
我正在寻找将 WAF 集成到现有服务器设置中的方法,因为我的 Classic Load Balancer(带有 EC2 实例)不支持 WAF,因此我需要迁移到 Application Load Bal
在我的文档中有一个父 div固定高度和两列子元素 div . Text 仅使用 CSS3,我试图通过以下方式将子项的两列布局与父项的溢出裁剪携手合作: 当子元素包含很少的文本时,它不应该平
我正在尝试设置 Application Load Balancer 以将流量转发到 AWS 中的 Nginx Ingress Controller 。 为了设置 Nginx Ingress Contr
我有一个 EKS Kubernetes 1.16.x。具有三个标记为 kubernetes.io/role/elb: 1 的公共(public)子网的集群和三个标记为 kubernetes.io/ro
我有 REST API。 为了简单起见,假设我有两个服务: read.request.com write.request.com 如何将所有读取请求(GET 方法)重写为read.request.co
我是微服务领域的新手,但了解有关负载平衡的基础知识。我最近读了一篇关于微服务的文章:Enough with the microservices . 其中提到微服务和负载均衡器都有集群/不同的 VM 用
在阅读“kong”api网关的文档时,上游服务器中有一个称为插槽的概念。我没明白这句话的意思。请分享这方面的知识。 最佳答案 我查看了 Kong 源代码,这是相对于外部 resty 库的: https
某个组织有10服务器。为它提供一些负载平衡算法。还要考虑这样一种情况,其中一台服务器需要 10 秒来处理请求,而其他服务器只需要 1 秒。那么,您将如何管理这个瓶颈? 最佳答案 有多种方法可以做到这一
考虑一种情况,我们有一个部署在多个服务器中的 Web 应用程序,并且客户端请求登陆到负载均衡器,负载均衡器又将请求路由到实际服务器。 现在,如果我们有太多请求并发,负载均衡器本身会失败吗?假设我们每秒
在Web应用程序和服务中,我正在创建它必须水平缩放。我想拥有1个负载平衡器,3个Web服务器节点和2个数据库节点(其中一个仅用于冗余,并且在第一个数据库节点发生故障时将垂直扩展)。 负载均衡器是否充当
可以对MQTT代理进行负载平衡吗?我可以使用ELB来负载均衡MQTT吗?朝这个方向的任何指示都将有所帮助。我碰到了http://www.slideshare.net/kellogh/mqtt-kafk
阅读常见消息队列系统(例如 RabbitMQ、ActiveMQ)的文档,似乎负载平衡总是由队列系统(循环)或生产者使用消息上的多个队列或属性来完成。然而,在我们的应用程序中,没有人知道处理消息需要多长
我的老板想要一个系统来考虑整个大陆的灾难性事件。他想在美国有两台服务器,在亚洲有两台服务器(每个大陆有 1 个登录服务器和 1 个工作服务器)。 如果地震破坏了两大洲之间的联系,两者都应该单独行动。当
最近有几种服务发现工具变得流行/“主流”,我想知道在哪些主要用例下应该使用它们而不是传统的负载均衡器。 使用 LB,您可以在平衡器后面聚集一堆节点,然后客户端向平衡器发出请求,然后平衡器(通常)将这些
我们的设置是 Varnish 前端,通过配置的运行状况轮询为2个后端提供服务。我们使用Client Director进行负载平衡,因此根据client.identity选择后端 当两个后端之一发生故障
我是一名优秀的程序员,十分优秀!