English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SpringBoot EhCaching

EhCache

EhCache is an open-source cache based on Java, used to improve performance. The current version of Ehcache is 3 . It provides JSR-107 Cache manager implementation. We can use it directly.

EhCache features

ItFast,Lightweight, scalableFlexible It allows us to executeSerializableObject It provides such as LRU, LFU, FIFO, etc.Cache eviction policy. It will store the cache inMemoryDisk(SSD)中. It depends on SLF4J For recording. It has been fully implemented JSR-107 Jcache Es supporting through JGroups o JMS JMS RMI per eseguire cache distribuite.utilizzalinguaggio di query fluido

per eseguire ricerche distribuite.

EhCache utilizza modelli

Cache-as-SoR (system-of-record) La cache utilizza diversi modelli di accesso. EhCache utilizza i seguenti modelli: Read-through Write-through Write-behind

Cache-as-SoR (system-of-record)

第15步: Cache-asidecache di riserva

modalità, prima, l'applicazione consulta la cache. Se trova i dati, li restituisce direttamente. In caso contrario, recupera i dati dal SoR, li memorizza nella cache e poi li restituisce.

Cache-as-SoR cache-as-SoR modalità rappresentano le operazioni di lettura e scrittura del SoR sulla cache. Riducono la responsabilità dell'applicazione. Utilizzano combinazioni di modelli di lettura e scrittura, tra cuilettura diretta, scrittura diretta, riducendo la difficoltà dell'applicazione. Permette alla cache di risolvere i problemi di scrittura post-lettura.

Read-through

Read-throughmodalità copia anche il modello di cache riservato quando legge i dati dalla cache. La differenza tra modalità di lettura e modello di cache riservato sta nel fatto che il modello di lettura implementa CacheEntryFactory interfaccia. Indica come la cache legge gli oggetti dalla cache. È meglio impacchettare l'istanza EhCache in SelfPopulatingCache istanza.

Write-through

Write-throughpuò anche copiare il modello di cache di riserva quando i dati vengono scritti nella cache. La differenza tra modalità di scrittura diretta e modello di cache di riserva sta nel fatto che il modello di scrittura diretta implementa modalità CacheWriter interfaccia. Configura la cache per modalità di scrittura diretta e post-scrittura. Scrive i dati nel SoR nella stessa thread di esecuzione.

Write-behind

Write-behindin diverse forme rispetto agli altri tre modelli. In ritardo configurabiledopo di che, modifica le voci della cache. Il ritardo può essere secondi, minuti, un giorno, una settimana,o per molto tempo. Allo stesso tempo, mette in coda i dati per essere scritti più tardi nella stessa thread di esecuzione.

La scrittura dei dati avviene in modalità post-write al di fuori dell'ambito delle transazioni. Questo significa che crea una nuova transazione per submittere dati diversi dal transazione principale nel SoR.

livello di archiviazione EhCaching

EhCache ci permette di utilizzare vari tipi di aree di archiviazione dati, come heap, disco e cluster. Possiamo configurare un cache multi-archiviazione (che utilizza più aree di archiviazione). Può essere configurato come livello.

Questi livelli sono organizzati in ordine. Il livello più basso è livello di autorizzazione, un altro livello è livello di cache. Anche conosciuta come più vicina o cache vicina. Il livello di cache può avere più aree di archiviazione. I dati più caldi sono conservati nel livello di cache perché sono più veloci rispetto al livello di autorizzazione. Confrontati con il livello di cache, altri dati sono conservati nel livello di autorizzazione, più lenti ma più ricchi.

EhCache supporta diversi tipi di archiviazione dati, tra cui quattro:

Memoria heap Off-Heap Store Disk Store Clustered Store

Memoria heap

Memora gli elementi di cache nella memoria heap Java. Condivide lo storage con l'applicazione Java. È veloce perché utilizza il heap, ma lo spazio di archiviazione è limitato. Il garbage collector scansiona anche lo storage heap.

Off-Heap Store

Usa la memoria principale (RAM) per memorizzare gli elementi di cache. Il garbage collector non lo scanna. È più lento rispetto allo storage heap perché gli elementi di cache vengono spostati nello storage heap prima dell'uso. La sua dimensione è limitata.

