springBoot集成redis的key,value序列化的相关问题

网友投稿 296 2022-12-30


springBoot集成redis的key,value序列化的相关问题

使用的是maven工程

springBoot集成redis默认使用的是注解,在官方文档中只需要2步;

1、在pom文件中引入即可

org.springframework.boot

spring-boot-starter-redis

2、编写一个CacheService接口,使用redisCacheServiceImpl实现这个接口

You can inject an auto-configured RedisConnectionFactory, StringRedisTemplate or vanilla RedisTemplate instance as you would any other Spring Bean.By default the instance will attempt to connect to a Redis server using localhost:6379:

我自己的redisCacheServiceImpl这样写的

@Service

public class RedisCacheServiceImpl implements CacheService {

@Autowired

RedisTemplate redisTemplate;

public void set(K key, V value) {

redisTemplate.opsForValue().set(key, value);

}

}

我们直接注入官方给定的keySerializer,valueSerializer,hashKeySerializer即可,那么使用注解的话我们需要自己编写RedisCacheConfig配置类

缓存主要有几个要实现的类:

1、CacheManager缓存管理器;

2、具体操作实现类;

3、CacheManager工厂类(这个可以使用配置文件配置的进行注入,也可以通过编码的方式进行实现);

4、缓存key生产策略(当然Spring自带生成策略,但是在Redis客户端进行查看的话是系列化的key,对于我们肉眼来说就是感觉是乱码了,这里我们先使用自带的缓存策略)。

/**

* 缓存管理(注解用)

* @author Administrator

*/

@Configuration

@EnableCaching//启用缓存的意思

public class CacheConfig extends CachingConfigurerSupport{

/**

* 自定义key. 这个可以不用

* 此方法将会根据类名+方法名+所有参数的值生成唯一的一个key,即使@Cacheable中的value属性一样,key也会不一样。

*/

/* @Override

public KeyGenerator keyGenerator() {

System.out.println("RedisCacheConfig.keyGenerator()");

returnnew KeyGenerator() {

@Override

public Object generate(Object o, Method method, Object... objects) {

// This will generate a unique key of the class name, the method name

//and all method parameters appended.

StringBuilder sb = new StringBuilder();

sb.append(o.getClass().getName());

sb.append(method.getName());

for (Object obj : objects) {

sb.append(obj.toString());

}

System.out.println("keyGenerator=" + sb.toString());

returnsb.toString();

}

};

}

*/

@Bean

public CacheManager cacheManager(RedisTemplate redisTemplate) {

RedisCacheManager rcm = new RedisCacheManager(redisTemplate);

/* //设置缓存过期时间

// rcm.setDefaultExpiration(60);//秒

//设置value的过期时间

Map map=new HashMap();

map.put("test",60L);

rcm.setExpires(map);*/

return rcm;

}

/**

* RedisTemplate配置

* @param factory

* @return

*/

@Bean

public RedisTemplate redisTemplate(RedisConnectionFactory factory) {

StringRedisTemplate template = new StringRedisTemplate(factory);

//定义key序列化方式

//RedisSerializer redisSerializer = new StringRedisSerializer();//Long类型会出现异常信息;需要我们上面的自定义key生成策略,一般没必要

//定义value的序列化方式

Jackson2jsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(om);

// template.setKeySerializer(redisSerializer);

template.setValueSerializer(jackson2JsonRedisSerializer);

template.setHashValueSerializer(jackson2JsonRedisSerializer);

template.afterPropertiesSet();

return template;

}

}

当数据存储到redis中时候key和value都是通过spring serializer进行序列化的,

RedisTemplate, spring默认会使用jdk序列化,如果使用jdk序列化,model模型必须实现Serializable且要有一个空的构造器,

StringRedisTemplate 默认是使用StringSerializer,同时springData还提供了其他的序列化方式,如下:

GenericToStringSerializer:使用Spring转换服务进行序列化;

JacksonJsonRedisSerializer:使用Jackson 1,将对象序列化为JSON;

Jackson2JsonRedisSerializer:使用Jackson 2,将对象序列化为JSON;

JdkSerializationRedisSerializer:使用java序列化;

OxmSerializer:使用Spring O/X映射的编排器和解排器(marshaler和unmarshaler)实现序列化,用于XML序列化;

StringRedisSerializer:序列化String类型的key和value。实际上是String和byte数组之间的转换

ok;基本解决了相关的序列化问题;代码有参考!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何做的接口测试工具(哪些工具可以做接口测试)
下一篇:系统接口设计报告(系统接口设计案例)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~