关于jredis表现的问题

时间:2011-01-18 16:40:20

标签: java performance redis

我想在我的项目中使用Redis RPUSH和LPOP作为消息队列,现在我遇到了性能问题:

当我简单地使用Jredis从我的Java客户端使用单个线程推送一个随机的Double nubmer时,我注意到整个只有4000个请求/秒,这比我预期的要低得多。

这是我的redis配置:

超时300 节省900 1 节省300 10 保存60 10000

4G内存没有内存限制。

和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客户端吗?谢谢你的帮助!

3 个答案:

答案 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)

可以在http://redis.io/clients

找到Redis客户的完整列表

对于您的答案,有两个不同的客户(总共3个):

  1. JDBC-Redis(http://code.google.com/p/jdbc-redis)
  2. Jedis(http://github.com/xetorthio/jedis)