Java 使用spring数据redis将500k记录插入redis

Java 使用spring数据redis将500k记录插入redis,java,spring-boot,redis,spring-data-redis,Java,Spring Boot,Redis,Spring Data Redis,我使用redis作为缓存,一旦我要从oracle数据库获取一个表,然后将这些记录插入redis缓存。我将存储库用于这两个方面,因此我会做一些类似的事情: oracleRepo.findAll().forEach(record -> { RedisEntity redisEntity = objectMapper.convertValue(record, RedisEntity.class); redisRepo.save(redisEnti

我使用redis作为缓存,一旦我要从oracle数据库获取一个表,然后将这些记录插入redis缓存。我将存储库用于这两个方面,因此我会做一些类似的事情:

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

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

一种可能的方法是批量接收Oracle的响应,并在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;
  }
});
//从队列中弹出指定数量的项
列表结果=stringRedisTemplate.ExecutePilined(
新的回调函数(){
公共对象doInRedis(重新连接)引发DataAccessException{
StringRedisConnection stringRedisConn=(StringRedisConnection)连接;
对于(int i=0;i

您将如何使用这些数据?我建议您尝试以反映其预期用途的方式将其存储在缓存中。如果一次需要页面,可以将所有这些值存储在一个键中。现在的问题是,您要单独存储每个记录,因此缓存的往返次数为500k(从DB加载后)。您可以使用SpringCache,也可以使用Redisson,它允许许多不同类型的数据,允许您存储这些数据并对其进行批处理。我个人并不熟悉Spring data redis。它将用作查找数据,因此我需要缓存中的所有数据。这与其说是缓存的问题,不如说是缓存方式的问题,更重要的是如何缓存以及如何从缓存加载数据。您是将这些记录分别从缓存中取回(当您保存它们时),还是将在单个缓存键中缓存多个记录?现在,您没有将保存批处理到缓存,因此这是O(n)个往返。如果您可以将所有这些记录存储在一个键上,那么您可以首先对其进行循环,执行一些基本处理,最后向缓存写入一次。这里有很多因素,但如果你预处理数据并写入缓存的次数更少,生活会更好。除非我认为redis是错误的,否则我想单独存储每条记录,以便在时间到来时使用此查找数据,我可以使用键获得所需的单个记录。不确定在一个键下保存所有记录是否仍然可以。我需要经常使用不同的键来查找数据。你的理解是正确的,我只是想确保你必须像这样写500k。我简要回顾了SpringDataRedis,并没有在他们的文档页面上看到大量插入或批量插入,但是,我确实发现了管道:,以及引用;您也可以尝试使用StringRedisTemplate。根据存储的数据,如果希望使用原始命令,则可以使用MSET操作,该操作可以一次写入多个键。