大厂都在用EhCache,它到底比Redis强在哪里?,高级java面试题大全答案

==========

看一下EhCache的架构图,大概了解一下它由几部分组成。

大厂都在用EhCache,它到底比Redis强在哪里?

Ehcache-architecture

Cache Replication部分提供了缓存复制的机制,用于分布式环境。EhCache最初是独立的本地缓存框架组件,在后期的发展中,结合Terracotta服务阵列模型,可以支持分布式缓存集群,主要有RMI、JGroups、JMS和Cache Server等传播方式进行节点间通信。

In-process APIs则提供了基于JSR、JMX等标准的支持,能够较好的兼容和移植,同时对各类对象有较完善的监控管理机制。

Network APIs则对外提供了基于RESTful API、JMS API、Cache Server等方式的支持。

在使用过程中,需要关注的核心部分便是中间的Core部分了。它包含了核心的API和概念:

  • CacheManager:缓存管理器,可以通过单例或者多例的方式创建,也是Ehcache的入口类。

  • Cache:每个CacheManager可以管理多个Cache,每个Cache可以采用hash的方式管理多个Element。所有cache都实现了Ehcache接口;

  • Element:单条缓存数据的组成单位,用于存放真正缓存内容的。

三者的管理可以用下图表示:

大厂都在用EhCache,它到底比Redis强在哪里?

CacheManager

缓存过期策略

======

在架构图中还可以看到Memory Store LRU、Memory Store LFU、Memory Store FIFO等内存存储算法。也就是当缓存占用空间接近临界值时,会采用上面的淘汰策略来清理掉一部分数据。

EhCache提供了三种淘汰算法:

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

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

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

Ehcache采用的是懒淘汰机制,每次往缓存放入数据时,都会存一个时间,在读取时要和设置的时间做TTL比较来判断是否过期。

EhCache实战解析

===========

了解了上面的基础知识之后,来实验一下EhCache如何使用。其中EhCache2.x和EhCache3.x的使用差距较大。

这里采用比较新的3.9.6版本,不同的版本在API的使用上会有所差异。

基于API使用EhCache

==============

EhCache提供了基于API和xml两种形式创建CacheManger和Cache。先来看基于API的形式:

在pom文件中引入EhCache依赖:

org.ehcache

ehcache

3.9.6

创建并使用的代码如下:

public class EhCacheTest {

@Test

public void test() {

// 1、先创建一个CacheManagerBuilder;

// 2、使用CacheManagerBuilder创建一个预配置(pre-configured)缓存:第一个参数为别名,第二个参数用来配置Cache;

// 3、build方法构建并初始化;build中true参数表示进行初始化。

CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()

.withCache(“preConfigured”,

CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,

ResourcePoolsBuilder.heap(100)).build())

.build(true);

// 取回在设定的pre-configured,对于key和value值类型,要求是类型安全的,否则将抛出ClassCastException异常。

Cache<Long, String> preConfigured = cacheManager.getCache(“preConfigured”, Long.class, String.class);

System.out.println(“从缓存中获取key为preConfigured:” + preConfigured);

// 根据需求,通过CacheManager创建出新的Cache。实例化和完整实例化的Cache将通过CacheManager.getCache API返回。

Cache<Long, String> myCache = cacheManager.createCache(“myCache”,

CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,

ResourcePoolsBuilder.heap(100)).build());

// 使用put方法存储数据

myCache.put(1L, “da one!”);

// 使用get方法获取数据

String value = myCache.get(1L);

System.out.println(“从缓存中获取key为1L:” + value);

// close方法将释放CacheManager所管理的缓存资源

cacheManager.close();

}

}

上述代码基于API的形式演示了如何创建CacheManager及Cache,并对Cache进行设置和获取。

基于XML使用EhCache

==============

依赖Jar包不变,在src/main/resources/目录下创建配置文件 ehcache.xml。

<config

xmlns:xsi=‘http://www.w3.org/2001/XMLSchema-instance’

xmlns=‘http://www.ehcache.org/v3’

xsi:schemaLocation=“http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core.xsd”>

java.lang.String

java.lang.String

20

10

java.lang.Long

java.lang.String

200

java.lang.Number

3.x版本与2.x版本有所区别,在xml配置文件上非常明显。2.x中以ehcache元素为根节点,而3.x则以config为根节点。

在上述xml中包含三部分:

  • 普通缓存cache-foo:别名为foo的缓存,缓存的Key-Value值类型均为String。如果没有指定,默认就是Object类型。

  • 缓存模板cache-template:实现一个配置抽象,以便在未来可以进行扩展;

  • 基于缓存模板的cache-bar:使用了cache-template模板myDefaults,并且覆盖了key-type类型,myDefaults的key-type是Long类型,覆盖后成了Number类型;

cache中其他属性及元素:

  • name为名称;

  • alias为别名;

  • key-type为key的类型;

  • value-type为value的类型;

  • heap指定堆中可创建的实体格式,其中unit=“entries”,表示后面的20是实体;

  • offheap表示在开始淘汰过期缓存项之前,可以分配多达10M的堆内存;

  • uses-template表示使用模板的名称;

当然,也可以通过persistence元素来配置缓存的目录等。其他属性的使用,大家可以慢慢探索。

基于Spring Boot使用EhCache

======================

前面已经提到,Spring对缓存进行了支持,Spring Boot也对缓存进行了自动配置的支持。下面就基于Spring Boot来完成EhCache的集成以及使用案例演示。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

更多:Java进阶核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

image

高效学习视频

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

核心知识集

包含:JVM,JAVA集合,网络,JAVA多线程并发,JAVA基础,Spring原理,微服务,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存等等

[外链图片转存中…(img-540LDyzR-1712718824593)]

高效学习视频

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-T7lbffdI-1712718824594)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值