Можно ли настроить сериализацию, используемую абстракцией 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);
}