Можно ли настроить сериализацию, используемую абстракцией Spring Cache?

У меня есть веб-служба Java, которая использует Redis для кэширования. Сначала я создал CacheService, который напрямую обращался к клиенту Redisson для обработки кэширования. Недавно я провел рефакторинг обработки кэша, чтобы использовать абстракцию Spring Cache, что сделало код намного чище и способствовало модульному дизайну. К сожалению, Spring использует Джексона для сериализации/десериализации кэшированных объектов, в результате чего кэшированные значения становятся намного больше, чем раньше, из-за информации о типе, хранящейся в JSON. Это вызвало неприемлемое увеличение времени отклика при чтении из кэша. Есть ли способ настроить способ, которым Spring сериализует и десериализует кешированный контент? Я хотел бы заменить его своей собственной логикой, но ничего не вижу в документах. Я бы предпочел, если это возможно, не использовать свою собственную реализацию кэша AspectJ.


person Jared    schedule 10.06.2016    source источник


Ответы (2)


RedisCacheManager принимает RedisOperations, и вы можете настроить там, как работает сериализация. Вы можете настроить сериализацию для ключей и значений, хотя я подозреваю, что ключ должен использовать StringRedisSerializer.

person Stephane Nicoll    schedule 22.06.2016

Redisson также предоставляет Интеграция Spring Cache. Он поддерживает множество популярных кодеков: Jackson JSON, Avro, Smile, CBOR, MsgPack, Kryo, FST, LZ4, Snappy и JDK Serialization.

Вот пример:

@Bean
CacheManager cacheManager(RedissonClient redissonClient) {
    Codec codec = new JsonJacksonCodec();

    Map<String, CacheConfig> config = new HashMap<String, CacheConfig>();
    config.put("testMap", new CacheConfig(24*60*1000, 12*60*1000));
    return new RedissonSpringCacheManager(redissonClient, config, codec);
}
person Nikita Koksharov    schedule 04.08.2016