名称长度会影响Redis的性能吗?


129

例如,我喜欢在Redis中使用冗长的名称set-allBooksBelongToUser:$userId

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

Answers:


198

您正在谈论使用的密钥并没有那么长。

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

Redis带有一个称为的基准实用程序redis-benchmark,如果您修改src / redis-benchmark.c中的“ GET”测试,使其键只是“ foo”,则可以在a之后运行短键测试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次后续运行的GET测试速度:

59880.24 requests per second
58139.53 requests per second
58479.53 requests per second

这是再次修改源并将密钥更改为“ set-allBooksBelongToUser:1234567890”后的GET测试速度:

60240.96 requests per second
60606.06 requests per second
58479.53 requests per second

再一次改变的关键在于“ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem:1234567890”给出了这样的:

58479.53 requests per second
58139.53 requests per second
56179.77 requests per second

因此,即使是非常长的键也不会对Redis的速度产生重大影响。这是在GET上的O(1)操作。更复杂的操作对此甚至不那么敏感。

我认为,拥有可以清楚地识别出它们所持有的价值的钥匙,远远超过了从缩写钥匙中获得的任何微不足道的速度性能。

如果您想进一步说明这一点,那么-r [keyspacelen]redis-benchmark实用程序上还有一个参数,可以让它创建随机密钥(只要它们中包含':rand:'),您可以在测试代码到您想要的长度。


6
那要占用多少空间呢?如果我有100万个这样的长键,那么它在内存中会更大还是在磁盘上持久存在?
Derek Organ

9
@Derek Organ是的,它肯定会影响占用的内存,因此,如果您的密钥是要存储的内容的重要部分,并且您遇到了内存限制,那么您可能希望不那么冗长。我认为您需要在可用性和空间考虑之间取得平衡。使用键的总查找时间不会明显更长,但是占用的空间会更长。
Ted Naleid 2013年

我们通常使用尽可能短的密钥长度,并将“可读性”移至我们的域对象及其方法。我们还在密钥中使用短名称空间,以帮助直接在Redis中进行维护和检查。
xentek

26

Redis喜欢将所有密钥保留在内存中。平均密钥长度越长,可以保留在内存中的内容就越少。因此,是的,密钥长度会极大地影响性能,但对您的影响可能不会很大。也就是说,使用较小的键空间(例如,很容易装入内存的键空间),128字节密钥和16字节密钥的性能不会有很大不同。


4
根据定义,Redis是一个全内存存储,因此第一句话对我来说很困惑。
Lee Grissom

5
@bmatheny,如果我能正确理解您的查询,则Redis从根本上来说是一个内存存储,它还支持持久性
Najeeb,2017年

5

我不能肯定地回答这个问题。但是,我可以提出一些问题并提出一些意见。

我认为很明显,如果可以使用极长的键(名称)和/或值,则它们会对整体性能产生性能影响。这些影响可能在客户端,通过网络或在服务器上。因此,要拖出您的第一个问题是:

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

搜索上的Redis密钥长度限制网我有一个有趣的博客条目的Redis与memcached的可以开始回答你的问题。Redis的创建者Salvatore Sanfilipo(去年秋天初:09/2010)写了对该博客文章的第一个回复,表明更新的版本将显示出更好的结果。从那之后的两条注释将我们链接到Salvatore的Redis / memcached Benchmark,该基准是在他对原始的“ blagger”(似乎是匿名的)做出回应几天后发布的。

这不能回答问题(密钥可以使用多长时间,以及在什么时候可以检测到对性能的影响)。但是,它为我们提供了解决该问题的线索。

这两篇文章的作者都编写了代码并对其进行了测试……并绘制了结果图形。

我们可以做出各种猜测。我们可以看一下代码并尝试对其进行推理。

但是,解决此类问题的最有意义的方法是编写一些代码来测量一种建议的使用模式……而另外一些代码则用于测试另一种使用模式(例如,从8个字符到...您想要多长时间... 8 KB?)...并进行测量。


-7

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


6
查理:这些并不是关键的“变量”。对于介于1到30或100,甚至255个字符之间的键,可能不会检测到任何性能影响。创建几千kb的密钥...或者高达数十kb的密钥,我想您将能够衡量性能方面的损失(在1K到70K之间的某个时刻,您将付出额外的网络开销,因为密钥大小会超过您的MTU,数据将必须通过多个数据包进行分解……至少会产生TCP和重组开销。
Jim Dennis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.