繁体   English   中英

Redis散写速度非常慢

[英]Redis hash very slow writing speed

我面临一个非常奇怪的问题:使用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.连接器实现存在性能问题

更新设置操作的基准测试结果:

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

99.51%<= 1毫秒
100.00%<= 1毫秒
每秒111111.11次请求

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

任何建议将不胜感激。

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

请在尝试对Redis进行基准测试之前阅读此页面 ,它肯定会对您有所帮助。

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

如果要按顺序应用大量命令,则需要使用流水线操作 或者,如果您不关心序列,则可以同时使用多个连接(这是redis-benchmark的默认模式)。 或者您可以尝试发送异步命令。 在所有情况下,想法是分摊往返Redis服务器的成本

通过在具有异步流量的多个连接上进行流水线操作,您将获得Redis在此计算机上可以实现的最大吞吐量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM