Spring Boot (四十八)——springcache介绍

目录

      • 1、基本介绍
      • 2、SpringCache具有如下特点
      • 3、SpringCache的实现原理
      • 4、Spring cache+ redis与redis 的比较
        • 1、缓存级别不同
        • 2、sprirng cache+redis的好处
        • 3、集群环境下的springcache+redis
      • 5、参考文章

1、基本介绍

    一个应用主要瓶颈在于数据库的IO,大家都知道内存的速度是远远快于硬盘的速度(即使固态硬盘与内容也无法比拟)。应用之中经常会遇到返回相同的数据(数据字典,行政区划树),因为这些数据变化的可能性很小。假如我们使用传统的方式每次都通过接口与数据库打交道去请求获得;是不是每次都既消耗了内存资源、网络资源、数据库资源、CPU资源,又导致大量的时间耗费在数据库查询,及远程方法调用上;从而导致程序性能的恶化。这种场景就是需要使用缓存来解决这类问题。我们把数据缓存在内存之中,以后每次获取直接内存之中获得;使得程序获得极大的性能提升。下图是我们日常Web开发之中多种缓存场景。
Spring Boot (四十八)——springcache介绍_第1张图片
日常研发中使用的缓存有如下几类不限于此:

EhCache:此缓存框架一直伴随着Spring,Hibernate,Mybatis等等。在SpringBoot出来之前都已经广泛的使用来做为一级缓存。
Guava: Google出品的框架,也支持缓存。
Redis:在我们日常开发之中经常使用的;并且被大众广泛接受的速度极快的缓存。
memcached:是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。

    本文章将介绍的缓存SpringCache,自从Spring 3.1 引入了基于注解 annotation 的缓存 cache 技术,SpringCache本质上不是一种缓存的实现,而是一种缓存的抽象。Spring此框架的原则是让使用者方便开发,也能很好的支持第三方框架集成。如同Spring实现的SpringJdbc一样。

    SpringCache 通过在现有代码之中,仅添加少量各种预先定义好的 注解 annotation,即能达到缓存方法返回对象的效果。降低了开发者使用缓存技术的学习成本。

    SpringCache 缓存技术具备相当的灵活性,不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,而且提供开箱即用的缓存临时存储方案,也支持与主流专业缓存(EHCache、Redis …)集成。

2、SpringCache具有如下特点

  • 通过少量的配置 annotation 注释即可使得既有代码支持缓存
  • 支持开箱即用 Out-Of-The-Box,即不用安装和部署额外第三方组件即可使用缓存
  • 支持 Spring Express Language,能使用对象的任何属性或者方法来定义缓存的 key 和 condition
  • 支持 AspectJ,并通过其实现任何方法的缓存支持
  • 支持自定义 key 和自定义缓存管理者,具有相当的灵活性和扩展性
  • 支持各种缓存实现,默认基于ConcurrentMap实现的ConcurrentMapCache,同时支持其他缓存实现
    Spring Boot (四十八)——springcache介绍_第2张图片

从以上的注解中可以看出,虽然使用注解的确方便,但是缺少灵活的缓存策略,

缓存策略:

  • TTL(Time To Live )
    存活期,即从缓存中创建时间点开始直到它到期的一个时间段(不管在这个时间段内有没有访问都将过期)

  • TTI(Time To Idle)
    空闲期,即一个数据多久没被访问将从缓存中移除的时间

项目中可能有很多缓存的TTL不相同,这时候就需要编码式使用编写缓存。

3、SpringCache的实现原理

在传统方式下对于缓存的处理代码是非常臃肿的。

例如:我们要把一个查询函数加入缓存功能,大致需要三步。

一、在函数执行前,我们需要先检查缓存中是否存在数据,如果存在则返回缓存数据

二、如果不存在,就需要在数据库的数据查询出来。

三、最后把数据存放在缓存中,当下次调用此函数时,就可以直接使用缓存数据,减轻了数据库压力。

和 spring 的事务管理类似,spring cache 的关键原理就是 spring AOP,通过 spring AOP,其实现了在方法调用前、调用后获取方法的入参和返回值,进而实现了缓存的逻辑。

4、Spring cache+ redis与redis 的比较

1、缓存级别不同

Spring cache是代码级的缓存,他一般是使用一个ConcurrentMap。也就是说实际上还是是使用JVM的内存来缓存对象的,
那么肯定会造成大量的内存消耗。但是使用方便。
Redis 作为一个缓存服务器,是内存级的缓存。它是使用单纯的内存来进行缓存

2、sprirng cache+redis的好处

那么Spring cache +redis的好处显而易见了。既可以很方便的缓存对象,同时用来缓存的内存的是使用redis的内存,不会消耗JVM的内存,提升了性能。当然这里Redis不是必须的,换成其他的缓存服务器一样可以,只要实现Spring的Cache类,并配置到XML里面就行了

3、集群环境下的springcache+redis

集群环境下,每台服务器的spring cache是不同步的,这样会出问题的,spring cache只适合单机环境
redis是设置单独的缓存服务器
,所有集群服务器统一访问redis,不会出现缓存不同步的情况
spring cache是很早就有的东西,现在+redis是为了顺应时代,更好的兼容集群环境,加强保留spring cache功能,不如直接使用redis

5、参考文章

https://www.cnblogs.com/snake23/p/9675703.html
https://blog.csdn.net/jianxia801/article/details/87869242
https://blog.csdn.net/zlj1217/article/details/80928122

你可能感兴趣的:(Spring,Boot)