Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
名称长度是否影响Redis中的性能?_Redis - Fatal编程技术网

名称长度是否影响Redis中的性能?

名称长度是否影响Redis中的性能?,redis,Redis,我喜欢在Redis中使用详细的名称,例如set allBooksBelongToUser:$userId 这可以吗?还是会影响性能?我不认为变量名的长度会影响性能,只要不超过最大名称长度,变量将与该数据类型的任何变量发生相同的位置。我不能肯定地回答这个问题。不过,我可以就此提出一些问题,并提出一些看法 我认为很明显,如果可以使用非常长的键(名称)和/或值,它们将对整体性能产生影响。这些影响可能存在于客户端、网络或服务器上。因此,你要提出的第一个问题是: Redis和您的客户之间的密钥和值可以保留

我喜欢在Redis中使用详细的名称,例如
set allBooksBelongToUser:$userId


这可以吗?还是会影响性能?

我不认为变量名的长度会影响性能,只要不超过最大名称长度,变量将与该数据类型的任何变量发生相同的位置。

我不能肯定地回答这个问题。不过,我可以就此提出一些问题,并提出一些看法

我认为很明显,如果可以使用非常长的键(名称)和/或值,它们将对整体性能产生影响。这些影响可能存在于客户端、网络或服务器上。因此,你要提出的第一个问题是:

Redis和您的客户之间的密钥和值可以保留多长时间?

在Redis上搜索,关键长度和限制为我提供了一个有趣的博客条目,可以开始回答你的问题。对这篇博文的第一个回应似乎是由Redis的创建者Salvatore Sanfilipo(去年秋天早些时候:2010年9月)写的,他认为更新的版本会显示出更好的结果。两条评论将我们与Salvatore的联系联系起来,Salvatore的评论是在他回复最初的“blagger”(似乎匿名)几天后发布的

这并不能回答问题(钥匙可以放多长时间,在什么时候对性能有可检测的影响)。然而,它给了我们一个解决这个问题的线索

这两篇文章的作者都编写了代码并进行了测试。。。并将结果制成图表

我们可以做各种各样的猜测。我们可以看一下代码,试着找出原因


然而,处理这类问题最有意义的方法是编写一些代码来度量一个提议的使用模式。。。还有一些测试另一个(例如,从8个字符到…您想要多长时间…8 KB?)的密钥长度范围。。。测量它。

你所说的按键其实并不长

您给出的示例键用于集合,集合查找方法为O(1)。集合(SDIFF、SUNION、SINTER)上更复杂的操作是O(N)。填充
$userId
可能比使用更长的键更昂贵

Redis附带了一个名为
Redis benchmark
的基准实用程序,如果您修改src/Redis benchmark.c中的“GET”测试,使它们的键仅为“foo”,则可以在
make install
之后运行短键测试:

diff --git a/src/redis-benchmark.c b/src/redis-benchmark.c
--- a/src/redis-benchmark.c
+++ b/src/redis-benchmark.c
@@ -475,11 +475,11 @@
         benchmark("MSET (10 keys)",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"SET foo:rand:000000000000 %s",data);
+        len = redisFormatCommand(&cmd,"SET foo %s",data);
         benchmark("SET",cmd,len);
         free(cmd);

-        len = redisFormatCommand(&cmd,"GET foo:rand:000000000000");
+        len = redisFormatCommand(&cmd,"GET foo");
         benchmark("GET",cmd,len);
         free(cmd);
下面是短键“foo”的3次后续运行的测试速度:

下面是再次修改源代码并将键更改为“set-allBooksBelongToUser:1234567890”后的GET-test速度:

再次将密钥更改为“ipsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsumLoreIPsum:1234567890”给出:

58479.53 requests per second
58139.53 requests per second
56179.77 requests per second
因此,即使是很长的键也不会对redis的速度产生太大的影响。这是一个GET操作,一个O(1)操作。更复杂的操作对它更不敏感

我认为,拥有能够清楚地识别它们所持有的价值观的键,远远超过了从缩略键中获得的任何微小的速度性能


如果您想更进一步,redis benchmark实用程序上还有一个
-r[keyspacelen]
参数,允许它创建随机键(只要其中有“:rand:”),您可以将测试代码中前缀的大小增加到您想要的长度。

Redis喜欢将所有密钥保存在内存中。您的平均密钥长度越长,内存中可以保存的密钥就越少。因此,是的,密钥长度可以极大地影响性能,但可能不会对您的关注方式产生显著影响。也就是说,使用较小的密钥yspace(例如,一个很容易放在内存中的),一个128字节的密钥和一个16字节的密钥的性能不会有很大的不同。

Charlie:这些并不是真正的“变量”“它们是钥匙。对于介于1到30或100,甚至255个字符之间的键,可能不会有任何可检测到的性能影响。创建几KB的密钥。。。或者高达几万字节,我想您可以测量性能的影响(在1K和70K之间的某个点上,您将遇到额外的网络开销,因为密钥大小将超过您的MTU,并且数据必须在多个数据包中被破坏……至少会产生TCP和重新组装开销).它占用多少空间呢?如果我有一百万个这样的很长的密钥,它在内存中会有那么大吗?还是会持久化到磁盘上?@Derek Organ是的,它肯定会影响占用的内存,因此如果您的密钥是存储内容的重要部分,并且您遇到内存限制,您可能希望减少冗余。我认为你需要平衡可用性和空间的考虑。使用键时,总体查找时间不会明显延长,但会占用空间。我们通常使用尽可能短的键长度,并将“可读性”移动到域对象及其方法。我们还在密钥中使用短名称空间来帮助直接在redis中进行维护和检查。根据定义,redis是一个全内存存储,因此第一句话让我很困惑。@b如果我正确理解您的查询,redis基本上是一个内存存储,它还支持持久性
60240.96 requests per second
60606.06 requests per second
58479.53 requests per second
58479.53 requests per second
58139.53 requests per second
56179.77 requests per second