java - 使用 spring-data-redis 将 500k 条记录插入到 redis 中

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

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

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

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

最佳答案

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

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

以下是 Spring Boot 使用 Redis 管道的示例代码:

//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

关于java - 使用 spring-data-redis 将 500k 条记录插入到 redis 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54681937/

相关文章:

java - 配置eclipse、tomcat和maven提高webapp的生产力

java - Weld @Inject ApplicationScope bean 在每个注入(inject)点创建新实例

Java 程序在 Netbeans 中运行流畅,但在 Eclipse 中运行缓慢,并且作为可执行 jar

java - Spring @Controller 异常处理程序和全局异常处理程序。如何调用两者

java - 如何正确更新 Spring Boot 依赖项

redis - 什么是 Redis 改变自己的配置

java - JAXB 忽略响应 XML 中的 'extra' 元素

java - 无法在azure windows vm上使用application Insights代理启动java spring boot应用程序

xcode - macOS 上的 Redis Graph 编译

database-design - 用于对基于时间的值进行排序的 Redis 数据结构设计