前言
书接前文,继续深耕。上一篇博主对Redis进行了入门级介绍,大体知道了Redis可以干什么以及怎么使用它。
今日博主继续带着大家学习如何使用EhCache
,这是一款基于Java
的缓存框架。
- 微服务实战系列之Redis
- 微服务实战系列之Cache
- 微服务实战系列之Nginx(技巧篇)
- 微服务实战系列之Nginx
- 微服务实战系列之Feign
- 微服务实战系列之Sentinel
- 微服务实战系列之Token
- 微服务实战系列之Nacos
- 微服务实战系列之Gateway
- 微服务实战系列之加密RSA
- 微服务实战系列之签名Sign
一、Ehcache简介
Ehcache
is an open-source, standards-based cache for boosting performance, offloading your database, and simplifying scalability, it is today’s most widely used Java-based cache.
Ehcache
provides in-process cache, which you can replicate across multiple nodes.
博主提炼几个关键词:开源、标准化、轻量级、Java缓存、分布式
。
1. 快速入门
Ehcache支持API、XML的的集成方式,博主以XML为例进行介绍。
1.1 导入依赖
<!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.9.2</version>
</dependency>
因为只依赖 slf4j-api
,所以Ehcache真正的做到了轻量级。
1.2 配置参数
准备一个echache.xml文件,参考配置:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!-- 指定磁盘存储目录-->
<diskStore path="d:/ehcache/mycache/" />
<!--
defaultCache:默认的缓存
maxElementsInMemory:内存中最大缓存对象数
eternal:是否永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性
overflowToDisk:Element数量达到maxElementsInMemory时,写到磁盘中
-->
<defaultCache
maxElementsInMemory="100"
eternal="true"
overflowToDisk="true"/>
<!--
maxElementsInMemory:设置成1且overflowToDisk为true,代表只要有一个Element,就立即持久化到硬盘
eternal:设置成true,永久有效
maxElementsOnDisk:硬盘中最大缓存对象数,不限为0
diskPersistent:是否缓存虚拟机重启期数据
-->
<cache
name="firstCache"
maxElementsInMemory="1"
eternal="true"
overflowToDisk="true"
maxElementsOnDisk="0"
diskPersistent="true"/>
</ehcache>
2. 数据管理机制
Ehcache数据缓存依赖Manager完成,遵循CacheManager—>Cache—>Element
层级关系,以下是每个组件的特点。
- CacheManager
缓存管理器,是Ehcache的入口。 - Cache
每个CacheManager可以管理多个Cache,每个Cache可以管理多个Element。 - Element
单条缓存的组成单位。
3. 缓存策略
- FIFO:先进先出
- LRU:最近最少使用
- LFU:最不经常使用
二、单体OR集群
1. 单体
单体模式,数据缓存在本地磁盘或内存中,适用于对数据缓存要求较高的场景。因此需要准备足够的磁盘或内存空间。
2. 集群
集群模式,Ehcache提供了多种部署方案,比如基于RMI、JMS等组内广播策略,实现分布式缓存部署。
鉴于Ehcache不保证数据安全(即数据访问正确性),所以其特点之一可能是“快而不准”
,如此可能会带来一个问题:“缓存一致性”
。因此,通常需结合其他保障一致性的组件配合使用,实现二级缓存,如下图:
结语
Ehcache
作为近年来比较流行的Java缓存框架,对于本地缓存的支持已足够。“小而快”
的特点,也让它成为微服务中的热门组件。当然也存在粗暴的一面,也因此失去了分布式的部分优势。
所以各位盆友,不同的缓存各领风骚,选择需谨慎!