У нас есть пара микро-сервисов, которые используют один и тот же кластер 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.