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

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

2 ответа

Решение

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

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);
}
Другие вопросы по тегам