【问题标题】:Redis hash very slow writing speedRedis hash写入速度很慢
【发布时间】:2013-05-11 16:22:00
【问题描述】:

我面临一个非常奇怪的问题:使用 redis 时我的写入速度非常糟糕(在理想情况下,写入速度应该接近 RAM 上的写入速度)。

这是我的基准:

package redisbenchmark;
import redis.clients.jedis.Jedis;

public class RedisBenchmark {

    private static final String REDIS_KEY = "anon_id";

    private Jedis conn;

    private long writeTimeNano=0;

    private RandomString stringGenerator;

    private String[] fields;

    public RedisBenchmark(){
        conn = new Jedis("localhost");
        stringGenerator = new RandomString(32);
    }

    public void run(int nbWrites, int nbReads){     
        writeBenchmark(nbWrites);
    }

    public void writeBenchmark(int amount){
        fields = new String[amount];

        for(int i=0; i< amount; i++){
            fields[i] = stringGenerator.nextString();           
        }

        long start = System.nanoTime();
        for(int i=0; i< amount; i++){
            write(fields[i]);
        }
        writeTimeNano+=System.nanoTime()-start;

        double seconds = (double)writeTimeNano / 1000000000.0;
        System.out.println("[write]nb:"+amount+"|time:"+seconds+"|speed:"+((amount*33)/(seconds*1024*1024))+" MB/s");
    }

    public void write(String anonId){       
        conn.hsetnx(REDIS_KEY, anonId, "1");
    }


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        RedisBenchmark benchmark = new RedisBenchmark();
        benchmark.run(100000, 200);
    }
}

RandomString是一个生成随机字符串的类(arg为字符串长度)

以下是一些结果:

[写入]nb:100000|时间:4.408319378|速度:0.713905907055318 MB/s [写入]nb:100000|时间:4.447246995|速度:0.707656949946542 MB/s

我尝试修改配置文件中的save to hdd参数,但没有任何改善。

我有两个想法:
1. 这是一个套接字问题,因为客户端和服务器(redis)在同一台机器上
2.连接器实现存在性能问题

UPDATE集合运算的基准测试结果:

====== SET ======
10000 个请求在 0.09 秒内完成
50 个并行客户端
3 字节有效载荷
保持活力:1

99.51% 100.00% 每秒 111111.11 个请求

系统规格:
- Ubuntu 11.04
- 8GB 内存
- 英特尔 i5 处理器

任何建议将不胜感激。

【问题讨论】:

  • 如果你运行 redis-benchmark,你的哈希运算速度能达到多少?
  • @Adam 好问题,因为我忘了添加基准测试结果,但我现在会添加它们,据我所知结果非常好

标签: java performance redis jedis


【解决方案1】:

您需要更多地考虑使用此程序进行真正的基准测试。我可以告诉你,这不是 Redis,而是你的系统在两个进程之间运行乒乓球游戏的能力(因为你所有的 hsetnx 调用都是同步的)。

在尝试对 Redis 进行基准测试之前,请阅读this page,它一定会对您有所帮助。

您认为 Redis 的速度应该接近 RAM 的写入速度的假设有点幼稚。 Redis 是一个远程存储,对于 O(1) 的操作,大部分开销是由于通信成本。对于同步流量(如您的示例),这也是由于操作系统调度程序的成本。

如果你想按顺序应用很多命令,你需要使用pipelining。或者如果你不关心顺序,你可以同时处理多个连接(这是 redis-benchmark 的默认模式)。或者您可以尝试发送异步命令。在所有情况下,我们的想法都是分摊往返 Redis 服务器的成本

通过对异步流量的多个连接进行流水线处理,您将获得 Redis 在这台机器上可以实现的最大吞吐量。

【讨论】:

  • +1 获取有用信息。关于 RAM 的速度,我只说因为它在同一台机器上运行,因此不会出现网络瓶颈。我知道使用多个客户端或流水线,但我选择不使用它,因为我想模拟最坏的情况:执行顺序调用并在每次调用后读取结果的单线程。即便如此,我仍希望获得比获得的速度更快的速度。
  • 没有网络不代表没有通讯费用。 IPC 也有成本。您可以尝试 redis-benchmark 和 -c 1 以将并发限制为一个连接并将苹果与苹果进行比较。
  • 你对他们苹果说得对:我跑了./redis-benchmark -c 1 -d 33 -n 100000 -t SET,它在 4.32 秒内执行,就像我得到的一样。但我仍然期待更多......也许我没有完全清楚为什么在这种情况下它很慢
猜你喜欢
  • 2019-03-02
  • 2016-08-21
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多