当前位置: 首页 > 面试题库 >

Redis hash写入速度非常慢

尹雅健
2023-03-14
问题内容

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

这是我的基准:

package html" target="_blank">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.4139469070553 |速度:0.707656949946542 MB / s

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

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

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

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

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

系统规格:
-Ubuntu
11.04-8GB RAM
-Intel i5处理器

任何建议将不胜感激。


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 我正在尝试通过使用JAP和HIBERNATE向SQL Server 2008 R2插入一些数据。一切都“正常”,除了它非常慢。要插入20000行,大约需要45秒,而C#脚本大约需要不到1秒。 这个领域的任何资深人士都可以提供帮助吗?我会很感激。 更新:从下面的答案中得到了一些很好的建议,但仍然无法按预期工作。速度是一样的。 这是更新的persistence.xml: 这是更新的代码部分

  • 问题内容: 我正在尝试通过使用JAP和HIBERNATE向SQL Server 2008 R2插入一些数据。一切都“正常”,除了它非常慢。要插入20000行,大约需要45秒,而C#脚本大约需要不到1秒。 这个领域的任何资深人士都可以提供帮助吗?我会很感激。 更新:从下面的答案中得到了一些很好的建议,但仍然无法按预期工作。速度是一样的。 这是更新的persistence.xml: 这是更新的代码部分

  • 问题内容: 我正在查询有关的信息。 我正在迭代一个数组,并查询列表中的每个值。 不幸的是 ,在调试器下, 单个查询大约需要3-4秒,而 在禁用调试器的情况下, 查询时间要 短一些。 任何想法为什么这么慢?我使用进行测试。 这是我的代码: 更新资料 当我离开时,评估很快就完成了,但是我没有得到。它返回一个空字符串… 问题答案: 感谢@nvrmnd我尝试了一下,发现了一种更好的解析器: VTD-XML

  • 问题内容: 我已经开发了一个用户批量上传模块。有两种情况,当数据库有零条记录时,我批量上传了20000条记录。大约需要5个小时。但是,当数据库已经有大约30 000条记录时,上传速度将非常缓慢。上载2万条记录大约需要11个小时。我只是通过fgetcsv方法读取CSV文件。 下面是运行的查询。(我正在使用Yii框架) 如果存在,请更新用户: 如果用户不存在,请插入新记录。 表引擎类型为MYISAM。

  • 使用 redis 的 hash,即 hset 和 hget 方法实现,不支持ttl 使用时需要注意,key格式为hashkey->member,即为$redis->hget('hashkey', 'member') 配置 return [ 'caches' => [ // 缓存名称 'alias1' => [

  • 问题内容: 我有一个MySQL查询(Ubu 10.04,Innodb,Core i7、16Gb RAM,SSD驱动器,优化的MySQL参数): 表em_link_data有大约700万行,em_link有数千行。此查询大约需要 18秒 才能完成。但是,如果我替换子查询的结果并执行以下操作: 那么查询将在不到1毫秒的时间内运行。仅子查询在不到1毫秒的时间内运行,因此索引了列linkid。 如果我将查