一、EhCache介绍
在查询数据的时候,数据大多来自数据库,咱们会基于SQL语句的方式与数据库交互,数据库一般会基于本地磁盘IO的形式将数据读取到内存,返回给Java服务端,Java服务端再将数据响应给客户端,做数据展示。
但是MySQL这种关系型数据库在查询数据时,相对比较慢,因为有磁盘IO,有时没命中索引还需要全盘扫描。在针对一些热点数据时,如果完全采用MySQL,会存在俩问题。第一个MySQL相对很脆弱,肯能会崩,第二个MySQL查询效率慢。会采用缓存。
而缓存分为很多种,相对服务端的角度来说大致分为两种,一种JVM缓存(堆内缓存),另一种是堆外缓存(操作系统的内存中、Redis跨服务的缓存)
Redis不用说太多,Redis基于内存读写,效率很高,而且Redis服务的并发能力很强。毕竟Redis是另一个服务,需要通过网络IO的形式去查询数据。不过一般分布式微服务的缓存首选还是Redis。
但是单体项目,想把缓存的性能提升的比Redis还要快,选择JVM缓存了,一般框架自带的缓存机制,比如Hibernate缓存,MyBatis也有一级缓存和二级缓存。
为什么DAO层框架已经提供了缓存的概念,为什么要搞EhCache:
因为DAO层框架的缓存是在Mapper层触发的,EhCache可以将缓存提到Service层触发。效率肯定会有提升
并且EhCache提供了非常丰富的功能,不但可以将数据存储在JVM内部,还可以放到堆外,甚至还可以存储到本地磁盘。
二、EhCache基本使用
EhCache的官网:www.ehcache.org
EhCache明显开源的,EhCache可以几乎0成本和Spring整合,配合Java规范,直接采用Cache注解实现缓存
@Cacheable这个是Java的规范,Spring集成了这个规范默认整合Redis,不过也可以整合EhCache
EhCache官方有两大版本,分别是2.x和3.x的版本,这里选择3.x版本去玩,可以更好的以SpringBoot的形式去集成到一起使用
先单独使用EhCache查看效果
EhCache快速入门
导入依赖
<dependencies> <dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>3.8.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> 复制代码
入门操作
@Test public void test(){ //1. 初始化好CacheManager CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() // 一个CacheManager可以管理多个Cache .withCache( "singleDog", CacheConfigurationBuilder.newCacheConfigurationBuilder( String.class, Object.class, // heap相当于设置数据在堆内存中存储的 个数 或者 大小 ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10).build()).build() ).build(true); // cacheManager.init(); //2. 基于CacheManager回去到Cache对象 Cache<String, Object> cache = cacheManager.getCache("singleDog", String.class, Object.class); //3. 存 set/put/add/ cache.put("ehcache","57个单身狗!!"); //4. 取 System.out.println(cache.get("ehcache")); }