Java 使用spring数据redis在redis中存储原始json
我正在使用RedisCacheManager在spring boot应用程序中存储缓存数据。默认序列化程序似乎将所有内容序列化为字节,并从字节反序列化为适当的java类型 但是,我希望将缓存数据存储为json,这样我就可以从非java客户端读取它 我发现从默认的序列化程序切换到其他序列化程序(如Jackson2JSONRedisalizer)应该可以工作。执行此操作后,反序列化阶段失败 pom.xmlJava 使用spring数据redis在redis中存储原始json,java,json,spring,serialization,spring-data,Java,Json,Spring,Serialization,Spring Data,我正在使用RedisCacheManager在spring boot应用程序中存储缓存数据。默认序列化程序似乎将所有内容序列化为字节,并从字节反序列化为适当的java类型 但是,我希望将缓存数据存储为json,这样我就可以从非java客户端读取它 我发现从默认的序列化程序切换到其他序列化程序(如Jackson2JSONRedisalizer)应该可以工作。执行此操作后,反序列化阶段失败 pom.xml <dependency> <groupId>o
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
org.springframework.data
spring数据redis
redis.clients
绝地武士
CacheConfig.java
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public RedisConnectionFactory createRedisConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName("localhost");
return factory;
}
// SPRING-DATA-REDIS ALREADY PROVIDES A STRING REDIS TEMPLATE, SO THE FOLLOWING IS NOT NECESSARY
// @Bean
// public RedisTemplate<String, String> createRedisTemplate(RedisConnectionFactory factory) {
// RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
// redisTemplate.setConnectionFactory(factory);
// return redisTemplate;
// }
@Bean
public CacheManager redisCacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
return cacheManager;
}
}
@配置
@启用缓存
公共类CacheConfig{
@豆子
公共RedisConnectionFactory createRedisConnectionFactory(){
JedisConnectionFactory=新的JedisConnectionFactory();
setHostName(“localhost”);
返回工厂;
}
//SPRING-DATA-REDIS已经提供了一个字符串REDIS模板,因此不需要以下内容
//@Bean
//公共RedisTemplate createRedisTemplate(RedisConnectionFactory工厂){
//RedisTemplate RedisTemplate=新RedisTemplate();
//redisTemplate.setConnectionFactory(工厂);
//返回模板;
// }
@豆子
公共缓存管理器redisCacheManager(RedisTemplate RedisTemplate){
RedisCacheManager cacheManager=新的RedisCacheManager(redisTemplate);
返回缓存管理器;
}
}
有没有办法将它们存储为纯JSON格式并成功地从中反序列化?将其添加到您的配置中,以便在redis模板中显式设置jackson序列化程序
public @Bean RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
public@Bean RedisTemplate RedisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate=新RedisTemplate();
模板.setConnectionFactory(connectionFactory);
setDefaultSerializer(新的GenericJackson2JsonRedisSerializer());
setKeySerializer(新的StringRedisSerializer());
setHashKeySerializer(新的GenericJackson2JsonRedisSerializer());
setValueSerializer(新的GenericJackson2JsonRedisSerializer());
返回模板;
}
我通过定义RedisConnectionFactory实现了这一点
@Bean
public RedisConnectionFactory jedisPool()
{
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(new JedisPoolConfig());
jedisConnectionFactory.setHostName("localhost");
return jedisConnectionFactory;
}
然后使用StringRedis模板
ValueOperations<String, String> ops = redisTemplate.opsForValue();
ops.set("key", "Json_string");
ValueOperations-ops=redisTemplate.opsForValue();
操作集(“键”、“Json_字符串”);
我希望这会有帮助 至少从spring data jpa:2.0.2.RELEASE开始,配置默认redis模板不会影响@Cacheable annotation系列访问redis的方式。 无论如何,因为我使用redis模板的目的不止这些,所以我不想这么做 但是,这会隔离缓存管理器的配置,并按预期工作:
@Configuration
@EnableCaching
public class RedisCacheManagerConfiguration {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public CacheManager redisCacheManager() {
RedisSerializationContext.SerializationPair<Object> jsonSerializer =
RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer());
return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory)
.cacheDefaults(
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1))
.serializeValuesWith(jsonSerializer)
)
.build();
}
}
@配置
@启用缓存
公共类重新缓存管理器配置{
@自动连线
私有RedisConnectionFactory RedisConnectionFactory;
@豆子
公共缓存管理器redisCacheManager(){
RedisSerializationContext.SerializationPair jsonSerializer=
RedisSerializationContext.SerializationPair.fromSerializer(新的GenericJackson2JsonRedisSerializer());
返回RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(重新连接工厂)
.cacheDefaults(
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(持续天数(1))
.serializeValuesWith(jsonSerializer)
)
.build();
}
}
它使用了Redis的通用Json序列化程序(GenericJackson2JsonRedisSerializer)
您还可以配置缓存管理器的其他方面,例如redis中密钥的生存时间。我已经尝试过了,但redis中的缓存数据仍以字节为单位。像
“\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f\xdf\x02\x00\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00\x00xp\x00\x00\x00\x00\x00\x00\x00\x01”
你检查过我更新的答案了吗?让我知道。如果我们使用crudepository模式来持久化数据,这不起作用?这可能适用于较旧版本的spring data redis,但不适用于最新版本ATMYou是对的,如果您直接使用redisTemplate,您可以完全控制数据的进出。然而,在我的例子中,我使用了缓存注释,例如,@Cacheable
,@Cacheput
,其中cacheManager使用redisTemplate进行缓存操作。这会对您有所帮助吗?