当前位置: 首页 > article >正文

SpringCache

1、基本信息      

        Spring缓存方案:JDK内置的缓存(ConcurrentHashMap)、第三方缓存组件(Caffeine)、分布式的缓存实现(Memcahed、Redis)。
        ConcurrentHashMap是JUC之中提供最为重要的技术实现。SpringCache之中为了便于缓存结构的管理,在“org.springframework.cache”包中提供了两个核心的标准接口,分别为:Cache实现接口、CacheManager管理接口。

         Cache接口规定了缓存数据的保存、增加、失效以及清空处理的操作功能,而想获取到Cahe实例,需要CacheManager接口方法完成,所有的Caceh对象都在CacheManager之中保存。
        在缓存实现的过程中,Spring是基于Cache接口提供的方法进行缓存操作的,所以不同的缓存组件如果要接入到Spring之中,则需要提供Cache接口的具体实现子类。对于缓存的管理问题,在Spring中又提供了CacheManager接口,所有可以在应用中使用的Cache类型全部在该接口之中进行配置。

2、实现方式:

配置CacheManager:

@Configuration
@EnableCaching
public class SpringCacheConfig {

    @Bean
    public CacheManager cacheManager(){
        //获取缓存管理接口实例
        SimpleCacheManager simpleCacheManager=new SimpleCacheManager();
        //保存全部的缓存集合
        Set<Cache> cacheSet=new HashSet<>();
        //缓存名称
        cacheSet.add(new ConcurrentMapCache("name1"));
        cacheSet.add(new ConcurrentMapCache("name2"));
        cacheSet.add(new ConcurrentMapCache("name3"));
        //保存到返回对象中
        simpleCacheManager.setCaches(cacheSet);
        return simpleCacheManager;
    }

}

在使用的地方打注解:@Cacheable(cacheNames = "name1")

3、Cacheable详解

Cacheable注解内部属性解释:

         在使用Cacheable注解的时候,有两个核心的配置属性,一个缓存条件,一个缓存排除。如果想要进行这两项的配置,那么还需要使用到特定的SpEL语法标记。
        缓存的逻辑:缓存空间现在没有任何数据项,通过数据层进行数据加载,随后直接拽入到缓存空间中。而有些数据不需要缓存,就需要设置一些缓存条件。

        例子1:下列例子中,使用name作为缓存的key,返回结果中的age字段大于18不进行缓存,name不包含abc才进行缓存

    @Cacheable(cacheNames = "name1",key="#name",unless = "#result.age>18",condition = "!#name.contains('abc')")
    public Future<String> getOrderName(String name);

        例子2:当有多个线程进行查询时,可能造成缓存穿透问题,在注解中开启同步缓存操作。

    @Cacheable(cacheNames = "name1",key="#name",sync = true)
    public Future<String> getOrderName(String name)

4、Caffeine

        使用ConcurrentHashMap实现缓存的处理性能不如Caffeine好,因为其内部在数据实现的结构上会更加优秀。

        步骤:一导依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>2.7.0</version>
</dependency>

        步骤二:配置

@Configuration
@EnableCaching
public class SpringCaffeineConfig {

    @Bean
    public CaffeineCacheManager cacheManager(){
        CaffeineCacheManager caffeineCacheManager=new CaffeineCacheManager();
        Caffeine<Object, Object> objectObjectCaffeine = Caffeine.newBuilder()
                .maximumSize(100).expireAfterAccess(3L, TimeUnit.SECONDS);//最大缓存个数,访问三秒后失效

        caffeineCacheManager.setCaffeine(objectObjectCaffeine);//设置缓存
        caffeineCacheManager.setCacheNames(Arrays.asList("name"));//设置缓存名称

        return caffeineCacheManager;
    }


}

        步骤三:在使用的地方打注解Cacheable,和上方类似。

        注:cacheNames 可以在类上进行配置公共的

@CacheConfig(cacheNames = "name1")
public class UserController

5、Caffeine更新缓存数据

        在缓存中保存的数据,非必要不做更新。这么做可能会造成缓存热点数据的失效,从而导致数据中的查询压力激增。

        实例:根据name更新数据,且返回结果不等于null

@CachePut(cacheNames = "name1",key="#name",unless = "#result==null")
public Future<String> getOrderName(String name)

6、Caffeine删除缓存

        缓存的数据应该于数据库之中的实体数据相对应,所以当数据库之中的数据被删除之后,对应的缓存的数据理论上也应该被删除,在SpringCahe考虑到数据删除的问题。
        实际上很多系统中实体数据已经不在了,而缓存数据还在,因为缓存的更新相比于实体数据更新慢,同时放在缓存之中的很多数据也一般不会轻易改变。
        可以使用"@CacheEvict"进行删除操作。例子:根据name删除缓存数据

@CacheEvict(key="#name") 
public Future<String> getOrderName(String name)

7、多级缓存更新、删除

        上述的缓存操作只能针对一个key值进行更新、删除缓存的操作,有时需要根据多个key值进行操作,就可以使用Cacheing注解进行配置。
        例子:缓存需要根据参数中的id和name进行更新缓存。(删除同理)

@Caching(put = {
@CachePut(cacheNames = "name1",key="#user.name",unless = "#result==null"),
@CachePut(cacheNames = "name1",key="#user.id",unless = "#result==null"),
})
public Future<String> getOrderName(User user)


http://www.kler.cn/news/134620.html

相关文章:

  • 【开源】基于JAVA的校园二手交易系统
  • 微服务和Spring Cloud Alibaba介绍
  • SpringBoot和Spring的区别是什么?
  • AI创作系统ChatGPT网站源码/支持DALL-E3文生图/支持最新GPT-4-Turbo模型+Prompt应用
  • airlearning-ue4安装的踩坑记录
  • 小小发票拦住出海“巨头”,合合信息智能文档处理技术助力企业重塑财务管理流程
  • 第二部分:Module(也称为Package)
  • 属性的加密算法CP-ABE
  • unity-模块卸载重新安装
  • 在QGIS中加载显示3DTiles数据
  • 汇编-loop循环指令
  • html使用天地图写一个地图列表
  • maven打包插件配置模板
  • 汇编-指针
  • npm install 下载不下来依赖解决方案
  • git安装后报git: ‘remote-https‘ is not a git command. See ‘git --help‘.
  • 【Ant Design合集】自用总结
  • IDEA 集成 Docker 插件一键部署 SpringBoot 应用
  • 解决小程序路由超过10层限制
  • 面试题c/c++--语言基础
  • SDL2 播放音频数据(PCM)
  • TP_Link WR886N 硬改闪存16M内存64M,刷入openwrt
  • JSP 四大域对象
  • 分类预测 | Matlab实现基于PSO-SDAE粒子群优化算法优化堆叠去噪自编码器的数据分类预测
  • 【开源】基于JAVA的超市自助付款系统
  • NewStarCTF2023 Reverse方向Week3 ez_chal WP
  • Unity开发之C#基础-集合(字典)(Dictionary)
  • 【C++】​——多态性与模板(其一)
  • 前端 webpack 面试题
  • nginx学习(3)Nginx 负载均衡