• 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;基本解决了相关的序列化问题;代码有参考!

  • 相关阅读:
    003-notepad++插件
    002-notepad++语言,编码,字体,背景色
    001-notepad++下载安装、添加右键
    015-elasticsearch5.4.3【五】-搜索API【四】Joining 多文档查询、GEO查询、moreLikeThisQuery、script脚本查询、span跨度查询
    014-elasticsearch5.4.3【五】-搜索API【三】复合查询boolQuery、constantScoreQuery、disMaxQuery
    013-elasticsearch5.4.3【五】-搜索API【二】term术语查询-termQuery、rangeQuery、existsQuery、prefixQuery、wildcardQuery、regexpQuery、fuzzyQuery
    012-elasticsearch5.4.3【五】-搜索API【一】搜索匹配所有matchAllQuery、全文查询[matchQuery、multiMatchQuery、commonTermsQuery、queryStringQuery、simpleQueryStringQuery]
    011-elasticsearch5.4.3【四】-聚合操作【二】-桶聚合【bucket】过滤、嵌套、反转、分组、排序、范围
    010-elasticsearch5.4.3【四】-聚合操作【一】-度量聚合【metrics】-min、max、sum、avg、count
    009-elasticsearch5.4.3【三】搜索概述-查询模型、分页、ES数据类型
  • 原文地址:https://www.cnblogs.com/liuchuanfeng/p/7009027.html
Copyright © 2020-2023  润新知