美文网首页
springboot缓存(redis缓存)

springboot缓存(redis缓存)

作者: 老街老街 | 来源:发表于2019-06-25 10:47 被阅读0次

    一. Spring缓存的介绍
    作用:在高并发下,能缓解对数据库的访问压力。
    Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术;并支持使用JCache(JSR-107)注解简化我们开发;
    Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;
    Cache接口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache (本地缓存),ConcurrentMapCache等;
    每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。
    使用Spring缓存抽象时我们需要关注以下两点;
    1、确定方法需要被缓存以及他们的缓存策略
    2、从缓存中读取之前缓存存储的数据


    image.png
    image.png
    image.png
    image.png

    二.程序整合缓存
    整合redis缓存主要有两种方法,一种是RedisTemplate,另外一种是注解形式。本文使用的是注解形式。
    1.引入jar

    image.png
    2.在application中加入
    image.png
    3.配置
    @Slf4j
    @Configuration
    @EnableCaching
    // 自动配置
    @ConditionalOnClass(RedisOperations.class)
    /此注解的作用,使使用@ConfigurationProperies注解的类生效,相当于把使用@ConfigurationProperties 的类进行了一次注入/
    @EnableConfigurationProperties(RedisProperties.class)
    public class RedisConfig extends CachingConfigurerSupport {
    /**
     *  设置 redis 数据默认过期时间,默认1天
     *  设置@cacheable 序列化方式
     * @return
     */
    @Bean
    public RedisCacheConfiguration redisCacheConfiguration(){
        FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();
        configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofDays(1));
        return configuration;
    }
    
    @Bean(name = "redisTemplate")
    @ConditionalOnMissingBean(name = "redisTemplate")
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        //序列化
        FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
        // value值的序列化采用fastJsonRedisSerializer
        template.setValueSerializer(fastJsonRedisSerializer);
        template.setHashValueSerializer(fastJsonRedisSerializer);
    
        // 全局开启AutoType,不建议使用
        // ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
        // 建议使用这种方式,小范围指定白名单
        ParserConfig.getGlobalInstance().addAccept("me.qjn.domain");
        ParserConfig.getGlobalInstance().addAccept("me.qjn.modules.system.service.dto");
        ParserConfig.getGlobalInstance().addAccept("me.qjn.modules.system.domain");
        ParserConfig.getGlobalInstance().addAccept("me.qjn.modules.quartz.domain");
        ParserConfig.getGlobalInstance().addAccept("me.qjn.modules.monitor.domain");
        ParserConfig.getGlobalInstance().addAccept("me.qjn.modules.security.security");
        // key的序列化采用StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
    
    /**
     * 自定义缓存key生成策略
     * 使用方法 @Cacheable(keyGenerator="keyGenerator")
     * @return
     */
    @Bean
    @Override
    public KeyGenerator keyGenerator() {
        return (target, method, params) -> {
            StringBuilder sb = new StringBuilder();
            sb.append(target.getClass().getName());
            sb.append(method.getName());
            for (Object obj : params) {
                sb.append(JSON.toJSONString(obj).hashCode());
            }
            return sb.toString();
        };
    }
    

    }

    4.使用


    image.png

    5.结果


    image.png

    参考文献:https://www.cnblogs.com/yueshutong/p/9381540.html

    相关文章

      网友评论

          本文标题:springboot缓存(redis缓存)

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