Я очень новичок в Java программировании. Я C# разработчик. Я работал над одним из небольших проектов, где мы хотим использовать кэш redis вместо ehcache.
Мы используем spring.data.redis версии 2.2.3.RELEASE и redis.client.jedis версии 3.2.0.
Вот мой класс redisconf, который также содержит RedisTemplate:
public class RedisConf {
private String REDIS_HOSTNAME = "localhost";
private int REDIS_PORT = 6379;
protected JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(REDIS_HOSTNAME, REDIS_PORT);
JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder().usePooling().build();
JedisConnectionFactory factory = new JedisConnectionFactory(configuration,jedisClientConfiguration);
factory.afterPropertiesSet();
return factory;
}
public RedisTemplate<String,Element> redisTemplate() {
final RedisTemplate<String,Element> redisTemplate = new RedisTemplate<String,Element>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new GenericToStringSerializer<Object>(Object.class));
redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setConnectionFactory(jedisConnectionFactory());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
Вот как создается экземпляр класса RedisConf:
RedisConf rf = new RedisConf();
RedisTemplate<String, Element> redisTemplate = rf.redisTemplate();
redisTemplate.getConnectionFactory().getConnection().ping();
cache = new RedisDelegate(redisTemplate);
Вот мой класс RedisDeligate, где я выполняю все операции get и put:
public class RedisDelegate implements Cache {
private final RedisTemplate<String,Element> redisTemplate;
private final Logger LOGGER = LoggerFactory.getLogger(RedisDelegate.class);
private static String REDIS_KEY = "Redis";
public RedisDelegate(RedisTemplate<String,Element> redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
public String getName() {
return "my-redis";
}
@Override
public Object getNativeCache() {
return this.redisTemplate;
}
@Override
public Element get(Object key) {
try {
LOGGER.debug("Key is: {}", key);
Object element = this.redisTemplate.opsForHash().get(REDIS_KEY, key);
LOGGER.debug("element Object is: {}", element);
return (element == null) ? null : (Element) element;
//return (Element) this.redisTemplate.opsForHash().get(REDIS_KEY, key);
} catch (Exception e) {
LOGGER.error(e.getMessage());
}
return null;
}
@Override
public void put(Element element) {
this.redisTemplate.opsForHash().put(REDIS_KEY, element.key(), element);
}
@Override
public void evict(Object key) {
this.redisTemplate.opsForHash().delete(REDIS_KEY, key);
}
@Override
public void clear() {
redisTemplate.execute((RedisCallback<Object>) connection -> {
connection.flushDb();
return null;
});
}
}
Вот CacheElement Объект, который я пытаюсь поместить в кеш, который реализует Serializable, как показано ниже:
public class CacheElement implements Element, Serializable {
.
.
.
}
Когда я пытаюсь поместить объект в кеш, происходит сбой с ошибкой, что сериализация не удалась. Я знаю, что есть некоторая проблема с моим RedisTemplate, но я не вижу, чтобы выяснить это. Вот ошибка, которую я получаю:
Невозможно сериализовать; вложенным исключением является org.springframework.core.serializer.support.SerializationFailedException: не удалось сериализовать объект с помощью DefaultSerializer; вложенное исключение: java .lang.IllegalArgumentException: DefaultSerializer требуется сериализуемая полезная нагрузка, но получен объект типа [io.gravitee.policy.cache.resource.CacheElement]
EDIT
Я пытаюсь сохранить экземпляр класса CacheElement в Redis:
public class CacheElement implements Element {
private final String key;
private final CacheResponse response;
private int timeToLive = 0;
public CacheElement(String key, CacheResponse response) {
this.key = key;
this.response = response;
}
public int getTimeToLive() {
return timeToLive;
}
public void setTimeToLive(int timeToLive) {
this.timeToLive = timeToLive;
}
@Override
public Object key() {
return key;
}
@Override
public Object value() {
return response;
}
@Override
public int timeToLive() {
return timeToLive;
}
}
Объект CacheResponse содержит буфер.
public class CacheResponse {
private int status;
private HttpHeaders headers;
private Buffer content;
public Buffer getContent() {
return content;
}
public void setContent(Buffer content) {
this.content = content;
}
public HttpHeaders getHeaders() {
return headers;
}
public void setHeaders(HttpHeaders headers) {
this.headers = headers;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
Я хотел бы сериализовать этот CacheElement возьмите объект и сохраните его в Redis. Я также хотел бы десериализовать его при операции get.
Буду признателен за помощь в устранении этой проблемы. Как я уже говорил, я не Java разработчик. Я родом из C# и мира визуальных студий. Спасибо