使用spring-data-redis将500k记录插入Redis

时间:2019-02-14 01:28:25

标签: 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上时,它的速度非常慢,因为它大约有50万条记录。我知道我可以改善从数据库中获取数据和使用分页的方式,但是这样做可以改善保存到Redis的方式。有没有一种方法可以对redis进行批量插入,因为现在好像它正在为要保存的每个记录打开和关闭redis连接。

1 个答案:

答案 0 :(得分: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