springboot+redis整合

导包

        
        
            org.springframework.boot
            spring-boot-starter-data-redis
        

配置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 redisTemplate(RedisConnectionFactory factory) {

        RedisTemplate 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 findAllUserList() {
        //如果redis中有的话就从redis中取
        Object obj=redisTemplate.opsForValue().get("userlist");
        if(obj!=null)
        {
            System.out.println("find in redis");
            List 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 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整合)