Как сделать массовую вставку в Redis с помощью JAVA?

Привет, мне нужно сделать несколько вставок формы

SADD ключевое значение

У меня есть пара "ключ-значение", и мне нужно знать, как выполнять массовые вставки с помощью JAVA. Я написал файл в протоколе Redis. Как действовать дальше


person marvel308    schedule 09.06.2015    source источник
comment
Не могли бы вы опубликовать свой файл?   -  person Re Captcha    schedule 09.06.2015
comment
он имеет команды вида * 3 \ r \ n $ 4 \ r \ nSADD \ r \ n $ 3 \ r \ nkey \ r \ n $ 5 \ r \ nvalue \ r \ n, как указано в ссылке redis.io/topics/mass-insert   -  person marvel308    schedule 09.06.2015


Ответы (2)


Если у вас есть входные данные, записанные в формат протокола Redis, почему бы просто не использовать режим конвейера redis-cli или nc? Это объясняется в http://redis.io/topics/mass-insert.

Если у вас есть массовые (ключ, значение) входы, вы можете использовать Jedis для выполнения sadd с конвейерной обработкой, чтобы получить более высокую производительность.

В приведенном ниже примере предполагается, что iter (Iterator) имеет элементы, каждый элемент является формой значения ключа "\ t".

try (Jedis jedis = new Jedis(host, port)) {
  Pipeline pipeline = jedis.pipelined();
  while (iter.hasNext()) {
    String[] keyValue = iter.next().split("\t");
    pipeline.sadd(keyValue[0], keyValue[1]);
    // you can call pipeline.sync() and start new pipeline here if you think there're so much operations in one pipeline
  }
  pipeline.sync();
}
person Jungtaek Lim    schedule 11.06.2015
comment
можно с уверенностью сказать, что эта функция находится в нестабильной ветке - person kommradHomer; 11.06.2015
comment
Нет, документ устарел. Он доступен с версии 3.0.0-beta. См. github.com/antirez/redis/commit/ и просмотрите теги. - person Jungtaek Lim; 12.06.2015
comment
redis-cli --pipe не работает в 3.0.1, а если я использую только redis-cli, он работает - person marvel308; 12.06.2015
comment
Хорошо, это исправлено, я не добавлял \ r \ n в конце команды должным образом. в настоящее время я выполняю операцию из командной строки с помощью команды Process p = Runtime.getRuntime (). exec (new String [] {bash, -c, cat somefile.txt | redis-cli --pipe}); любой способ по умолчанию сделать это в JAVA ?? - person marvel308; 12.06.2015
comment
Нет, я думаю, у тебя все хорошо. Если у вас есть пары групповых (ключ, значение) вместо формата протокола, исходный код в ответе может вам помочь. - person Jungtaek Lim; 12.06.2015

Если вы выполняете фактические операции чтения / записи через Spring CacheManager с RedisTemplate, настроенным на использование Redis в качестве кеша, вы также можете использовать executePipelined метод RedisTemplate, который принимает обратный вызов в качестве аргумента. Обратный вызов должен определять метод doInRedis, который выполняет ту работу (операции чтения / записи) в Redis, которую вы хотите выполнять в пакете.

Следующий код показывает вставку списка объектов, заключенных в интерфейс CacheableObject, который имеет getKey () и getValue (), путем вызова redisTemplate.opsForHash (). Put ().

@Component
public class RedisClient {
  @Autowired
  RedisTemplate redisTemplate;  
  
  //batch-insert using Redis pipeline, a list of objects into the cache specified by cacheName
  public void put(String cacheName, List<CacheableObject> objects) {
    try {
      this.redisTemplate.executePipelined(new RedisCallback<Object>() {
        @Override
        public Object doInRedis(RedisConnection connection) throws DataAccessException {
          for(CacheableObject object: objects) {
            redisTemplate.opsForHash().put(cacheName, object.getKey(), object.getValue()); 
          }
          return null;
        }
      });
    }
    catch(Exception e) {
        log.error("Error inserting objects into Redis cache: {}", e.getMessage());
    }
}

Сам RedisTemplate настраивается с использованием класса конфигурации, например следующего:

@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport implements 
                                                               CachingConfigurer {

  @Value("${redis.hostname}")
  private String redisHost;
  @Value("${redis.port}")
  private int redisPort;
  @Value("${redis.timeout.secs:1}")
  private int redisTimeoutInSecs;
  @Value("${redis.socket.timeout.secs:1}")
  private int redisSocketTimeoutInSecs;
  @Value("${redis.ttl.hours:1}")
  private int redisDataTTL;

  @Bean
  JedisConnectionFactory jedisConnectionFactory() {
     RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisHost, redisPort);
     return new JedisConnectionFactory(redisStandaloneConfiguration);
  }
 
  @Bean
  public RedisTemplate<Object, Object> redisTemplate() {
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
    redisTemplate.setConnectionFactory(jedisConnectionFactory());
    return redisTemplate;
}   

  @Bean
  public RedisCacheManager redisCacheManager (JedisConnectionFactory jedisConnectionFactory) {
    RedisCacheConfiguration redisCacheConfiguration = 
            RedisCacheConfiguration.defaultCacheConfig().disableCachingNullValues()
            .entryTtl(Duration.ofHours(redisDataTTL)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.java()));
    redisCacheConfiguration.usePrefix();
    RedisCacheManager redisCacheManager = 
            RedisCacheManager.RedisCacheManagerBuilder.
            fromConnectionFactory(jedisConnectionFactory)
            .cacheDefaults(redisCacheConfiguration).build();
    redisCacheManager.setTransactionAware(true);
    return redisCacheManager;
}

  @Bean
  public JedisPoolConfig poolConfig() {
    final JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    jedisPoolConfig.setTestOnBorrow(true);
    jedisPoolConfig.setMaxTotal(100);
    jedisPoolConfig.setMaxIdle(100);
    jedisPoolConfig.setMinIdle(10);
    jedisPoolConfig.setTestOnReturn(true);
    jedisPoolConfig.setTestWhileIdle(true);
    return jedisPoolConfig;
}

  @Override
  public CacheErrorHandler errorHandler() {
    return new RedisCacheErrorHandler();
  }
}
person Balaji Rathakrishnan    schedule 14.05.2021