【问题标题】:Inserting 500k records into redis using spring-data-redis使用 spring-data-redis 将 500k 记录插入 redis
【发布时间】:2019-07-07 23:31:27
【问题描述】:

我使用 redis 作为缓存,一旦我要从 oracle 数据库中获取表,然后将这些记录插入到 redis 缓存中。我正在使用两者的存储库,所以我正在做类似的事情:

 oracleRepo.findAll().forEach(record -> {
            RedisEntity redisEntity = objectMapper.convertValue(record, RedisEntity.class);
            redisRepo.save(redisEntity);
        });

但是,当我将它保存到 redis 时,这非常慢,因为它大约有 50 万条记录。我知道我可以改进从数据库中获取并使用分页的方式,但这会改进保存到 redis 上的方法。有没有办法批量插入到 redis 中,因为现在它似乎正在为它试图保存的每条记录打开和关闭 redis 连接。

【问题讨论】:

  • 您将如何使用这些数据?我建议您尝试以反映其预期用途的方式将其存储在缓存中。如果您一次需要页面,则可以将所有这些值存储在一个键中。现在的问题是您要单独存储每条记录,因此需要 50 万次往返缓存(从数据库加载后)。您可以使用 Spring Cache,或者可能是 Redisson,它允许许多不同类型的数据,这可能允许您存储这些数据并对其进行批处理。我个人对 Spring data redis 不熟悉。
  • 它将被用作查找数据,所以我需要缓存中的所有数据。
  • 这不是它被缓存的问题,而是它如何被缓存以及你打算如何从缓存中加载的问题。您会单独从缓存中获取这些记录(当您保存它们时),还是会在单个缓存键中缓存许多记录?现在,您不会将保存批量保存到缓存,因此它是 O(n) 往返。如果您可以将所有这些记录存储在一个键上,您可能会先对其进行循环,执行一些基本处理,最后写入一次缓存。这里有很多因素,但是如果您预处理数据并写入缓存的次数更少,生活会更好。
  • 除非我认为 redis 错误,否则我想单独存储每条记录,以便在时间到时使用此查找数据,我可以使用密钥获取我需要的单个记录。不确定通过将所有记录保存在一个键下是否仍然可行。我还需要经常使用不同的键来查找数据。
  • 您的理解是正确的,我只是想确保您确实必须像这样写 500k。我简要回顾了 spring data redis,并没有在他们的文档页面上看到大量插入或批量插入,但是,我确实找到了流水线:docs.spring.io/spring-data/redis/docs/2.1.5.RELEASE/reference/…,并且引用了redis.io/topics/mass-insert;你也可以试试 StringRedisTemplate 。根据存储的数据,如果您想使用原始命令,您可以使用 MSET 操作,该操作可以一次写入多个键。

标签: java spring-boot redis spring-data-redis


【解决方案1】:

一种可能的方法是批量处理来自 Oracle 的响应并使用 redis-pipeline 在 redis 服务器中设置这些键。

使用管道向 redis 服务器发送多个命令将允许继续处理批次,而无需等待 evert SET 操作的响应。

这里是使用 redis 管道的 spring boot 示例代码:

//pop a specified number of items from a queue
List<Object> results = stringRedisTemplate.executePipelined(
  new RedisCallback<Object>() {
    public Object doInRedis(RedisConnection connection) throws DataAccessException {
      StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
      for(int i=0; i< batchSize; i++) {
        stringRedisConn.rPop("myqueue");
      }
    return null;
  }
});

Spring Data Redis Pipelining

【讨论】:

    猜你喜欢
    • 2022-11-20
    • 2018-07-18
    • 2021-09-13
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多