Disk Store

Usa il disco per memorizzare gli elementi di cache. È molto più lento rispetto allo storage basato su RAM (sopra e sotto lo storage). È meglio utilizzare dischi dedicati se si utilizza lo storage su disco.

Clustered Store

Mette i record di cache sul server remoto. È più lento rispetto allo storage heap. Può avere server di failover per alta disponibilità.

L'immagine sopra mostra

Un'applicazione può avere più gestori di cache. Molte cache possono essere gestite dal gestore delle cache. Le cache possono essere memorizzate utilizzando più strati. EhCache mette i dati recentemente utilizzati o frequentemente utilizzati in uno strato più veloce (strato di cache).

Configura EhCache

Metti EhCache Configura il jar nel percorso della classe. Configura xml e mettilo nel percorso della classe. Crea un riferimento alla cache.

EhCache esempio

Nell'esempio seguente, configureremo EhCache nell'applicazione.

Passo 1: Apri Spring Initializr https://start.spring.io/.

Passo 2: Scegli la versione di Spring Boot 2.3.0 M2

Passo 3: Fornisce GroupNome. Abbiamo fornito il nome del gruppo com.w3codebox。

Passo 4: Fornisce Artifact. Abbiamo fornito l'Artifact spring-boot-ehcache-example.

Passo 5: Aggiungi Spring Web Dipendenze.

Passo 6: Clicca Generate (Genera) pulsante. Quando clicchiamo sul pulsante "Genera", esso impacchetta tutte le specifiche correlate all'applicazione in un Jar dal file e scaricalo sul sistema locale.

Passo 7: Estrai file jar.

Passo 8: Copia la cartella e incollala nella area di lavoro di STS.

Passo 9: ImportaProgetto.

File->Importa->Progetto Maven esistente->Avanti->Esplora->Seleziona la cartella spring-boot-ehcache-example->Seleziona la cartella->Completa

L'importazione del progetto richiede del tempo.

Passo 10: Da repository Maven https://mvnrepository.com/ e incollalo. pom.xmlfile

spring-boot-starter-cache ehcache 3 API di cache.

注意: Non utilizzare il pacchetto net.sf.ehcache di ehcache.

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<plugin>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.M2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.w3codebox</groupId>
<artifactId>spring-boot-ehcache-example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-ehcache-example</name>
<description>Progetto demo per Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<artifactId>cache-api</artifactId>
<plugin>
<artifactId>spring-boot-starter-web</artifactId>
</exclusions>
<artifactId>cache-api</artifactId>
<plugin>
<artifactId>spring-boot-starter-cache</artifactId>
</exclusions>
<artifactId>cache-api</artifactId>
<groupId>org.ehcache</groupId>
ehcache
</exclusions>
<artifactId>cache-api</artifactId>
<artifactId>ehcache</artifactId>
<groupId>javax.cache</groupId>
</exclusions>
<artifactId>cache-api</artifactId>
<plugin>
<dependency>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<repository>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepositories>
</project>

Ora, dobbiamo configurare ehcache.xml file

Passo 11: 打开 application.properties file, e configura EhCache utilizzando le seguenti proprietà.

application.properties

#Configura ehcache.xml
spring.cache.jcache.config=classpath:ehcache.xml

Passo 12: 打开 SpringBootEhcacheExampleApplication.java file, e utilizza l'annotazione @EnableCaching Abilita la cache.

SpringBootEhcacheExampleApplication.java

package com.w3codebox;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
//启用缓存管理功能
@EnableCaching
public class SpringBootEhcacheExampleApplication 
@Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
    public static void main(String[] args) 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
        SpringApplication.run(SpringBootEhcacheExampleApplication.class, args);
    return student.get(id);
return student.get(id);
注意: 如果我们不想在主应用程序文件中使用注解@EnableCaching,则可以创建一个单独的CacheConfig类,并使用注解对调用进行注解。
package com.w3codebox;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;
@Configuration
//enable caching
@EnableCaching
public class CacheConfig 
@Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
return student.get(id);

步骤13: 创建类。我们已经在包 com.w3codebox 中创建了名称为 Student的类。 在类中,执行以下操作:

