我想在我的项目中使用Redis RPUSH和LPOP作为消息队列,现在我遇到了性能问题:
当我简单地使用Jredis从我的Java客户端使用单个线程推送一个随机的Double nubmer时,我注意到整个只有4000个请求/秒,这比我预期的要低得多。
这是我的redis配置:
超时300 节省900 1 节省300 10 保存60 10000
和Java代码段:
jredis = new JRedisClient(ip,6379);
long bytesTransfered = 0;
Date start = new Date();
for(int i = 0; i < 100000 ; i ++){
String s = Math.random()+"";
jredis.lpush("testqueue", s);
bytesTransfered += s.length();
}
Date end = new Date();
double seconds = (end.getTime() - start.getTime())/1000f;
System.out.println("REDIS:\t"+ (bytesTransfered/seconds)+"bytes/second,\t"+100000/seconds+"request/second");
还有比jredis更好的其他java客户端吗?谢谢你的帮助!
答案 0 :(得分:2)
尝试一些没有java的测试 - redis附带的客户端应该这样做。 Java客户端可能有一些开销,但您的问题很可能是网络连接。网络可能能够快速传输大量数据,但是许多小密钥可以降低开销和延迟的最坏情况。
您的测试使每个操作同步进行,在发送下一个命令之前等待响应。客户端和服务器都可以在正常使用情况下处理更多 - 启动另一个线程/连接,你可能会获得更好的数字。
答案 1 :(得分:1)
通常,客户端只会占用空间开销(例如内存),并针对高性能进行了优化。
单线程同步请求/回复的上限(无论您使用什么客户端,使用什么语言),大约10-15K /秒。那是因为您使用的是MTU的一小部分,并且进一步阻止等待响应。
在同步模式下,单个Req / Rep的RTT将对1秒窗口进行分区。因此,如果RTT为1ms,则您只能在一秒内完成1K请求/回复。这只是物理学,你无能为力。 :)你的4k Req / s意味着你得到0.25毫秒的RTT(平均)。
但是,JRedis还为您提供异步管道(适用于您的用例)。我建议你使用它:
使用异步流水线,只需分割100mb / MTU_IN_BITS就可以了解理想的完全饱和链路req / s速率(如果您的请求有效负载小于MTU。)您可以使用JRedis管道来达到此限制。)同样,请注意,使用流水线技术,消息大小本身决定了请求/ s 吞吐量,但显然 byte 吞吐量受网络限制
答案 2 :(得分:0)
对于您的答案,有两个不同的客户(总共3个):