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

时间:2011-06-12 07:34:17

标签: redis

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

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

4 个答案:

答案 0 :(得分:176)

你所谈论的关键并不是真的那么久。

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

Redis附带了一个名为redis-benchmark的基准测试实用程序,如果你在src / redis-benchmark中修改了“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次后续运行的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

再次更改密钥为“ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumolumsipsumloreipsumloreipsplumipsipsumloreipslumumumumumumumumumumipsipsloreumloreipsumumipsumloreipsumumipsipsloreumloreumloreumloremlorem: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:'),你可以将测试代码中的前缀大小增加到你想要的任何长度。

答案 1 :(得分:25)

Redis喜欢将所有密钥保存在内存中。平均密钥长度越长,内存中的密钥越少。所以,是的,密钥长度可以极大地影响性能,但可能不会像您所关注的那样显着。也就是说,使用一个小键空间(例如一个很容易放在内存中的键空间),一个128字节的键和一个16字节的键不会有太大的不同。

答案 2 :(得分:4)

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

我认为很明显,如果可以使用极长的密钥(名称)和/或值会对整体性能产生性能影响。这些影响可能发生在客户端,网络或服务器上。所以拖出你的第一个问题是:

Redis与您的客户之间的密钥和值有多长时间?

搜索 Redis 密钥长度限制让我在Redis vs. memcached上找到一个有趣的博客文章,可能会开始回答你的问题题。对该博客条目的第一个回应似乎是由Redis的创始人Salvatore Sanfilipo撰写的(去年秋天:2010年9月),这表明更新的版本会显示出更好的结果。有两条评论将我们链接到Salvatore的Redis/memcached Benchmark,这是在他回复原来的“blagger”(似乎是匿名的)后几天发布的。

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

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

我们可以做出各种猜测。我们可以查看代码并尝试解释它。

然而,处理这种问题的最有意义的方法是编写一些代码来测量一个建议的使用模式......还有一些代码来测试另一个(例如,一系列密钥长度范围从8个字符到。你想要多长时间...... 8千字节?)......以及它的衡量标准。

答案 3 :(得分:-5)

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