047-EhCache
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是大部分人最早接触的缓存技术,在单体项目中是最佳的选择。
配置依赖
Spring boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager来实现缓存。但是要切换到其他缓存实现也很简单,首先看下项目需要的依赖:

可以看到上面除了web和数据库外,多了一个ehcache依赖,可以加在web和service之间。
修改启动类
启动类除了正常的注解之外,需要加上缓存启用的注解@EnableCaching,其它不需要做任何修改:

配置文件
接下来看下springboot的配置文件,除了正常的数据源配置外,需要为缓存增加配置:

这样使用ehCache的默认配置,如果想对ehCache单独进行配置,可以像下面这样:

可以看到,上面show-sql配置为true,是为了查看缓存的效果。
最下面两行配置缓存的类型,和缓存配置文件的目录,其它配置都是正常配置。
看一下ehcache.xml缓存配置:

通过注释也可以看到,配置缓存的名字,对象是否永不过期,最大缓存对象数,缓存空闲状态的最长时间等等,更详细的说明请参考官方文档或者自行搜索。
业务代码
依赖,配置,启动类等已经搞定,接下来写业务代码,和普通的项目代码一样,主要分为实体类,dao,service,controller四层,首先看实体类:

可以看到一个用户,有两个字段,对应的表名为 user,主键为id,此处为了演示,只创建一个很简单的例子。
接下来看dao层代码:

接下来看service层代码:

可以看到五个很简单的增删改查方法,没有任何特别之处。
最后看controller层代码:

可以看到根据service层定义了对应的五个接口。
上面的业务代码并没有加缓存,来看一下效果:
1 先新增,再查询




可以看到上面四个图分别显示了新增和查询接口,以及对应的控制台打印语句。
2 连续多次查询


通过上面两个例子可以看到,接口功能一切正常,并且每次对数据的操作都会访问数据库这是没有缓存的情况。
给业务代码增加缓存
现在加缓存。缓存要加载service和controller之间,只需要修改service类即可,现在看修改后的结果:

上面的内容加了几个注解和几行打印语句。具体说明如下:
1)@CacheConfig(cacheNames = {"ehCache"})设置了ehcache的名称,这个名称就是ehcache.xml内的名称;
2)@Cacheable:应用到读取数据的方法上,即可缓存的方法,如查找方法:先从缓存中读取,如果没有再调 用方法获取数据,然后把数据添加到缓存中,适用于查找;
3)@CachePut:主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用。适用于更新和插入;
4)@CacheEvict:主要针对方法配置,能够根据一定的条件对缓存进行清空。适用于删除。
刚才在项目中加了一行数据,接下来重启项目,然后执行一次查询,可以看到如下结果:

可以看到,依然进行了一次数据库查询,此时首先判断了没有缓冲,然后查询数据库,最后将查询的结果存入缓冲并返回,再来执行几次接口,发现控制台不再打印任何语句,说明查询方法缓存成功。
下面看一下新增方法。首先清空控制台,然后执行以下新增:


可以看到数据库执行了一次新增语句,并打印在了控制台上,新增成功后,数据被缓存起来,此时多次执行查询id为2的数据,可以看到控制台不再打印任何语句。
上面是两种验证情况,其它情况请自行验证。
代码地址: https://gitee.com/blueses/spring-boot-demo