从Redis中检索大型数据集

3
一个服务器上的应用程序查询运行在另一个服务器上的Redis。从查询zrangebyscore objects:locations -inf +inf得到的结果数据集大约有250k,似乎需要在应用服务器上花费40秒钟。
当使用redis-cli在Redis服务器或应用服务器上执行该命令时,在两种情况下,它们完成所需的时间也都约为40秒,如redis-cli所报告的。
在查询期间,Redis服务器的CPU使用率约为15%。 问题:检索250k条记录需要40秒被认为是慢吗?是否可能加速以几秒钟完成?
1个回答

2
首先,这取决于项目的平均大小。
在我的系统上,使用zrangebyscore检索10字节的250K个项目仅需113毫秒。对于100字节的项目,需要228毫秒。对于1 KB的项目,需要4033毫秒。
因此,除非您的项目比这大得多,否则我会说您的40秒响应时间非常糟糕。
Redis不适合与虚拟内存一起使用。如果Redis内存被交换出去,性能通常是灾难性的,因此我会说您的第一个行动应该是避免Redis内存被交换出去。
我会尝试转储Redis数据库(使用bgsave,以确保所有页面都返回到RAM中),然后再次尝试zrangebyscore(并多次尝试),看看响应时间是否更好。
更新:
这是我用来构建内容的命令:
$ python -c 'for x in range(0,250000): print "ZADD objects:locations 0.1 %0115d" % (x)' | redis-cli | wc

这是我用来计时查询的命令:

$ time redis-cli -h <hostname> zrangebyscore objects:locations -inf +inf >/dev/null

使用 redis-cli 运行查询来判断速度是否快是一个好方法吗?不确定在屏幕上显示整个结果集是否会显著减慢速度... - Nyxynyx
我启动了一个新的服务器,只运行了Redis,因此没有使用虚拟内存。相同的查询也需要25秒来处理250k个项目。 - Nyxynyx
按照您的建议,将redis-cli的输出重定向到文件后,操作现在在应用服务器和redis服务器本身上仅需400毫秒!所使用的命令是time cat redisCmd | redis-cli -h redis.mywebsite.com > result.txttime是否准确地测量了查询时间?结果文件result.txt大小为14MB。 - Nyxynyx
对于这种查询(即相当沉重的),是的,使用 redis-cli 计时非常准确。 - Didier Spezia
这意味着,如果应用程序需要30秒才能完成包括使用此命令查询redis的函数,则减速是由于函数本身的某些问题,而不是等待redis将结果集传输到应用程序。 - Nyxynyx
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接