Redis pipe хранит данные в разных БД - PullRequest
0 голосов
/ 28 августа 2018

У нас есть пара микро-сервисов, которые используют один и тот же кластер redis. Каждый использует разные базы данных Redis одного и того же кластера Redis. Моим микро-сервисом является Java Boot Application, и я использую библиотеку jedis для работы с кластером redis. В моем сервисе у меня есть запланированное задание, которое выполняется каждые 4 часа и извлекает данные из стороннего сервиса и временно сохраняет полученные данные в кеше redis. Я использую конвейер для хранения всех данных с помощью одного вызова сервера Redis.

В моей локальной среде, которая отлично работает, но в развернутой среде у нас есть большая проблема. Иногда часть данных хранится в разных БД Redis. Одна часть хранится в нужной базе данных (в моем случае DB4), а другая часть хранится, вероятно, в стандартной базе данных Redis (DB0).

Это моя реализация RedisClient.java

private Integer timeout = 2000;
private JedisPool jedisPool;

@PostConstruct
private void init() {
    final JedisPoolConfig poolConfig = new JedisPoolConfig();
    poolConfig.setMaxTotal(15);
    poolConfig.setTestOnBorrow(true);
    poolConfig.setBlockWhenExhausted(true);
    jedisPool = new JedisPool(poolConfig, host, port, timeout);
}

@PreDestroy
public void destroy() {
    jedisPool.destroy();
}

public Pipeline getPipeline(int dbIndex) {
    Pipeline pipeline = null;
    try (Jedis jedis = jedisPool.getResource()) {
        jedis.select(dbIndex);
        pipeline = jedis.pipelined();
    } catch (Exception e) {
        log.error("failed on getPipeline, db index {}", dbIndex, e);
    }
    return pipeline;
}

И вот как я использую его для хранения данных (несколько больших вариантов, более 1000 наименований):

@Autowired
private RedisClient redisClient;

private ObjectMapper objectMapper = new ObjectMapper();

public void saveAllVariants(Set<Variant> allVariantsSet) {
    try {
        final Pipeline pipeline = redisClient.getPipeline(4); // use redis DB4
        for (Variant variant : allVariantsSet) {
            String idKey = "variants:id:" + variant.getId();
            String variantStr = objectMapper.writeValueAsString(variant); // convert to JSON object
            pipeline.set(idKey.getBytes(), variantStr.getBytes());
        }
        pipeline.sync();
    } catch (Exception e) {
        log.error("Problem in saving variants in cache. Error: ", e.getMessage());
    }
}

Как возможно, что эта проблема произошла? Что я делаю не так? Каковы другие эффективные методы хранения большого объема данных на Redis.

...