创建五个变量id, name, gender, 生成使用Constructor
右键单击文件->源->使用字段生成构建器->全选->生成
生成Getters and Setters
右键单击文件->源->生成Getter和设置器->全选->生成
生成 toString() 右键单击文件->源->生成toString()->生成

完成上述所有步骤后,类如下所示。

Student.java

package com.w3codebox;
public class Student 
@Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
    private int id;
    private String name;
    private String gender;
    private String city;
    public Student(int id, String name, String gender, String city) 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
        super();
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.city = city;
    return student.get(id);
    public int getId() 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
    return id;
    return student.get(id);
    public void setId(int id) 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
    this.id = id;
    return student.get(id);
    public String getName() 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
    return name;
    return student.get(id);
    public void setName(String name) 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
    this.name = name;
    return student.get(id);
    public String getGender() 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
    return gender;
    return student.get(id);
    public void setGender(String gender) 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
    this.gender = gender;
    return student.get(id);
    public String getCity() 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
    return city;
    return student.get(id);
    public void setCity(String city) 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
    this.city = city;
    return student.get(id);
    @Override
    public String toString() 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
        return "Student [id=" + id + ", name=" + name + ", gender=" + gender + ", city=" + city + "]";
    return student.get(id);
return student.get(id);

步骤14: 创建用于管理学生的 服务类。我们已经创建了名称为 StudentManager的服务类。 在本课程中,我们完成了以下操作:

使用注解 @Service注解类。 创建 HashMap 的实例。 在静态块中,我们已在地图中添加了学生数据。 通过使用注解 @Cacheable ,我们定义了缓存的名称所有数据都将保存在此缓存中。我们已经在注解的属性中定义了 id 。缓存根据 id 来搜索学生。 我们创建了一种方法 getStudentById(),该方法将id解析为参数。它返回学生的 id

StudentManager.java

StudentManager.java
package com.w3codebox;
import java.util.HashMap;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class StudentManager 
@Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
    static HashMap student = new HashMap<>();
    static HashMap<Integer, Student> student = new HashMap<>(); 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
        static
        student.put(1, new Student(100, "Alex", "Male", "Berlin"));
        student.put(2, new Student(101, "Tony", "Male", "Maxico"));
        student.put(3, new Student(102, "Andrew", "Male", "Chicago"));
        student.put(4, new Student(103, "Alexa", "Female", "Brussels"));
    return student.get(id);
    student.put(5, new Student(104, "Maria", "Female", "Houston")); 
    @Cacheable(cacheNames="demoCache", key="#id")public Student getStudentById(Integer id)
        {
        System.out.println("Fetching student data from cache");
    return student.get(id);
return student.get(id);

} ehcache.xml 现在,我们需要创建

文件。它包含与高速缓存相关的信息,例如高速缓存的名称,内存中的元素数量,高速缓存中的实时数据生存时间等。 第15步: 文件夹中缓存名为 ehcache.xml 配置文件。

ehcahe.xml

<config
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns='http://www.ehcache.org/v3'
xmlns:jsr107='http://www.ehcache.org/v3/jsr107'>
<ehcache>
<diskStore path="java.io.tmpdir" />
<defaultCache maxElementsInMemory="2000" 
            eternal="true"
            overflowToDisk="false" 
            timeToLiveSeconds="1200" />
    <cache name="demoCache"} 
            maxElementsInMemory="2000"
            eternal="false" 
            overflowToDisk="false" 
            timeToLiveSeconds="10000" />
</ehcache>
</config>

现在,我们已经创建了所有必需的文件。创建所有文件后,项目目录如下所示:

让我们运行该应用程序。

步骤16: 打开 SpringBootEhcacheExampleApplication.java 文件,并以 Java 应用程序。

它显示以下输出:

从缓存中获取学生
[id=100, name=Alex, gender=Male, city=Berlin]
[id=101, name=Tony, gender=Male, city=Mexico]
[id=102, name=Andrew, gender=Male, city=Chicago]
[id=103, name=Alexa, gender=Female, city=Brussels]
[id=104, name=Maria, gender=Female, city=Houston]