一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情
传统的redis缓存直接和redis交互,如下图:
使用二级缓存之后:
最近项目接入了二级缓存,之前只是在使用redis缓存作为缓存层,因为缓存数据和访问量比较大所以redis是三主三从的集群模式,二级缓存选择的是ehcache,为什么使用ehcache作为二级缓存,首先要知道ehcache是基于内存的内存缓存,平常使用redis缓存由于访问量和使用量巨大,虽然不得不说redis很快,但是毕竟redis也是独立部署在服务器上的,大量的请求会有很多的网络io,如果结合ehcache内存缓存,在请求接口的时候将类名方法名以及参数作为缓存key,返回结果作为缓存值,那么下次请求的时候就可以直接在内存中获取,内存读取速度肯定是快于Redis的毕竟是在本服务器内根本不需要网络io,但是内存的大小是有限的不可能将所有的方法都缓存进去,所有结合redis可持久化的机制,将ehcache的缓存过期时间调小,redis缓存过期时间大于内存缓存过期时间,那么就可以达到热点数据常驻内存,达到快速响应的效果,而且ehcache基本上只需要一个xml配置文件即可,还可以灵活配置缓存策略,下面贴一些常用的配置:
磁盘存储:将缓存中暂时不使用的对象,转移到硬盘,类似于Windows系统的虚拟内存 path:指定在硬盘上存储对象的路径 path可以配置的目录有: user.home(用户的家目录) user.dir(用户当前的工作目录) java.io.tmpdir(默认的临时目录) ehcache.disk.store.dir(ehcache的配置目录) 绝对路径(如:d:\ehcache) 查看路径方法:String tmpDir = System.getProperty("java.io.tmpdir");
defaultCache:默认的缓存配置信息,如果不加特殊说明,则所有对象按照此配置项处理
maxElementsInMemory:设置了缓存的上限,最多存储多少个记录对象
eternal:代表对象是否永不过期 (指定true则下面两项配置需为0无限期)
timeToIdleSeconds:最大的发呆时间 /秒
timeToLiveSeconds:最大的存活时间 /秒
overflowToDisk:是否允许对象被写入到磁盘
说明:下列配置自缓存建立起600秒(10分钟)有效 。 在有效的600秒(10分钟)内,如果连续120秒(2分钟)未访问缓存,则缓存失效。 就算有访问,也只会存活600秒。