- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对 HMGET 性能有一些疑问。
您能解释一下哈希中的字段数量如何影响读取性能吗?
示例 1. 20000 个请求。 HMGET 有 4 个字段。管道中的命令。哈希包含760个字段在测试机上大约需要1500ms。
示例 2.20000 个请求。 HMGET 有 4 个字段。管道中的命令。 Hash包含30个字段在测试机上大约需要300ms。
最佳答案
在这两种情况下,它都应该是 O(1) - 与哈希中的字段数量无关。因此,20 倍的按键数量需要 5 倍的时间,这听起来有些过大。
我尝试复制并获得非常一致的性能。这是我所做的:
创建了三个哈希,每个哈希有 10、1000、100000 个字段:
> EVAL "for i=1,10 do redis.call('HSET', KEYS[1], i, i) end" 1 Test1HMGET
(nil)
> EVAL "for i=1,1000 do redis.call('HSET', KEYS[1], i, i) end" 1 Test2HMGET
(nil)
> EVAL "for i=1,100000 do redis.call('HSET', KEYS[1], i, i) end" 1 Test3HMGET
(nil)
> HLEN Test1HMGET
(integer) 10
> HLEN Test2HMGET
(integer) 1000
> HLEN Test3HMGET
(integer) 100000
然后运行redis-benchmark
测试 HMGET:
$ redis-benchmark -n 200000 -c 1 -q HMGET Test1HMGET 4 6 7 9
HMGET Test1HMGET 4 6 7 9: 8841.73 requests per second
$ redis-benchmark -n 200000 -c 1 -q HMGET Test2HMGET 4 6 7 9
HMGET Test2HMGET 4 6 7 9: 8788.89 requests per second
$ redis-benchmark -n 200000 -c 1 -q HMGET Test3HMGET 4 6 7 9
HMGET Test3HMGET 4 6 7 9: 8863.68 requests per second
$ redis-benchmark -n 200000 -c 1 -q HMGET Test3HMGET 45 667 567 56789
HMGET Test3HMGET 45 667 567 56789: 8819.51 requests per second
如图所示,无论哈希长度如何,它始终获得约 8800 rps。
其他命令,例如 HGETALL,确实出现了下降。
$ redis-benchmark -n 20000 -c 1 -q HGETALL Test1HMGET
HGETALL Test1HMGET: 7840.06 requests per second
$ redis-benchmark -n 20000 -c 1 -q HGETALL Test2HMGET
HGETALL Test2HMGET: 600.08 requests per second
您的测试中一定有其他因素导致您观察到的差异,如果您使用不同的字段,则可能是有效负载差异。
更新:正如OP所指出的,一旦接近hash-max-ziplist-entries
,就会出现性能差异。请参阅Antirez article ,和this post 。由于压缩,您的平均读取性能会下降。这是 CPU/内存的权衡。
在我的机器上,我的 max-ziplist-entries
= 512。在键空间末尾,性能降低了 2.3 倍。一旦我们超过压缩优化阈值(514 个字段),它在整个键空间中保持不变,但内存使用量增加了 6.6 倍。
关于performance - HMGET 以及字段数量和阅读性能之间的相关性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59309254/
对 HMGET 性能有一些疑问。 您能解释一下哈希中的字段数量如何影响读取性能吗? 示例 1. 20000 个请求。 HMGET 有 4 个字段。管道中的命令。哈希包含760个字段在测试机上大约需要1
我在 redis 中有一个哈希集,如下所示。 "abcd" : { "rec.number.984567": "value1", "rec.number.973956": "value
RedisFuture>> future = redisStatsConnection.hmget(key, 10); if (!future.await(500, TimeUnit.MILLISEC
我正在使用 REDIS.hmget 匹配一堆字符串。整个商店有大约 14 万个 key 。我已经看到我的后端在不到 1 秒的时间内匹配超过 1k 个字符串,但我遇到了这种匹配在完成前超时的特殊情况。我
我在 redis 中创建了一个键,如下所示:- In [1]: import redis In [2]: conn = redis.Redis('localhost') In [3]: user =
使用 redigo,我正在尝试使用 HMGET。我在字段中传递一个字符串 slice 作为参数。它不起作用,返回空结果。 func HMGET(c redis.Conn, field []string
我有一个包含多个值的redis哈希,即 myhash f1 "foo" f2 "bar" f3 "mish" f4 "mash" 我想使用 hmget 提取值,但坚持使用 ruby 术语。我想做类
我想通过在我的应用程序中使用 hmget 从 redis 中获取多个值,一次获取大约 1000+ 个值。但我担心它会导致一些性能问题。有人试过这个吗? 最佳答案 应该真的不是问题,因为它是 O(N),
我正在尝试使用以下代码通过 node.js 从 redis 获取一些数据: var moment = require("moment"); var express = require('express
是否存在将表传递给单个 redis.call('HMGET',[key],...) 的任何类似行为,而不是遍历表并运行多个 >redis.call,一个接一个? 我在 Redis 中有一个散列键,它表
我想替换这个命令: red:hmget('item', 'item:1', 'item:2') 用类似的东西: local test = {'item:1', 'item:2'} red:hmget(
我想使用单个 ZADD 或 HMGET 命令而不是 MULTI/EXEC。 ZADD 可以处理的(分数、成员)元组的数量是否有限制? HMGET 可以处理的字段数有没有限制? 最佳答案 理论极限相当高
我是一名优秀的程序员,十分优秀!