首页 > 编程 > Java > 正文

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

2019-11-26 08:41:23
字体:
来源:转载
供稿:网友

使用的是maven工程

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

1、在pom文件中引入即可

 <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-redis</artifactId></dependency>

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

官网的原文是这样的,也就是说,提供三个接口注入和你自己实现的其他实现类,默认是本地端口号为6379的redis

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这样写的

@Servicepublic class RedisCacheServiceImpl<K,V> implements CacheService<K,V> {  @Autowired  RedisTemplate<K, V> redisTemplate;    public void set(K key, V value) {    redisTemplate.opsForValue().set(key, value);  }}

ok,这样我们即可使用springBoot默认提供的redis服务,但是这样有几个问题,1序列化,我们set到redis服务器中的key是这样的

我们直接在cli中get key发现,在redisClent中发现是一堆看不懂的字符,解决这个问题就需要将key和value序列化,如果是xml配置的

我们直接注入官方给定的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<String,Long> map=new HashMap();    map.put("test",60L);    rcm.setExpires(map);*/    return rcm;  }  /**   * RedisTemplate配置   * @param factory   * @return   */  @Bean  public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {    StringRedisTemplate template = new StringRedisTemplate(factory);    //定义key序列化方式    //RedisSerializer<String> 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;基本解决了相关的序列化问题;代码有参考!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表