`

Ehcache缓存同步

阅读更多
Ehcache缓存同步有几种方式:(1)RMI (2)Terrocotta (3)JMS (4)JGroups
先介绍下,利用RMI进行缓存同步。
测试类1:在sampleDistributedCache2缓存中查找是否存在ehcache键,如果没找到,则打印NotFound;如果找到了,则打印相应值
view plaincopy to clipboardprint?
1. package my.test.ehcache1; 
2.  
3. import java.io.InputStream; 
4. import java.lang.management.ManagementFactory; 
5.  
6. import javax.management.MBeanServer; 
7.  
8. import net.sf.ehcache.Cache; 
9. import net.sf.ehcache.CacheManager; 
10. import net.sf.ehcache.Element; 
11. import net.sf.ehcache.management.ManagementService; 
12.  
13. public class EHCacheTest { 
14.  
15.     public static void main(String[] args) { 
16.         InputStream is = EHCacheTest.class 
17.                 .getResourceAsStream("/my/test/ehcache1/ehcache.xml"); 
18.         //读入配置 
19.         CacheManager cacheManager = new CacheManager(is); 
20.         //打印初始缓存 
21.         String[] cacheNames = cacheManager.getCacheNames(); 
22.         printNames(cacheNames); 
23.         //移除缓存 
24.         cacheManager.removeCache("sampleDistributedCache1"); 
25.         cacheNames = cacheManager.getCacheNames(); 
26.         printNames(cacheNames); 
27.  
28.         //新建缓存 
29.         Cache cache = new Cache("Test1", 100, true, false, 10, 10); 
30.         cacheManager.addCache(cache); 
31.         cacheNames = cacheManager.getCacheNames(); 
32.         printNames(cacheNames); 
33.         cache.put(new Element("test1", "value1")); 
34.          
35.         //得到缓存并插入值(这里监听器被调用) 
36.         cache = cacheManager.getCache("sampleCache3"); 
37.         for (int i = 0; i < 20; i++) { 
38.             cache.put(new Element("key" + i, "value" + i)); 
39.         } 
40.         cache.get("key10"); 
41.          
42.         // distributed -- rmi同步 
43.         cache = cacheManager.getCache("sampleDistributedCache2"); 
44.         for (int i = 0; i < 100; i++) { 
45.             cache.put(new Element("key" + i , "value" + i)); 
46.         } 
47.          
48.         //注册被管理的Bean 
49.         // JMX -- jconsole(MBeanServer) 
50.         MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
51.         ManagementService.registerMBeans(cacheManager, mBeanServer, true, true, 
52.                 true, true); 
53.  
54.         for (int i = 0; i < 10; i++) { 
55.             Element temp = cache.get("ehcache"); 
56.             if (temp != null) { 
57.                 System.out.println(temp.getValue()); 
58.             } else { 
59.                 System.out.println("NotFound"); 
60.             } 
61.             try { 
62.                 Thread.sleep(10000); 
63.             } catch (InterruptedException e) { 
64.                 e.printStackTrace(); 
65.             } 
66.         } 
67.  
68.         // distributed cache using RMI 
69.         // 1.Peer Discovery -- cacheManagerPeerProviderFactory 
70.         // 2.CacheManager -- cacheManagerPeerListenerFactory 
71.         // 3.cache replication -- cacheEventListenerFactory 
72.         // 4.Bootstrap -- 启动后同步 
73.     } 
74.  
75.     private static void printNames(String[] names) { 
76.         System.out.println("======================="); 
77.         for (int i = 0; i < names.length; i++) { 
78.             System.out.println(names[i]); 
79.         } 
80.     } 
81.  
82. } 

配置文件1:将官方样例文件中相应位置替换即可
(1)其他JVM提供缓存的rmiUrl地址
view plaincopy to clipboardprint?
1. <cacheManagerPeerProviderFactory 
2.             class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
3.             properties="peerDiscovery=manual, 
4.                         rmiUrls=//localhost:40002/sampleDistributedCache2" 
5.             propertySeparator="," 
6.     /> 

(2)监听来自于其他复制节点消息的本JVM的host,port
view plaincopy to clipboardprint?
1. <cacheManagerPeerListenerFactory 
2.             class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
3.             properties="hostName=localhost, port=40001, socketTimeoutMillis=2000"  
4.     /> 

(3)配置复制选项,启动时同步等
view plaincopy to clipboardprint?
1. <cache name="sampleDistributedCache2" 
2.            maxElementsInMemory="10" 
3.            eternal="false" 
4.            timeToIdleSeconds="100" 
5.            timeToLiveSeconds="100" 
6.            overflowToDisk="false"> 
7.         <cacheEventListenerFactory 
8.                 class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" 
9.                 properties="replicateAsynchronously=true, replicatePuts=true, 
10.                             replicatePutsViaCopy=true, replicateUpdates=true, 
11.                             replicateUpdatesViaCopy=true, replicateRemovals=true, 
12.                             asynchronousReplicationIntervalMillis=200"/> 
13.         <bootstrapCacheLoaderFactory 
14.                 class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/> 
15.     </cache> 

测试类2:向sampleDistributedCache2缓存中添加ehcache键
view plaincopy to clipboardprint?
1. package my.test.ehcache2; 
2.  
3. import java.io.InputStream; 
4. import java.lang.management.ManagementFactory; 
5.  
6. import javax.management.MBeanServer; 
7.  
8. import net.sf.ehcache.Cache; 
9. import net.sf.ehcache.CacheManager; 
10. import net.sf.ehcache.Element; 
11. import net.sf.ehcache.Statistics; 
12. import net.sf.ehcache.management.ManagementService; 
13. import net.sf.ehcache.statistics.LiveCacheStatistics; 
14.  
15.  
16. public class EHCacheTest { 
17.      
18.     public static void main(String[] args) { 
19.         try { 
20.             Thread.sleep(3 * 1000); 
21.         } catch (InterruptedException e) { 
22.             e.printStackTrace(); 
23.         } 
24.         //读入配置 
25.         InputStream is = EHCacheTest.class.getResourceAsStream("/my/test/ehcache2/ehcache.xml"); 
26.         CacheManager cacheManager = new CacheManager(is); 
27.         //打印初始缓存 
28.         String[] cacheNames = cacheManager.getCacheNames(); 
29.         printNames(cacheNames); 
30.         //注册管理Bean 
31.         MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
32.         ManagementService.registerMBeans(cacheManager, mBeanServer, true, true, true, true); 
33.          
34.         //distributed 
35.         Cache cache = cacheManager.getCache("sampleDistributedCache2"); 
36.         printCache(cache); 
37.         //添加值后另一个虚拟机的缓存通过RMI会同步缓存,并读到这个值 
38.         cache.put(new Element("ehcache", "newaddvalue")); 
39.     } 
40.      
41.      
42.     private static void printNames(String[] names) { 
43.         System.out.println("======================="); 
44.         for (int i = 0; i < names.length; i++) { 
45.             System.out.println(names[i]); 
46.         } 
47.     } 
48.      
49.     private static void printCache(Cache cache) { 
50.         int size = cache.getSize(); 
51.         long memSize = cache.getMemoryStoreSize(); 
52.         long diskSize = cache.getDiskStoreSize(); 
53.         Statistics stat = cache.getStatistics(); 
54.         LiveCacheStatistics liveStat = cache.getLiveCacheStatistics(); 
55.         long hits = stat.getCacheHits(); 
56.         long missed = stat.getCacheMisses(); 
57.         long hitsOnDisk = stat.getOnDiskHits(); 
58.         long liveHits = liveStat.getCacheHitCount(); 
59.         long liveMissed = liveStat.getCacheMissCount(); 
60.          
61.         StringBuilder sb = new StringBuilder(); 
62.         sb.append("size=" + size + ";memsize=" + memSize); 
63.         sb.append(";diskSize=" + diskSize + ";hits=" + hits); 
64.         sb.append(";missed=" + missed + ";liveHits=" + liveHits); 
65.         sb.append(";liveMissed=" + liveMissed + ";hitsOnDisk=" + hitsOnDisk); 
66.         System.out.println(sb.toString()); 
67.     } 
68. } 

配置文件:将官方样例文件中相应位置替换即可
view plaincopy to clipboardprint?
1. <cacheManagerPeerProviderFactory 
2.             class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
3.             properties="peerDiscovery=manual, 
4.                         rmiUrls=//localhost:40001/sampleDistributedCache2" 
5.             propertySeparator="," 
6.     /> 

view plaincopy to clipboardprint?
1. <cacheManagerPeerListenerFactory 
2.             class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
3.             properties="hostName=localhost, port=40002, socketTimeoutMillis=2000"  
4.     /> 

view plaincopy to clipboardprint?
1. <cache name="sampleDistributedCache2" 
2.            maxElementsInMemory="10" 
3.            eternal="false" 
4.            timeToIdleSeconds="100" 
5.            timeToLiveSeconds="100" 
6.            overflowToDisk="false"> 
7.         <cacheEventListenerFactory 
8.                 class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" 
9.                 properties="replicateAsynchronously=true, replicatePuts=true, 
10.                             replicatePutsViaCopy=true, replicateUpdates=true, 
11.                             replicateUpdatesViaCopy=true, replicateRemovals=true, 
12.                             asynchronousReplicationIntervalMillis=200"/> 
13.         <bootstrapCacheLoaderFactory 
14.                 class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/> 
15.     </cache> 

运行结果:
JVM1
2009-12-13 12:24:04 net.sf.ehcache.distribution.RMICacheManagerPeerListener <init>
警 告: Explicitly setting the listener hostname to 'localhost' is not recommended. It will only work if all CacheManager peers are on the same machine.
=======================
sampleDistributedCache2
sampleCache2
sampleCache1
sample/DistributedCache3
sampleDistributedCache1
sampleCache3
=======================
sampleDistributedCache2
sampleCache2
sampleCache1
sample/DistributedCache3
sampleCache3
=======================
sampleDistributedCache2
sampleCache2
Test1
sampleCache1
sample/DistributedCache3
sampleCache3
key0=value0 has been added
key1=value1 has been added
key2=value2 has been added
key3=value3 has been added
key4=value4 has been added
key5=value5 has been added
key6=value6 has been added
key7=value7 has been added
key8=value8 has been added
key9=value9 has been added
key7=value7 has been evicted
key10=value10 has been added
key0=value0 has been evicted
key11=value11 has been added
key9=value9 has been evicted
key12=value12 has been added
key3=value3 has been evicted
key13=value13 has been added
key1=value1 has been evicted
key14=value14 has been added
key4=value4 has been evicted
key15=value15 has been added
key13=value13 has been evicted
key16=value16 has been added
key8=value8 has been evicted
key17=value17 has been added
key17=value17 has been evicted
key18=value18 has been added
key18=value18 has been evicted
key19=value19 has been added
NotFound
newaddvalue
JVM2:
2009-12-13 12:24:13 net.sf.ehcache.distribution.RMICacheManagerPeerListener <init>
警 告: Explicitly setting the listener hostname to 'localhost' is not recommended. It will only work if all CacheManager peers are on the same machine.
=======================
sampleDistributedCache2
sampleCache2
sampleCache1
sample/DistributedCache3
sampleDistributedCache1
sampleCache3
size=10;memsize=10;diskSize=0;hits=0;missed=0;liveHits=0;liveMissed=0;hitsOnDisk=0

分享到:
评论
2 楼 huashuizhuhui 2013-01-30  
hostname 陪一下 host文件
1 楼 atgoingguoat 2013-01-30  
Tomcat7
下面也报这个错。
警告: Explicitly setting the listener hostname to 'localhost' is not recommended. It will only work if all CacheManager peers are on the same machine.

怎么解?

相关推荐

    Ehcache分布式缓存与其在SpringBoot应用

    EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。Ehcache 是一种广泛使用的开源 Java 分布式缓存。主要面向通用缓存,Java EE 和轻量级容器。它具有内存和...

    Spring Boot 2.x基础教程:使用EhCache缓存集群.docx

    当有数据更新的时候,每个进程中的缓存都是独立维护的,如果这些进程缓存同步机制,那么就存在因缓存没有更新,而一直都用已经失效的缓存返回给用户,这样的逻辑显然是会有问题的。所以,本文就来说说当使用EhCache...

    异步复制与同步复制 以及ehcache的小tips和我的配置

    异步复制与同步复制 以及ehcache的小tips和我的配置

    Ehcache Java 缓存框架.rar

    在这种情况下,大部分的项目使用中会选择避其锋芒、或者自行实现同步策略进行应对。常见的策略有: 本地缓存中仅存储一些固定不变、或者不常变化的数据。 通过过期重新加载、定时refresh等策略定时更新本地的缓存,...

    Spring Boot整合Redis做集中式缓存

    即使EhCache提供了集群环境下的缓存同步策略,但是同步依然需要一定的时间,短暂的缓存不一致依然存在。 在一些要求高一致性(任何数据变化都能及时的被查询到)的系统和应用中,就不能再使用EhCache来解决了,这个...

    Spring Boot 2.x基础教程:使用集中式缓存Redis.docx

    之前我们介绍了两种进程内缓存的用法,包括Spring Boot默认使用的ConcurrentMap缓存以及缓存框架EhCache。...即使EhCache提供了集群环境下的缓存同步策略,但是同步依然是需要一定的时间,短暂的缓存不一致依然存在。

    smart-cache:基于Ehcache和Redis的Java分布式二级缓存,除了基本操作外,还可以实现所有级别的多计算机集群的缓存监视和获取。

    采用Redis.Topic机制实现缓存同步。 提供缓存管理监视页面。 实现多机本地缓存的获取功能。 与Jedis的API相似,可轻松实现操作。 最小化配置和包装,力求精简。项目介绍基于Ehcache2和Redis的实现的Java的分布式二...

    hibernate 3中的缓存小结

    2) 在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。 &lt;!--配置缓存插件 --&gt; org.hibernate.cache.EhCacheProvider 3) 挎贝ehcache.xml文件到类路径(项目工程的src目录下),这个文件在Hibernate安装...

    Spring整合Ecache

    本实例的环境 eclipse + maven + spring + ehcache + junit ...分布式缓存主要解决集群环境中不同的服务器间的数据的同步问题。 使用Spring的AOP进行整合,可以灵活的对方法的返回结果对象进行缓存

    jvcache:jvcache是​​一个基于vertx的简单库,用于同步本地缓存(如ehcahe)和分布式缓存(如redis)

    jvcache是​​一个简单的基于vertx的库,用于使ehcahe等本地缓存与redis等分布式缓存保持同步。 尽管您可以扩展以支持您选择的其他缓存框架,但它内置了ehcache和redis实现。 它写于2016年。CacheEventBus ...

    毕业设计早餐外卖微信小程序课程设计源代码

    配置使用Ehcache作为页面的第二级缓存,并设置LRU清除策略 选用RabbitMQ中间件,异步保存聊天消息、记录订单的详细信息,并配置每次从队列中消费一条消息;并采用KeepAlive+Haproxy 使用FastDFS+Nginx的Http服务保存...

    趁早(quickearly)B2C早餐外卖微信小程序

    配置使用Ehcache作为页面的第二级缓存,并设置LRU清除策略 选用RabbitMQ中间件,异步保存聊天消息、记录订单的详细信息,并配置每次从队列中消费一条消息;并采用KeepAlive+Haproxy 使用FastDFS+Nginx的Http服务保存...

    Java数据库持久工具timon.zip

    支持外部数据缓存,支持Ehcache,Memcached和内置同步缓存 提供SQL语句解析、格式化工具 安装方式  &lt;groupId&gt;org.pinae  &lt;artifactId&gt;timon  &lt;version&gt;1.1 实例代码1. XML配置&lt;?xml version="1.0" ...

    HttpCacheMicroService

    数据存储在内存中-对于最初的实现,由地图支持的存储库就足够了,因为还不需要诸如EHCache或MemCache的缓存功能(例如LRU过期,缓存未命中,堆外等)。 当前项目数据结构的大小和数据集的大小不太可能需要永久存储...

    jeesuite-libs-其他

    无需修改XML读写分离,事务内操作强制读主库基于注解自动缓存管理(所有查询方法结果自动缓存、自动更新,事务回滚缓存同步回滚机制)自动缓存实现基于jeesuite-cache和spring-data-redis分页组件敏感操作拦截...

    SmartWx微信公众号管理系统-其他

    为兼容jdk1.7,此版本中暂时废弃j2cache,默认仅使用ehcache缓存,如想使用,修改J2CacheUtil,用CacheJ2Utils替换CacheUtils,修改依赖文件 8、七牛云配置。app.properties 项目中暂时未用到,可废弃 9、项目中为简化...

    Jboot微服务框架-其他

    Jboot是专为大型分布式项目和微服务而生。她是一个基于jfinal 和 undertow开发的微服务框架。...修复:当 Jboot 有上层 session 时(比如使用 shiro),修改 Controller session 无法同步上层 session 的问题

    java开源包1

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    java开源包11

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

    java开源包2

    可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...

Global site tag (gtag.js) - Google Analytics