Ubuntu 从redis检索大型数据集

Ubuntu 从redis检索大型数据集,ubuntu,networking,redis,Ubuntu,Networking,Redis,一台服务器上的应用程序查询另一台服务器上运行的redis。查询zrangebyscore objects:locations-inf+inf的结果数据集约为250k,在应用服务器上似乎需要40秒 当在redis服务器或app server上使用redis cli执行命令时,在这两种情况下,按照redis cli的报告,它们也需要大约40秒才能完成 redis服务器在查询过程中使用了大约15%的CPU 问题:检索25000条记录需要40秒,这是否被视为缓慢?是否可以将其加速到秒数?首先,它取决于项

一台服务器上的应用程序查询另一台服务器上运行的redis。查询
zrangebyscore objects:locations-inf+inf
的结果数据集约为250k,在应用服务器上似乎需要40秒

当在redis服务器或app server上使用
redis cli
执行命令时,在这两种情况下,按照
redis cli
的报告,它们也需要大约40秒才能完成

redis服务器在查询过程中使用了大约15%的CPU


问题:检索25000条记录需要40秒,这是否被视为缓慢?是否可以将其加速到秒数?

首先,它取决于项目的平均大小

在我的系统上,使用zrangebyscore检索10字节的250K项只需113毫秒。 对于100字节的项目,需要228毫秒。对于1KB的项目,需要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
$time redis cli-h zrangebyscore对象:位置-inf+inf>/dev/null

bgsave
之后,现在250k大约需要25秒。每一项看起来都像
“94:47mr7jytroxqmwdkopqujoc9vs9s9qcual6ek4qynfwjdqgbzrn4ryy2qjqfqemjvwpscupsgaqmun1ddutc4fqsu3yjn:1405009897099”
,这是多少字节?使用
redis cli运行查询会是判断速度的好方法吗?不确定在屏幕上显示整个结果集是否会显著降低速度…我启动了一个新服务器,只运行redis,因此没有使用虚拟内存。同样的查询也需要25秒来处理250k个项目。所以每个项目大约需要115个字节。。。如果您在一台物理机器上,它有一个合理的CPU(即不是过时的CPU)和1 GbE网络,那么它应该更快。也许您可以尝试在本地(与redis服务器在同一台机器上)运行redis cli,以查看redis是CPU绑定的还是网络绑定的。我通过将redis cli的输出重定向到/dev/null(或在文件中)来进行所有测量,以避免痛苦的显示。否则,终端的性能可能是一个限制因素。