springboot缓存(redis缓存)

2019-06-25  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读