[]으로 Ehcache는 기초 학습

A,으로 Ehcache 개요

1.1 소개

으로 Ehcache는 오픈 소스 캐싱 프레임 워크 순수 자바, 빠른, 린 등이며, Hibernate는 기본의 CacheProvider입니다. 그것은 메모리와 디스크 스토리지, 캐시 로더, 캐시 확장, 캐시 예외 핸들러와 일반 캐시, 자바 EE 경량 용기, 주로이다.
으로 Ehcache는 원래 그렉 행운에 의해 개발, 2003 년에 시작했다. 2009 년,이 프로젝트는 테라코타를 구입했다. 아직 오픈 소스 소프트웨어는하지만, 새로운 주요 기능 중 일부는 상용 제품에서 사용할 수 있습니다 (예를 들어, 신속 간의 일관성으로 다시 시작할 수 있습니다).
으로 Ehcache 널리 최대 절전 모드, 봄, 누에 고치와 다른 오픈 소스 시스템에서 사용된다.

1.2으로 Ehcache의 주요 특성

  1. 빠른;
  2. 간단한;
  3. 캐싱 정책의 다양한;
  4. 데이터 캐시의 두 가지 수준이 있습니다 : 메모리 및 디스크 때문에 용량 문제에 대해 걱정할 필요가;
  5. 캐시 된 데이터는 가상 컴퓨터를 다시 시작하는 과정에서 디스크에 기록됩니다;
  6. RMI으로 등 분산 API 캐시에 삽입 할 수 있습니다;
  7. 인터페이스와 캐시와 캐시 관리자를 듣기;
  8. 캐쉬 관리 프로그램은 여러 인스턴스 및 캐시 영역의 복수의 일례를 지원합니다;
  9. Hibernate는 캐시 구현을 제공합니다;

두,으로 Ehcache 사용 설명

  으로 Ehcache는 캐시 된 데이터를 하드 디스크에 저장 될 수있다, 내부 메모리에 저장 될 수있다 캐시를 ​​관리하는 데 사용하는 도구입니다. 그것의 핵심은 모든 응용 프로그램으로 Ehcache CacheManager이 시작되어, CacheManager입니다. 이 캐시 (캐시)을 관리하는 데 사용되며, 응용 프로그램은 여러 CacheManager, 다음 CacheManager를 가질 수 있고 여러 캐시를 가질 수 있습니다. 캐시는 요소들 중 하나의 내부에 저장하고, 요소는 키 값, 내부 엔트리 맵의 상응하는 쌍을 저장한다.

2.1으로 Ehcache 캐시 만료 정책

  캐시 (공간이 임계 값 A와 이미 가까이 점유 등)를 청소해야 할 때, 멀리 클리어 데이터를 결정하기 위해 제거 알고리즘의 어떤 종류를 사용해야합니다. 일반적으로 사용되는 제거 알고리즘은 다음과 같은 범주 있습니다 :

  1. FIFO : 먼저 서비스, FIFO합니다. 저장된 시간 분석, 데이터의 현재 우선 순위로부터 멀리 제거된다.
  2. LRU는 : 최소 최근 가장 최근에 사용, 사용합니다. 사용되는 가장 최근의 시간을 결정, 현재의 먼 우선 순위 데이터는 제거됩니다.
  3. LFU는 : 최소 자주 사용하는, 가장 자주 사용하지 마십시오. 때때로 데이터의 최소 수는 사용되는 시간의 기간이 우선적으로 제거.

DB를 캐시 문제를 해결하는 방법 2.2 동기화되지 않습니다.

DB를 동기화와 캐시 문제는 프로젝트 어떤 시나리오 하에서 일어날
프로덕션 환경에서, 임의의 데이터베이스에 직접 값을 변경하는 것은 불가능합니다.
업데이트 (수정) 또는 델 (삭제)

  1. 직접 서버를 다시 시작
  2. 사전 통지

사전 통지와 나중에 문을 업데이트합니다.
수정하려면 수정이 성공 후, 주도권은 동일한 트랜잭션에있는 캐시를 정리합니다.
아 캐시를 삭제 한 후 수정 실패의 경우에 이상 변경?
JOB 정기적 인 건강 검사

세,으로 Ehcache 기본 프로젝트 발표

SpringBoot2.0 통합 프레임 워크으로 Ehcache

따라 3.1 메이븐 환경

<!--开启 cache 缓存 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- ehcache缓存 -->
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>2.9.1</version><!--$NO-MVN-MAN-VER$ -->
</dependency>  

3.2 YML 프로파일 정보

###端口号配置
server:
  port: 8081
###数据库配置  
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
    test-while-idle: true
    test-on-borrow: true
    validation-query: SELECT 1 FROM DUAL
    time-between-eviction-runs-millis: 300000
    min-evictable-idle-time-millis: 1800000
  # 缓存配置读取
  cache:
    type: ehcache
    ehcache:
      config: classpath:app1_ehcache.xml

