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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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