Redisson RMap.getAll() возвращает неправильно десериализованные объекты для больших пакетов, но работает для небольших п ⇐ JAVA

Программисты JAVA общаются здесь
Anonymous
Redisson RMap.getAll() возвращает неправильно десериализованные объекты для больших пакетов, но работает для небольших п

Сообщение Anonymous »

Я использую Redisson RMap в качестве кэша и получаю данные пакетно с помощью getAll().
Исходный код

Код: Выделить всё

private static final int FETCH_LIMIT = 1000;

private void getResponseForSubsetOfKeys(Set keys,
Map responseForAllKeys,
int numIterations) {

Set subSetKeys = keys.stream()
.skip((long) numIterations * FETCH_LIMIT)
.limit(FETCH_LIMIT)
.collect(Collectors.toSet());

RMap rMap = createCacheIfNotExists();
Map response = rMap.getAll(subSetKeys);

responseForAllKeys.putAll(response);
}
Я также использую обычный доступ с помощью одной клавиши:

Код: Выделить всё

Object value = rMap.get(key);
Проблема
  • Код: Выделить всё

    rMap.get(key)
    всегда возвращает правильные данные
  • Код: Выделить всё

    rMap.getAll(subSetKeys)
    возвращает неверные данные, если FETCH_LIMIT большой (например, 1000)
  • Поле, которое должно быть строкой, иногда десериализуется как HashSet
  • Уменьшение FETCH_LIMIT решает проблему
  • Сортировка ключей или использование LinkedHashSet не помогает.
  • Сами данные Redis не повреждены
Пример:

Код: Выделить всё

rMap.get("4546")                  -> payrollId = "12345"
rMap.getAll(largeBatch).get("4546") -> payrollId = HashSet
Один и тот же ключ, разный результат в зависимости от размера пакета.

Вопрос
  • Известна ли это проблема или ограничение Redisson RMap.getAll() для больших пакетов?
  • Существует ли рекомендуемый максимальный размер пакета?
  • Исправлено ли это в какой-либо версии Redisson или требуется другой кодек?
Среда
  • Redisson 3.x
  • Java
  • Redis
  • Кодек Redisson по умолчанию
Ожидаемое поведение
Для любого ключа, хранящегося в кеше, вызовы rMap.get(key) и rMap.getAll(keys).get(key) должны возвращать один и тот же объект, независимо от размера пакета.
В частности, поля, хранящиеся как String (например, payrollId), всегда должны быть десериализованы как String.

Фактическое поведение
  • При получении одиночного ключа с помощью rMap.get(key) объект всегда десериализуется правильно.
  • При получении небольших пакетов с помощью rMap.getAll(subSetKeys) данные также верны.
  • При получении больших пакетов (например, FETCH_LIMIT = 1000) с использованием rMap.getAll, некоторые объекты десериализуются неправильно.
  • В этих случаях поле, которое должно быть строкой, десериализуется как HashSet.
  • Уменьшение размера пакета решает проблему.
Поэтому тот же ключ может возвращать значения различные структуры объектов в зависимости только от того, были ли они получены индивидуально или как часть большого пакета.

Подробнее здесь: https://stackoverflow.com/questions/798 ... rge-batche

Вернуться в «JAVA»