3.3 응용 프로그램 시작 모드

@MapperScan(basePackages = { "com.itmayiedu.mapper" })
@EnableCaching
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}
// @EnableCaching 开启ehcache缓存模式

3.4을 사용하여 프로젝트

@CacheConfig(cacheNames = "userCache")
public interface UserMapper {
    @Select("SELECT ID ,NAME,AGE FROM member where id=#{id}")
    @Cacheable
    List<Users> getUser(@Param("id") Long id);
}    
//@Cacheable  加了该注解的方法表示可以缓存
//@CacheConfig 表示创建缓存配置,Key为userCache

3.5으로 Ehcache 구성

app1_ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

    <diskStore path="java.io.tmpdir/ehcache-rmi-4000" />

    <!-- 默认缓存 -->
    <defaultCache maxElementsInMemory="1000" eternal="true"
        timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
        diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
        diskPersistent="true" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
    </defaultCache>

    <!-- demo缓存 -->
    <cache name="userCache" maxElementsInMemory="1000" eternal="false"
        timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
        diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
        diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU">
        <cacheEventListenerFactory
            class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
        <!-- 用于在初始化缓存,以及自动设置 -->
        <bootstrapCacheLoaderFactory
            class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" />
    </cache>
</ehcache>

구성 지침에 관한 매개 변수 :

  1. diskStore标签:指定数据存储位置,可指定磁盘中的文件夹位置( The diskStore element is optional. It must be configured if you have overflowToDisk or diskPersistent enabled for any cache. If it is not configured, a warning will be issues and java.io.tmpdir will be used.)
  2. defaultCache标签:默认的管理策略,Ehcache 使用Map集合实现的 element 其实就是 key 和value

  • 以下属性是必须的:
    • 1、name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
    • 2、maxElementsInMemory:在内存中缓存的element的最大数目。
    • 3、maxElementsOnDisk:在磁盘上缓存的element的最大数目,默认值为0,表示不限制。
    • 4、eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断。
    • 5、overflowToDisk: 如果内存中数据超过内存限制,是否要缓存到磁盘上。
  • 以下属性是可选的:
    • 1、timeToIdleSeconds: 对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
    • 2、timeToLiveSeconds: 对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
    • 3, diskPersistent : 디스크에 지속 여부. JVM은 데이터가 유효 재시동 지칭한다. 기본값은 false입니다.
    • 4, diskExpiryThreadIntervalSeconds : 물체 감지 스레드 실행 간격. 스레드는 오랫동안 한 번 실행하는 방법 객체의 상태를 식별합니다.
    • 5, diskSpoolBufferSizeMB : 디스크 크기 DiskStore이 30메가바이트의 기본값을 사용합니다. 자신의 DiskStore를 사용하여 각 캐시.
    • 6, memoryStoreEvictionPolicy : 데이터 메모리는 메모리 제한, 디스크 캐시를 초과 정책합니다. LRU, 옵션 FIFO, LFU 기본.

3.6 캐시 지우기

@Autowired
private CacheManager cacheManager;
@RequestMapping("/remoKey")
public void remoKey() {
  cacheManager.getCache("userCache").clear();
}

  

네,으로 Ehcache 클러스터 모델

  EHCache는 캐싱 시스템의 과정에 있기 때문에, 클러스터 환경에서 응용 프로그램 배포되면 각 노드는 노드 캐시 데이터가 업데이트 될 때, 업데이트 된 데이터가 다른 노드에서 공유 할 수 없습니다, 자신의 캐시 데이터를 유지하는뿐만 아니라 이 노드의 효율성이 실행되는 줄일 수, 동기화가 발생 데이터에 연결되지 않습니다. 예 A를 사용하는 사이트의 경우, B는 노드 B가 캐시는 사용자가 페이지를 하나의 데이터가 업데이트됩니다 나타납니다 탐색 할 때 업데이트되지 않은 수 있지만 캐시, 노드를 업데이트 클러스터 배포 등 두 개의 노드 하나가 될 것입니다 데이터가 우리는 또한 노드에서 사용자를 잠글 수 있지만, 업데이트, 비교적 강하거나 일부 대화 형 시스템이 아닌 웹 말하기되지 않은, 세션 스티커 기술에 의해 명백하게 적합하지 세션 스티커.

4.1 프로젝트 구성

  app2_ehcache.xml라는 이름의 위의 app1_ehcache.xml 복사,
다음과 같이 두 개의 XML 파일이 추가됩니다

app1_ehcache.xml :


<!-- 多台机器配置 rmiUrls=//192.168.8.32:400002/demoCache|//192.168.5.231:400003/demoCache -->
<cacheManagerPeerProviderFactory
    class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
    properties="peerDiscovery=manual,rmiUrls=//127.0.0.1:5000/userCache">
