Spring Boot (四十八)——springcache介绍
1、基本介绍
一个应用主要瓶颈在于数据库的IO,大家都知道内存的速度是远远快于硬盘的速度(即使固态硬盘与内容也无法比拟)。应用之中经常会遇到返回相同的数据(数据字典,行政区划树),因为这些数据变化的可能性很小。假如我们使用传统的方式每次都通过接口与数据库打交道去请求获得;是不是每次都既消耗了内存资源、网络资源、数据库资源、CPU资源,又导致大量的时间耗费在数据库查询,及远程方法调用上;从而导致程序性能的恶化。这种场景就是需要使用缓存来解决这类问题。我们把数据缓存在内存之中,以后每次获取直接内存之中获得;使得程序获得极大的性能提升。下图是我们日常Web开发之中多种缓存场景。
日常研发中使用的缓存有如下几类不限于此:
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,同时支持其他缓存实现
从以上的注解中可以看出,虽然使用注解的确方便,但是缺少灵活的缓存策略,
缓存策略:
-
TTL(Time To Live )
存活期,即从缓存中创建时间点开始直到它到期的一个时间段(不管在这个时间段内有没有访问都将过期) -
TTI(Time To Idle)
空闲期,即一个数据多久没被访问将从缓存中移除的时间
项目中可能有很多缓存的TTL不相同,这时候就需要编码式使用编写缓存。