Вставка 500 тыс. Записей в Redis с использованием Spring-Data-Redis - PullRequest
0 голосов
/ 14 февраля 2019

Я использую redis в качестве кеша, и как только я собираюсь извлечь таблицу из базы данных оракула, а затем вставить эти записи в кеш redis.Я использую репозитории для обоих, поэтому я делаю что-то вроде:

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

Тем не менее, это довольно медленно, когда я сохраняю его на Redis, так как это около 500 тыс. Записей.Я знаю, что могу улучшить способ извлечения из базы данных и использовать нумерацию страниц, но улучшит ли это сохранение на redis.Есть ли способ сделать пакетную вставку в Redis, потому что сейчас кажется, что он открывает и закрывает соединение Redis для каждой записи, которую пытается сохранить.

1 Ответ

0 голосов
/ 16 февраля 2019

Одним из возможных способов является пакетная обработка ответов от Oracle и использование redis-pipe для установки этих ключей на сервере Redis.

Отправка нескольких команд на сервер Redis с использованием конвейера позволитпродолжайте обработку пакетов, не дожидаясь ответов для операции evert SET.

Вот пример кода из весенней загрузки при использовании конвейера 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

...