Answers:
您正在谈论使用的密钥并没有那么长。
您提供的示例键用于集合,集合查找方法为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:'),您可以在测试代码到您想要的长度。
Redis喜欢将所有密钥保留在内存中。平均密钥长度越长,可以保留在内存中的内容就越少。因此,是的,密钥长度会极大地影响性能,但对您的影响可能不会很大。也就是说,使用较小的键空间(例如,很容易装入内存的键空间),128字节密钥和16字节密钥的性能不会有很大不同。
我不能肯定地回答这个问题。但是,我可以提出一些问题并提出一些意见。
我认为很明显,如果可以使用极长的键(名称)和/或值,则它们会对整体性能产生性能影响。这些影响可能在客户端,通过网络或在服务器上。因此,要拖出您的第一个问题是:
键和值在Redis和您的客户之间可以保留多长时间?
搜索上的Redis,密钥长度和限制网我有一个有趣的博客条目的Redis与memcached的可以开始回答你的问题。Redis的创建者Salvatore Sanfilipo(去年秋天初:09/2010)写了对该博客文章的第一个回复,表明更新的版本将显示出更好的结果。从那之后的两条注释将我们链接到Salvatore的Redis / memcached Benchmark,该基准是在他对原始的“ blagger”(似乎是匿名的)做出回应几天后发布的。
这不能回答问题(密钥可以使用多长时间,以及在什么时候可以检测到对性能的影响)。但是,它为我们提供了解决该问题的线索。
这两篇文章的作者都编写了代码并对其进行了测试……并绘制了结果图形。
我们可以做出各种猜测。我们可以看一下代码并尝试对其进行推理。
但是,解决此类问题的最有意义的方法是编写一些代码来测量一种建议的使用模式……而另外一些代码则用于测试另一种使用模式(例如,从8个字符到...您想要多长时间... 8 KB?)...并进行测量。
我认为变量名称的长度不会影响性能,只要您不超过最大名称长度,变量就将与该数据类型的任何变量占据相同的位置。