EhCache缓存介绍 - 一二级缓存使用 和 mybatis一二级缓存讲解

目录

什么是Ehcache

项目中使用类图!

EHCache单体JVM缓存使用流程图!

redis+EHCache缓存使用流程图!

springboot整合EHCache代码地址:https://mp.csdn.net/postedit/101110437

解决db和缓存数据不同步问题!

什么场景下会发生缓存与db不同步问题!

Ehcache的主要特性

Ehcache使用介绍

Ehcache缓存过期策略

Ehcache的使用场景

Redis和Ehcache缓存的区别

实际工作中使用Ehcache

Ehcache集群模式

常用集群模式

RMi集群模式


什么是Ehcache

Ehcache是纯java写的开源缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。它主要面向通用缓存、Java EE和轻量级容器,具有内存和磁盘存储、缓存加载器、缓存扩展、缓存异常处理程序。

Ehcache 被广泛用于在Hibernate、Spring、Cocoon等其他开源系统。

缓存最终的目的是为减轻服务端压力,减少网络传输请求。

项目中使用类图!

EHCache单体JVM缓存使用流程图!

EhCache缓存介绍 - 一二级缓存使用 和 mybatis一二级缓存讲解_第1张图片

redis+EHCache缓存使用流程图!

EhCache缓存介绍 - 一二级缓存使用 和 mybatis一二级缓存讲解_第2张图片

EhCache作为一级缓存、redis作为二级

EhCache缓存介绍 - 一二级缓存使用 和 mybatis一二级缓存讲解_第3张图片

springboot整合EHCache代码地址:https://mp.csdn.net/postedit/101110437

解决db和缓存数据不同步问题!

A. 直接重启服务器(不现实)

B. 主动通知,调用cacheManager.get("需要清除掉的缓存名").coler(); 会清除缓存,再次访问会首先访问数据库再重新进行缓存,

先执行修改或删除语句,修改成功之后,在主动清理缓存 cacheManager.get("缓存名").coler()

什么场景下会发生缓存与db不同步问题!

update(修改)或delete(删除),

先执行修改或删除语句,修改成功之后,在主动清理缓存 cacheManager.get("缓存名").coler()

问题:改完了再清理缓存,万一修改失败呢?

解决:定时JOB健康检查(对比缓存数据和数据库已缓存数据是否相同)。

Ehcache的主要特性

1.快速;

2.简单;

3.多种缓存策略;

4.缓存数据有两级:内存和磁盘,因此无需担心容量问题;

5.缓存数据会在虚拟机重启的过程中写入磁盘;

6.可以通过 RMI、可插入 API 等方式进行分布式缓存;

7.具有缓存和缓存管理器的侦听接口;

8.支持多缓存管理器实例,以及一个实例的多个缓存区域;

9.提供 Hibernate 的缓存实现;

Ehcache使用介绍

Ehcache是用来管理缓存的一个工具,其缓存的数据可以是存放在内存里面的,也可以是存放在硬盘上的。其核心是CacheManager,一切Ehcache的应用都是从CacheManager开始的。它是用来管理Cache(缓存)的,一个应用可以有多个CacheManager,而一个CacheManager下又可以有多个Cache。Cache内部保存的是一个个的Element,而一个Element中保存的是一个key和value的配对,相当于Map里面的一个Entry。

Ehcache缓存过期策略

当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据。常用的淘汰算法有下面几种:

FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。

LRU:Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。

LFU:Least Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。

Ehcache的使用场景

使用纯java的ehcache作为本地缓存

Reids 作为远程分布式缓存

解决redis缓存压力过大,提高缓存速度,以及缓存性能。

Redis和Ehcache缓存的区别

如果是单个应用或者对缓存访问要求很高的应用,用ehcache。
如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。

实际工作中使用Ehcache

我们在项目中使用集中式缓存(Redis或者式Memcached等),通常都是检查缓存中是否存在

期望值的数据,如果存在直接返回,如果不存在就查询数据库让后在将数据库缓存,

这个时候如果缓存系统因为某写原因宕机,造成服务无法访问,那么大的量请求直接穿透到数据库,最数据库压力非常大。

这时候我们让ehcache作为二级缓存,当redis服务器宕机后,可以查询ehcache缓存。

这样能够有效的扛住服务器请求压力。

Ehcache集群模式

由于 EhCache 是进程中的缓存系统,一旦将应用部署在集群环境中,每一个节点维护各自的缓存数据,当某个节点对缓存数据进行更新,这些更新的数据无法在其它节点中共享,这不仅会降低节点运行的效率,而且会导致数据不同步的情况发生。例如某个网站采用 A、B 两个节点作为集群部署,当 A 节点的缓存更新后,而 B 节点缓存尚未更新就可能出现用户在浏览页面的时候,一会是更新后的数据,一会是尚未更新的数据,尽管我们也可以通过 Session Sticky 技术来将用户锁定在某个节点上,但对于一些交互性比较强或者是非 Web 方式的系统来说,Session Sticky 显然不太适合。

常用集群模式

EhCache从1.7版本开始,支持五种集群方案,分别是:

Terracotta、RMI、JMS、JGroups、EhCache Server

RMi集群模式

你如何知道集群环境中的其他缓存?

• 分布式传送的消息是什么形式?

• 什么情况需要进行复制?增加(Puts),更新(Updates)或是失效(Expiries)?

• 采用什么方式进行复制?同步还是异步方式?

1、正确的元素类型:只有可序列化的元素可以进行复制。一些操作,比如移除,只需要元素的键值而不用整个元素;在这样的操作中即使元素不是可序列化的但键值是可序列化的也可以被复制。

2、成员发现(Peer Discovery):Ehcache进行集群的时候有一个cache组的概念。每个cache都是其他cache的一个peer,没有主cache的存在。成员发现(Peer Discovery)正是用来解决 “你如何知道集群环境中的其他缓存?” 这个问题的。Ehcache提供了两种机制用来进行成员发现,即:自动成员发现和手动成员发现。要使用一个内置的成员发现机制要在ehcache的配置文件中指定cacheManagerPeerProviderFactory元素的class属性为

net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory。

你可能感兴趣的:(redis,缓存,EHCache,缓存)