</cacheManagerPeerProviderFactory>
<!-- 配置 rmi 集群模式 -->
<cacheManagerPeerListenerFactory
    class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
    properties="hostName=127.0.0.1,port=4000,socketTimeoutMillis=120000" />

<!-- 多播方式配置 搜索某个网段上的缓存 timeToLive 0是限制在同一个服务器 1是限制在同一个子网 32是限制在同一个网站 64是限制在同一个region 
    128是限制在同一个大洲 255是不限制 <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
    properties="peerDiscovery=automatic, multicastGroupAddress=224.1.1.1, multicastGroupPort=40000, 
    timeToLive=32" /> -->

app2_ehcache.xml :

<!-- 多台机器配置 -->
<cacheManagerPeerProviderFactory
    class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
    properties="peerDiscovery=manual,rmiUrls=//127.0.0.1:4000/userCache">
</cacheManagerPeerProviderFactory>

<cacheManagerPeerListenerFactory
    class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
    properties="hostName=127.0.0.1,port=5000,socketTimeoutMillis=120000" />

<!-- 多播方式配置 搜索某个网段上的缓存 timeToLive 0是限制在同一个服务器 1是限制在同一个子网 32是限制在同一个网站 64是限制在同一个region 
    128是限制在同一个大洲 255是不限制 <cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
    properties="peerDiscovery=automatic, multicastGroupAddress=224.1.1.1, multicastGroupPort=40000, 
    timeToLive=32" /> -->

4.2 테스트 프로젝트

YML는 파일이 8080과 8081 포트 + app1_ehcache.xml 포트입니다 + SpringBoot 항목을 시작 app2_ehcache.xml 수정 :

  • 1. 데이터베이스의 데이터는 :

  • 2. 액세스는 http://127.0.0.1:8080/getUser?id=2일반적으로 데이터에서 찾을 수 있습니다 :

  • 3. 액세스는 http://127.0.0.1:8081/getUser?id=2일반 데이터에서 찾을 수 있습니다

  • 4. 직접 수동으로 데이터베이스에 데이터를 수정 :

  • 상기 액세스 인터페이스 탐색 5. 나 데이터 명 "밍"을 체크, 그 이유는 캐쉬 술 때문에
  • 6. 전화는 캐시 인터페이스 취소 http://127.0.0.1:8080/remoKey, 포트 8080에, 캐시는이 시간에주의 클리어됩니다
  • 7. 호출이 인터페이스는 http://127.0.0.1:8080/getUser?id=2, 당신은 "샤오 밍"의 값으로 데이터베이스를 다시 조회 할 수 있지만 취소되어 8081 캐시 포트에서 찾을 수 있습니다, 이것은 이유으로 Ehcache 클러스터 구성입니다.


4.3 일반적인 클러스터 모델

  테라코타, RMI, JMS, 위해 JGroups, EHCache는 서버 :으로 Ehcache는 1.7 버전에서 다섯 개 클러스터 솔루션, 즉 지원

RMI 클러스터 모델

당신은 어떻게 다른 캐시 클러스터 환경을 알 수 있습니까?
분산의 형태로 전달 된 메시지는 무엇인가?
무엇 복제 할 필요가 있겠습니까? 증가 (두고), 갱신 (업데이트) 또는 실패 (만기)?
어떤 방법으로 복제? 동기 또는 비동기 모드?

  • 1, 올바른 요소 유형 : 만 직렬화 요소를 복사 할 수 있습니다. 예컨대, 전체 요소없이 필요한 요소만을 키 값을 제거하는 등의 어떤 동작, 그러한 동작, 소자 직렬화 키가 아닌 경우에도 직렬화이지만, 또한 복제 될 수있다.
  • 2、成员发现(Peer Discovery):Ehcache进行集群的时候有一个cache组的概念。每个cache都是其他cache的一个peer,没有主cache的存在。成员发现(Peer Discovery)正是用来解决 “你如何知道集群环境中的其他缓存?” 这个问题的。Ehcache提供了两种机制用来进行成员发现,即:自动成员发现和手动成员发现。要使用一个内置的成员发现机制要在ehcache的配置文件中指定cacheManagerPeerProviderFactory元素的class属性为 net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory。

4.4 Ehcache的使用场景

  • 使用纯java的ehcache作为本地缓存
  • Reids 作为远程分布式缓存
  • 解决redis缓存压力过大,提高缓存速度,以及缓存性能。

4.5 Redis和Ehcache缓存的区别

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

4.6 实际工作中使用Ehcache

  • 我们在项目中使用集中式缓存(Redis或者式Memcached等),通常都是检查缓存中是否存在
  • 期望值的数据,如果存在直接返回,如果不存在就查询数据库让后在将数据库缓存,

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

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

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

추천

출처www.cnblogs.com/haoworld/p/ehcache-ji-chu-zhi-shi-xue-xi.html