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
分享到:
相关推荐
EhCache 是一个纯 Java 的进程内缓存框架,具有快速、精干等特点,是 Hibernate 中默认的 CacheProvider。Ehcache 是一种广泛使用的开源 Java 分布式缓存。主要面向通用缓存,Java EE 和轻量级容器。它具有内存和...
当有数据更新的时候,每个进程中的缓存都是独立维护的,如果这些进程缓存同步机制,那么就存在因缓存没有更新,而一直都用已经失效的缓存返回给用户,这样的逻辑显然是会有问题的。所以,本文就来说说当使用EhCache...
异步复制与同步复制 以及ehcache的小tips和我的配置
在这种情况下,大部分的项目使用中会选择避其锋芒、或者自行实现同步策略进行应对。常见的策略有: 本地缓存中仅存储一些固定不变、或者不常变化的数据。 通过过期重新加载、定时refresh等策略定时更新本地的缓存,...
即使EhCache提供了集群环境下的缓存同步策略,但是同步依然需要一定的时间,短暂的缓存不一致依然存在。 在一些要求高一致性(任何数据变化都能及时的被查询到)的系统和应用中,就不能再使用EhCache来解决了,这个...
之前我们介绍了两种进程内缓存的用法,包括Spring Boot默认使用的ConcurrentMap缓存以及缓存框架EhCache。...即使EhCache提供了集群环境下的缓存同步策略,但是同步依然是需要一定的时间,短暂的缓存不一致依然存在。
采用Redis.Topic机制实现缓存同步。 提供缓存管理监视页面。 实现多机本地缓存的获取功能。 与Jedis的API相似,可轻松实现操作。 最小化配置和包装,力求精简。项目介绍基于Ehcache2和Redis的实现的Java的分布式二...
2) 在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。 <!--配置缓存插件 --> org.hibernate.cache.EhCacheProvider 3) 挎贝ehcache.xml文件到类路径(项目工程的src目录下),这个文件在Hibernate安装...
本实例的环境 eclipse + maven + spring + ehcache + junit ...分布式缓存主要解决集群环境中不同的服务器间的数据的同步问题。 使用Spring的AOP进行整合,可以灵活的对方法的返回结果对象进行缓存
jvcache是一个简单的基于vertx的库,用于使ehcahe等本地缓存与redis等分布式缓存保持同步。 尽管您可以扩展以支持您选择的其他缓存框架,但它内置了ehcache和redis实现。 它写于2016年。CacheEventBus ...
配置使用Ehcache作为页面的第二级缓存,并设置LRU清除策略 选用RabbitMQ中间件,异步保存聊天消息、记录订单的详细信息,并配置每次从队列中消费一条消息;并采用KeepAlive+Haproxy 使用FastDFS+Nginx的Http服务保存...
配置使用Ehcache作为页面的第二级缓存,并设置LRU清除策略 选用RabbitMQ中间件,异步保存聊天消息、记录订单的详细信息,并配置每次从队列中消费一条消息;并采用KeepAlive+Haproxy 使用FastDFS+Nginx的Http服务保存...
支持外部数据缓存,支持Ehcache,Memcached和内置同步缓存 提供SQL语句解析、格式化工具 安装方式 <groupId>org.pinae <artifactId>timon <version>1.1 实例代码1. XML配置<?xml version="1.0" ...
数据存储在内存中-对于最初的实现,由地图支持的存储库就足够了,因为还不需要诸如EHCache或MemCache的缓存功能(例如LRU过期,缓存未命中,堆外等)。 当前项目数据结构的大小和数据集的大小不太可能需要永久存储...
无需修改XML读写分离,事务内操作强制读主库基于注解自动缓存管理(所有查询方法结果自动缓存、自动更新,事务回滚缓存同步回滚机制)自动缓存实现基于jeesuite-cache和spring-data-redis分页组件敏感操作拦截...
为兼容jdk1.7,此版本中暂时废弃j2cache,默认仅使用ehcache缓存,如想使用,修改J2CacheUtil,用CacheJ2Utils替换CacheUtils,修改依赖文件 8、七牛云配置。app.properties 项目中暂时未用到,可废弃 9、项目中为简化...
Jboot是专为大型分布式项目和微服务而生。她是一个基于jfinal 和 undertow开发的微服务框架。...修复:当 Jboot 有上层 session 时(比如使用 shiro),修改 Controller session 无法同步上层 session 的问题
可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...
可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...
可以将列表数据缓存到redis中,其他kv结构数据继续缓存到memcached 6. 支持redis的主从集群,可以做读写分离。缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL...