Как ошибки кеша обрабатываются в Spring-Data-Redis MultiGet? - PullRequest
0 голосов
/ 14 октября 2019

Я использую кэш Redis (через клиент Jedis), и я хотел бы использовать ValueOperations#multiGet, который принимает Collection ключей и возвращает List объектов изкеш, в том же порядке. У меня вопрос, что происходит, когда некоторые ключи находятся в кеше, а другие нет? Мне известно, что под ним используется Redis MGET , который возвращает nil для любых элементов, которых нет в кэше.

Я не могу найти никакой документации о том, как ValueOperations будетинтерпретировать этот ответ. Я предполагаю, что они будут null и, безусловно, могут его протестировать, но было бы опасно строить систему на недокументированном поведении.

Для полноты, вот как настроен клиент кэша:

@Bean
public RedisConnectionFactory redisConnectionFactory() {
    JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();

    redisConnectionFactory.setHostName(address);
    redisConnectionFactory.setPort(port);

    redisConnectionFactory.afterPropertiesSet();
    return redisConnectionFactory;
}

@Bean
public ValueOperations<String, Object> someRedisCache(RedisConnectionFactory cf) {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(cf);
    redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
    redisTemplate.afterPropertiesSet();
    return redisTemplate.opsForValue();
}

Я использую spring-data-redis:2.1.4

Итак, есть ли документация по этому поводу или какой-то надежный источник правды?

1 Ответ

0 голосов
/ 28 октября 2019

После некоторого возни, похоже, что ответ как-то связан с используемым сериализатором - в данном случае GenericJackson2JsonRedisSerializer. Не желая копать слишком много, я просто написал тест, подтверждающий, что любые значения (nil), возвращаемые Redis, преобразуются в null:

@Autowired
ValueOperations<String, SomeObject> valueOperations

@Test
void multiGet() {
    //Given
    SomeObject someObject = SomeObject
            .builder()
            .contentId("key1")
            .build()
    valueOperations.set("key1", someObject)

    //When
    List<SomeObject> someObjects = valueOperations.multiGet(Arrays.asList("key1", "nonexisting"))

    //Then
    assertEquals(2, someObjects.size())
    assertEquals(someObject, someObjects.get(0))
    assertEquals(null, someObjects.get(1))
}

Итак, в Redis это:

127.0.0.1:6379> MGET "\"key1\"" "\"nonexisting\""
1) "{\"@class\":\"some.package.SomeObject\",\"contentId\":\"key1\"}"
2) (nil)

Результатом будет List из {SomeObject, null}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...