zoukankan      html  css  js  c++  java
  • SpringBoot集成redis的key,value序列化的相关问题

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

    复制代码
    @Service
    public 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;
        }
    
    }
    复制代码

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

  • 相关阅读:
    使用phantomjs进行刷商务通对话
    利用python打造自己的ftp暴力破解工具
    notepad++开发中常用的插件
    织梦重装漏洞其实并不是那么好利用
    织梦开启调试模式
    网站安全开发人员不可缺少的火狐插件
    dos批量替换当前目录后缀名
    wpf 帧动画
    C 语言 mmap
    C 语言 ioctl
  • 原文地址:https://www.cnblogs.com/liuchuanfeng/p/7009027.html
Copyright © 2011-2022 走看看