SpringCache的了解与使用

SpringCache 缓存抽象Cache Abstraction

image-20220427125602034

image-20220427141841474

1、简介

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

2、基础概念

image-20220427131149268

给应用配一个或多个缓存管理器CacheManager(ConcurrentHashMap)

image-20220427131440869

两个接口=》两个功能

第一个功能按照名字得到一个缓存

Cache缓存名字 当前缓存名字

image-20220427131813489

如何从缓存里面查询一个数据

image-20220427133757066

如何从缓存中保存一个数据 按照key value保存一个数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y3D4XKO9-1651054143745)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427133854151.png)]

从缓存中按照key移除一个数据

image-20220427134158758

清空整个缓存

image-20220427134229963

第二个功能相当于获取缓存管理器中所有缓存

CacheManager(ConcurrentHashMap)

image-20220427134407687

image-20220427134659127

image-20220427134741212

store存储数据文件

image-20220427134824193

3整合SpringCache

缓存的自动配置CacheAutoConfiguration

缓存中xml所有能配的属性都在CacheProperties.class中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FvtPcRVD-1651054204879)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427135724172.png)]

缓存选择器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rt7NCmtx-1651054143751)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427135744968.png)]

CacheConfigurations.getConfigurationClass(type[i])

按照缓存类型进行映射

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YKgK5m2K-1651054143751)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427140001704.png)]

CacheAutoConfiguration会导入RedisCacheConfiguration RedisCacheConfiguration 自动加载缓存管理器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nrrlsDrs-1651054143752)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427140236231.png)]
在这里插入图片描述

缓存管理器会根据所有配置的缓存名字

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sVCLkZOK-1651054143752)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427140540762.png)]

会在RedisCacheConfiguration 进行初始化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97s4lLcS-1651054143753)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427140646570.png)]

初始化缓存做的事情非常多 拿到每一个缓存开始遍历,把缓存配置跟当前缓存名放在一起,配置都是默认配置 再利用默认配置再初始化所有的缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aizFUQNX-1651054143753)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427140700169.png)]

把初始化的缓存数据往initialCaches里一放

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nsn6vuul-1651054143754)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427140832578.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ILOTteWn-1651054143754)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427141009830.png)]

缓存规则

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NESAOjDI-1651054143754)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427141103150.png)]

开始整合

image-20220427142800042

1,引入依赖

image-20220427142833570

2,指定缓存类型

image-20220427143034170

3,开启缓存,以及通过注解@Cacheable完成缓存操作

image-20220427143127387

image-20220427143145565

 /**
     *
     *   //1,每一个需要缓存的数据我们都来指定要放到哪个名字的缓存【缓存的分区(按照业务类型分)】
     *     //2,    @Cacheable("{category}")
     *     代表当前方法的结果需要缓存
     *     如果缓存中有,方法不需要调用
     *     如果缓存中没有  会调用方法 最后将方法的结果放入缓存
     *     //3默认行为
     *     1如果缓存中有,方法不调用
     *     2key默认自动生成 缓存名字:SimpleKey{}(自主生成key值)
     *     3缓存的value的值,默认使用jdk序列化机制,将序列化后的数据存到redis
     *     4默认时间ttl:-1 永不过期
     *
     *     自定义操作
     *       1,指定生成的缓存使用的key   key属性指定,接受一个SpEl
     *       SpEl的详细查看官网
     *       2,指定缓存的数据的存活时间   配置文件中修改了ttl
     *       3,将数据保存为json数据
     *
     *
     * @return
     */
    
@Cacheable(value = {"category"},key ="#root.method.name")  //通过#root.method.name的方法名字
    @Override
    public List<CategoryEntity> getLevel1Categorys() {
        List<CategoryEntity> categoryEntities = baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", 0));

        return categoryEntities;

        //系统的一致性解决方案:
        //1缓存的所有数据都有过期时间,数据过期下一次查询触发主动更新
        //2读写数据的时候,加上分布式的读写锁。
        // 经常写,经常读

        //同时修改缓存中数据
        //redis.del("catelogJSON"); 等待下次主动查询进行更新
    }

 *      自定义缓存配置MyCacheConfig
       4)原理:
 *     CacheAutoConfiguration->RedisCacheConfiguration
 *     ->自动配置了RedisCacheManager
 *     ->初始化所有的缓存
 *     ->每个缓存决定使用什么配置
 *     ->如果redisCacheConfiguration有就用已有的,没有就用默认配置
 *     ->想改缓存的配置,只需要给容器中放一个RedisCacheConfiguration即可
 *     ->就会应用到当前RedisCacheManager管理的所有缓存配置中
 *     
@EnableConfigurationProperties(CacheProperties.class)//加载配置文件,使配置文件生效
@EnableCaching//开启注解
@Configuration
public class MyCacheConfig {

//    @Resource
//    CacheProperties cacheProperties;
    /**
     * 配置文件中的东西没有用上;
     *
     * 1,原来和配置文件绑定的配置类是这样的
     *      @ConfigurationProperties(prefix="spring.cache")
     *      public class CacheProperties
     *
     * 2,要让他生效
     * @EnableConfigurationProperties(CacheProperties.class)
     * @return
     */
    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();

        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        //将配置文件中的所有配置都生效
        if (redisProperties.getTimeToLive()!=null){
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix()!=null){
            config = config.prefixKeysWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()){
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()){
            config = config.disableKeyPrefix();
        }

        return config;
    }

}

spring.cache.type=redis
#spring.cache.cache-names=qq,  毫秒为单位
spring.cache.redis.time-to-live=3600000
#如果指定了前缀就用我们指定的前缀,如果没有就默认使用缓存的名字作为前缀
spring.cache.redis.key-prefix=CACHE_
spring.cache.redis.use-key-prefix=true
#是否缓存空值  防止缓存穿透
spring.cache.redis.cache-null-values=true
  • 缓存失效模式
    在这里插入图片描述

image-20220427172702527

  • 批量删除

image-20220427173005380

  • 删除分区下所有数据

image-20220427173037457

image-20220427173046849

双写模式
在这里插入图片描述

@CachePut

image-20220427174940408

rue

  • 缓存失效模式

[外链图片转存中...(img-yMmo9epy-1651054143756)]

  • 批量删除

[外链图片转存中...(img-VNb7Hf8Y-1651054143757)]

  • 删除分区下所有数据

[外链图片转存中...(img-m85P2rEa-1651054143757)]

[外链图片转存中...(img-eWQNJaib-1651054143758)]

双写模式

@CachePut

[外链图片转存中...(img-vEeJ898h-1651054143758)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lhFnma5H-1651054143759)(C:\Users\靓仔在此\AppData\Roaming\Typora\typora-user-images\image-20220427180805740.png)]
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值