[] Ehcacheのは、基本を学びます

A、Ehcacheの概要

1.1はじめに

Ehcacheのは、オープンソースのキャッシングフレームワーク純粋なJava、速い、赤身などで、HibernateはデフォルトのcacheProviderです。これは一般的なキャッシング、Java EEおよび軽量コンテナ、メモリとディスク記憶装置と、キャッシュローダー、キャッシュの拡張、キャッシュ例外ハンドラのために主にあります。
Ehcacheのは、もともとグレッグ運が開発し、2003年に開始しました。2009年には、プロジェクトはテラコッタを購入しました。まだオープンソース・ソフトウェアは、しかし、主要な新機能のいくつかは、唯一の商業製品に使用することができます(たとえば、迅速との整合性を再起動することができます)。
Ehcacheのは広くHibernateは、春、コクーンやその他のオープンソースシステムで使用されています。

1.2 Ehcacheのの主な特徴

  1. 高速;
  2. シンプルな;
  3. キャッシュポリシーの様々な。
  4. データキャッシュ、2つのレベルがあります:メモリとディスク、容量の問題を心配する必要はありませんが。
  5. キャッシュされたデータは、仮想マシンを再起動する過程で、ディスクに書き込まれます。
  6. RMIにより、等は、分散APIキャッシュに挿入することができます。
  7. インタフェースでキャッシュとキャッシュマネージャを聞きます。
  8. キャッシュ・マネージャーは、複数のインスタンスをサポートし、キャッシュ領域の複数の1例。
  9. Hibernateはキャッシュ実装を提供します。

二、Ehcacheの使用説明

  Ehcacheのは、キャッシュされたデータはハードディスクに保存することができる、内部のメモリに格納することができるキャッシュを管理するために使用するツールです。そのコアは、すべてのアプリケーションがEhcacheのにCacheManagerが始まっている、CacheManagerのです。キャッシュ(キャッシュ)を管理するために使用され、アプリケーションは、複数のCacheManager、および次のCacheManagerを持つことができ、複数のキャッシュを持つことができます。キャッシュは、要素の1内部に格納され、ペア要素はキーと値、内部のエントリ地図と同等である保存されます。

2.1 Ehcacheのキャッシュの有効期限ポリシー

  キャッシュをクリーニングする必要がある場合(スペースはすでにしきい値Aに近い占有など)、離れてクリアされているどのデータを決定するために消去アルゴリズムのいくつかの種類を使用する必要があります。一般的に使用される除去アルゴリズムは、次のカテゴリのとおりです。

  1. FIFO:先入れ先出し、FIFOで。記憶された時間を分析、データの現在の優先順位から最も遠いが排除されます。
  2. LRU:最小最近、使用される最低使用。使用されている最新の時間を決定し、現在最も遠い優先順位データが消去されます。
  3. LFUは:使用頻度の最も低い、最も頻繁には使用しません。、時間データの最小数は、使用される時間の期間は、優先的に排除されます。

DBキャッシュの問題を解決するためにどのように2.2は同期されません。

DB-同期とキャッシュの問題は、プロジェクトどのようなシナリオの下で起こるか
、運用環境では、任意に直接、データベースの値を変更することは不可能です。
アップデート(修正)やデル(削除)

  1. 直接サーバーを再起動します
  2. 事前通知

事前通知と、後でステートメントを更新します。
変更するには、変更が成功した後、イニシアチブは、同じトランザクション内にあるキャッシュをクリーンアップします。
ああキャッシュをクリアし、それを修正するために障害が発生した場合に切り替えますか?
JOB定期健康診断

三、Ehcacheの基本的なプロジェクトのプレゼンテーション

SpringBoot2.0統合フレームワークEhcacheの

3.1 Mavenの環境依存

<!--开启 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:ディスクサイズは30メガバイトのデフォルト値を使用しDiskStore。そのDiskStoreを使用して各キャッシュ。
    • 6、memoryStoreEvictionPolicy:データメモリは、メモリの制限、ディスクにキャッシュを超えるポリシー場合。デフォルトのLRU、オプションのFIFO、LFU。

3.6キャッシュのクリア

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

  

四、Ehcacheのクラスタモデル

  Ehcacheのキャッシングシステムの処理であるため、クラスタ環境におけるアプリケーションの展開後、各ノードは、ノードのキャッシュデータが更新されると、更新されたデータを他のノードに共有することができない、独自のキャッシュデータを維持するだけでなくこれは、ノードの効率が実行されている削減する、との同期が発生したデータにつながることはありません。例えば、ノードBは、キャッシュかもしれないが、キャッシュノードを更新するとき、クラスタの展開としてA、B二つのノードを使用したサイトは、ユーザーがページが表示された参照するとき、1がデータを更新される更新されていない、1になりますデータは、セッションのスティッキーセッションスティッキー技術により適していない、明らかに、我々はまた、ノード上でユーザーをロックすることができますが、更新されたが、いくつかの対話型システムのための比較的強いまたは非Web圏されていません。

4.1プロジェクトの構成

  app2_ehcache.xmlという名前の上記app1_ehcache.xmlコピー、
次のように2つの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のサーバー:1.7バージョンからEhcacheのは、5つのクラスタソリューション、すなわちをサポートしています

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