美文网首页
springboot+redis整合

springboot+redis整合

作者: _麻辣香锅不要辣 | 来源:发表于2019-03-31 23:00 被阅读0次

    导包

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

    配置redis配置项

    spring:
      redis:
        host: localhost
          port: 6379
          password: ""
          timeout: 1000
    

    redisTemplate的配置

    @Configuration
    @EnableCaching
    public class RedisConfig extends CachingConfigurerSupport {
    
      @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
    
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jacksonSeial()))
                .disableCachingNullValues();
    
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .transactionAware()
                .build();
        return cacheManager;
    }
        /**
         * retemplate相关配置
         * @param factory
         * @return
         */
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            // 配置连接工厂
            template.setConnectionFactory(factory);
            // 值采用json序列化
            template.setValueSerializer(jacksonSeial());
            //使用StringRedisSerializer来序列化和反序列化redis的key值
            template.setKeySerializer(new StringRedisSerializer());
    
            // 设置hash key 和value序列化模式
            template.setHashKeySerializer(new StringRedisSerializer());
            template.setHashValueSerializer(jacksonSeial());
            template.afterPropertiesSet();
    
            return template;
        }
    
        public Jackson2JsonRedisSerializer jacksonSeial()
        {
            //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
            Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
            ObjectMapper om = new ObjectMapper();
            // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            jacksonSeial.setObjectMapper(om);
            return jacksonSeial;
        }
    
    //缓存对象集合中,缓存是以key-value形式保存的。当不指定缓存的key时,SpringBoot会使用KeyGenerator 生成key。
     @Bean
        public KeyGenerator keyGenerator() {
            return new KeyGenerator() {
                @Override
                public Object generate(Object o, Method method, Object... objects) {
                    StringBuilder sb = new StringBuilder();
    //                sb.append(o.getClass().getName());
                    sb.append(method.getName());
                    for (Object obj : objects) {
                        sb.append(obj.toString());
                    }
                    return sb.toString();
                }
            };
        }
    }
    
    

    测试

    使用redistemplate

        @Autowired
        private UserMapper userMapper;
        @Autowired
        private RedisTemplate redisTemplate;
        @Override
        //@Cacheable(value = "userlist",keyGenerator = "keyGenerator")
        public List<User> findAllUserList() {
            //如果redis中有的话就从redis中取
            Object obj=redisTemplate.opsForValue().get("userlist");
            if(obj!=null)
            {
                System.out.println("find in redis");
                List<User> userlist=JSONObject.parseArray(JSON.toJSONString(obj),User.class);
                return userlist;
            }else
            {
              //如果redis中没有的话,就从mysql中找,并存入redis中
                System.out.println("find in db");
                redisTemplate.opsForValue().set("userlist",userMapper.selectAll());
                return userMapper.selectAll();
           }
        }
    
    结果如下:

    value为json字符串格式。因为在RedisConfig 中设置了自定义的序列化方式;

    使用cache注解方式

       @Override
       @Cacheable(value = "userlist",keyGenerator = "keyGenerator")
        public List<User> findAllUserList() {
                System.out.println("find in db");
                return userMapper.selectAll();
        }
    
    结果如下:

    可以发现key值不一样,因为在RedisConfig中配置了,keygenerator会根据方法名和参数拼接成一个key

    @Bean
        public KeyGenerator keyGenerator() {
            return new KeyGenerator() {
                @Override
                public Object generate(Object o, Method method, Object... objects) {
                    StringBuilder sb = new StringBuilder();
    //                sb.append(o.getClass().getName());
                    sb.append(method.getName());
                    for (Object obj : objects) {
                        sb.append(obj.toString());
                    }
                    return sb.toString();
                }
            };
        }
    

    相关文章

      网友评论

          本文标题:springboot+redis整合

          本文链接:https://www.haomeiwen.com/subject/ykkpbqtx.html