伊人成色综合人夜夜久久
你的位置:伊人成色综合人夜夜久久 > 人妻无码 > 大厂都在用EhCache,它到底比Redis强在那里?
大厂都在用EhCache,它到底比Redis强在那里?
发布日期:2022-06-18 17:08    点击次数:186

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

本文转载自微信公众号「要领新视界」,作家二师兄。转载本文请干系要领新视界公众号。

故事配景

跟着硬件价钱的走低,全球对硬件的依赖越来越高。甚而外传,代码不进犯,不行就加机器呗。比如缓存的使用,平常有基于虚构机内存、基于磁盘存储、基于中间件(Redis内存)等花样,咱们都露出,最符合的才是最佳的,但扩充中,往往是动不动就径直上Redis。

那么,Redis一定是最佳的选拔吗?单不说对内存的条款,从效果和性能上来说,也或然是最优的。是以,不同的场景使用不同的缓存政策才是妙手应该追求的。

这篇著述就带全球意志除Redis以外的另一种缓存框架:EhCache。之是以要写写,亦然因为花样中诳骗了此框架,同期又际遇点问题,于是决定潜入盘考一下。盘考之后,发现还真有点意思意思。

EhCache简介

EhCache是一个纯Java的程度内缓存框架,具有快速、精干的特色。扎眼的这里的要津字程度,基于程度的缓存直观告诉咱们效果细目要高一些,因为它径直在程度之内进行操作,但不同应用之间缓存的分享可能就会有问题。

EhCache是Hibernate中默许的CacheProvider,Spring Boot也对其进行了维持,Spring中提供的缓存轮廓也维持对EhCache缓存框架的绑定,而且维持基于注解的花样来使用。因此,EhCache是一款被平凡使用的基于Java的高速缓存框架,使用起来也很是便捷。

EhCache提供了多种缓存政策,主要分为内存和磁盘两级,是一款面向通用缓存、Java EE和轻量级容器的缓存框架。

EhCache的特色

粗浅说一下该框架的特色:

粗浅、快速,领有多种缓存政策; 缓存数据有两级:内存和磁盘,无需系念容量问题; 缓存数据会在虚构机重启的历程中写入磁盘; 不错通过RMI、可插入API等花样进行散播式缓存; 具有缓存温情存管制器的侦听接口; 维持多缓存管制器实例,以及一个实例的多个缓存区域,并提供Hibernate的缓存杀青。

EhCache不错单独使用,但平常会与Mybatis、Shiro等三方类库荟萃使用。自己花样中使用EhCache就是荟萃Shiro来使用的。

除了优点,EhCache也还有一些纰谬。比如,很是占用磁盘空间,这是因为DiskCache的算法粗浅,仅仅对元素径直追加存储。这么固然不错进步效果,但在使用频繁的系统中,磁盘很快会满。

另外就是不成保证数据安全,天然片刻kill掉Java程度时,可能会产生突破。EhCache处置突破的方法是重建Cache,这对Cache数据需要保持时可能会产生影响。Cache仅仅粗浅的加快,不成保证数据的安全。

EhCache与Redis

EhCache径直在JVM中进行缓存,速率快,效果高。与Redis比拟, 国产a片操作粗浅、易用、高效,固然EhCache也提供有缓存分享的有计算,但对散播式集群的维持不太好,缓存分享杀青冗忙。

Redis是通过Socket看望到缓存劳动,效果比EhCache低,比数据库要快许多,处理集群和散播式缓存便捷,有熟练的有计算。

是以,要是是单体应用,或对缓存看望条款很高,可琢磨给与EhCache;要是是大型系统,存在缓存分享、散播式部署、缓存现实很大时,则提倡给与Redis。

EhCache架构图

看一下EhCache的架构图,好像了解一下它由几部分构成。

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:单条缓存数据的构成单元,用于存放确凿缓存现实的。

三者的管制不错用下图示意:

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依赖:

<dependency>       <groupId>org.ehcache</groupId>       <artifactId>ehcache</artifactId>       <version>3.9.6</version> </dependency>  

创建并使用的代码如下:

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">      <cache alias="foo">         <key-type>java.lang.String</key-type>         <value-type>java.lang.String</value-type>         <resources>             <heap unit="entries">20</heap>             <offheap unit="MB">10</offheap>         </resources>     </cache>      <cache-template name="myDefaults">         <key-type>java.lang.Long</key-type>         <value-type>java.lang.String</value-type>         <heap unit="entries">200</heap>     </cache-template>      <cache alias="bar" uses-template="myDefaults">         <key-type>java.lang.Number</key-type>     </cache>      <cache alias="simpleCache" uses-template="myDefaults" />  </config

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的集成以及使用案例演示。

在Spring Boot中引入对应的starter:

<!-- ehcache依赖--> <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency>  <groupId>org.ehcache</groupId>  <artifactId>ehcache</artifactId>  <version>3.9.6</version> </dependency

在application.properties中树立添加如下树立:

spring.cache.ehcache.config=ehcache.xml 

在Spring Boot启动类上添加@EnableCaching注解:

@EnableCaching @SpringBootApplication @MapperScan("com.secbro.mapper") public class SpringBootMainApplication {  public static void main(String[] args) {   SpringApplication.run(SpringBootMainApplication.class, args);  } } 

创建一个用户缓存的实体类Person:

@Data public class Person {   public Person(int id,String name){   this.id = id;   this.name = name;  }   private int id;   private String name; } 

对应的Service方法杀青:

public interface PersonService {  Person getById(int id); }  @Slf4j @Service("personService") public class PersonServiceImpl implements PersonService {   @Cacheable(value = "personCache", key = "#id")  @Override  public Person getById(int id) {   log.info("查询id={}的用户", id);   if (id == 1) {    return new Person(1, "Tom");   } else if (id == 2) {    return new Person(2, "Jim");   }   return new Person(3, "Other");  } } 

通过Spring提供@Cacheable注解指定了缓存的称号为personCache,key为id。在方法内打印日记,要是调用到方法内,则会打印。

编写单元测试类:

@Slf4j @SpringBootTest @TestMethodOrder(MethodOrderer.OrderAnnotation.class) class PersonServiceTest {   @Resource  private PersonService personService;   @org.junit.jupiter.api.Order(1)  @Test  void testCache() throws InterruptedException {   log.info("第1次查询id=1的数据");   personService.getById(1);   log.info("第2次查询id=1的数据");   personService.getById(1);   Thread.sleep(3000);  } } 

两次调用对应的方法,打印日记如下:

c.s.s.PersonServiceTest                  : 第1次查询id=1的数据 c.s.s.i.PersonServiceImpl                : 查询id=1的用户 c.s.s.PersonServiceTest                  : 第2次查询id=1的数据 

不错看到,第一投入方法内进行查询,第二次便走了缓存。

对于Spring提供的cache注解的使用还有许多使用方法和场景,这里就不再张开了。

小结 

因为职责巧合用到该时代,就钻研并写成著述带全球恍悟了EhCache的基本常识、时代架构、使用场景、API使用以及基于Spring Boot的集成。举座而言,算是初学级别的,全球不错在此基础上进一步学习膨大。至于EhCache对散播式的维持部分,本文并未波及,主要原因是使用起来并没那么好用,要是感兴味的话可自行盘考。

 



上一篇:你是否在自建Ceph 集群中,犯过这五个诞妄?
下一篇:换一个角度看 B+ 树

友情链接:
  • 曰批全过程免费视频播放
  • 国产美女裸无遮挡裸体免费观网站
  • 国产精品国产一区二区三区
  • 日韩毛片
  • 欧美人与拘牲交大全视频