Я использую клиент spring-data-redis(2.1.5.RELEASE) и jedis(2.10.2) для подключения к моему экземпляру azure redis из разных служб, работающих как приложение spring-boot.
Две службы имеют одинаковые методы кэширования и указывают на один и тот же кеш, реализуя следующую конфигурацию. Проблема, с которой я сталкиваюсь, заключается в том, что когда одна служба пытается прочитать кэшированное значение, созданное другой службой, возникает исключение де-серализации.
Исключение:
org.springframework.data.redis.serializer.SerializationException: невозможно десериализовать; вложенным исключением является org.springframework.core.serializer.support.SerializationFailedException: не удалось десериализовать полезную нагрузку. Является ли массив байтов результатом соответствующей сериализации для DefaultDeserializer?; вложенным исключением является org.springframework.core.NestedIOException: не удалось десериализовать тип объекта; вложенным исключением является java.lang.ClassNotFoundException
Примечание. Я использую Redis только для кэширования данных, считанных из моей базы данных.
Redis Cache Конфигурация микросервиса 1
public RedisCacheWriter redisCacheWriter(RedisConnectionFactory connectionFactory) {
return RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
}
@Bean
public RedisCacheManager cacheManager() {
Map<String, RedisCacheConfiguration> cacheNamesConfigurationMap = new HashMap<>();
cacheNamesConfigurationMap.put("employers", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));
cacheNamesConfigurationMap.put("employees", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));
RedisCacheManager manager = new RedisCacheManager(redisCacheWriter(), RedisCacheConfiguration.defaultCacheConfig(), cacheNamesConfigurationMap);
manager.setTransactionAware(true);
manager.afterPropertiesSet();
return manager;
}
Redis Cache Конфигурация микросервиса 2
public RedisCacheWriter redisCacheWriter(RedisConnectionFactory connectionFactory) {
return RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
}
@Bean
public RedisCacheManager cacheManager() {
Map<String, RedisCacheConfiguration> cacheNamesConfigurationMap = new HashMap<>();
cacheNamesConfigurationMap.put("employees", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(90000)));
RedisCacheManager manager = new RedisCacheManager(redisCacheWriter(), RedisCacheConfiguration.defaultCacheConfig(), cacheNamesConfigurationMap);
manager.setTransactionAware(true);
manager.afterPropertiesSet();
return manager;
}
Методы кэширования в обоих сервисах
@Cacheable(value = "employees", key = "#employeesId")
public Employee getEmployee(String employeesId) {
//methods
}
Класс сотрудников в обеих службах
public class Employee implements Serializable {
private String id;
private String name;
}