- 浏览: 359899 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
missfmaster:
这框架好特么底层。
Terracotta设计原理分析--(部分内容来自官方描述) -
小黄牛:
很好不错!分享一个在电商购物支付流程中,在各大参与者系统中可能 ...
分布式事务设计-两段式提交 -
zhglhy:
学习了,感谢分享
JAVA垃圾回收分析 -
talentluke:
如果在事务一中出现故障,数据库是可以回滚但消息队列不能回滚,队 ...
用消息队列和消息应用状态表来消除分布式事务(转载) -
langmanxingkong123:
谁说jedis不能存集合类的数据。乱说。。。
redis jredis jedis 使用
因为在项目中想通过缓存来acegi的整合,因此选用了Ehcache,后来发现被terracotta收购后的Ehcache,由原本一个简简单单的 Java 缓存引擎变成了一个解决方案,而项目本身更是切分为以下几个大模块:
ehcache 打包了所有的模块 ehcache-core 核心缓存引擎,RMI复制模块和 Hibernate 的插件 ehcache-terracotta 用于跟 Terracotta 集群系统进行无缝集成(这是必须的,要不 Terracotta买你干嘛) ehcache-monitor (beta 2) 企业级监控和开发管理 ehcache-web Java Servlet 容器的缓存、gzip压缩过滤器 ehcache-debugger 用于跟踪和调试分布式复制事件 ehcache-jcache 实现了 JSR107 JCACHE ehcache-jgroupsreplication 使用 JGroups 多播框架进行缓存复制 ehcache-jmsreplication 使用 JMS 进行缓存复制 ehcache-openjpa 为 OpenJPA 提供缓存插件 ehcache-server 提供独立的或者WAR形势的 RESTful 的缓存服务
经过整合后的Ehcache,也有如下的特点:
· 简单、易用的分布式缓存:沿用Ehcache单机版API、直接支持Hibernate二级缓存实现、服务器集群支持、减少数据库负载
· 整合性强:EhCache一般用于:Hibernate缓存,DAO缓存,安全性凭证缓存(Acegi),Web缓存,应用持久化和分布式缓存。
· 高效、可靠: 本地内存的访问速度、动态缓存数据持久话、客户端于服务器端均可横向线性扩展、自动数据分片、虚拟缓存内存管理,无限缓存空间、多级缓存动态均衡
· 延迟写(Write Behind)和直通写(Write Through):
· Java分布式事务的全面支持:ehcache可以通过配置,设定一个缓存为XAResource,自动加入分布式事务管理器启动的分布式事务;能够自动检测常用的分布式事务管理器;支持Spring、EJB等的分布式事务管理
· 企业用户支持:支持工业标准JMX、可视化管理工具、动态监控、调试、优化
由于Ehcache本身就是Hibernate标准二级缓存实现,因此将单机版的Hibernate二级缓存扩展到分布式缓存于将Ehcache扩展成分布式缓存一样简单。其优势也可以自动继承
读写机制(Write Behind、Write Through)
1) 提供Writer接口,负责将缓存数据写入数据库或者其他存储介质中;
2) Write Behind允许将数据保存在缓存中,再用后台线程把缓存数据异步保存到数据库或者其他存储介质中。由于缓存数据保存在Terracotta服务器上,不会由于客户端JVM宕机导致数据丢失。Write Behind是通过缓存提高数据写入速度的有效方式;
3) Write Through则是在将数据写入缓存后,马上调用Writer写入数据库中;
配置文件说明
EhCache在默认情况下,即在用户未提供自己的配置文件ehcache.xml或ehcache-failsafe.xml 时,EhCache会依据其自身Jar存档包含的ehcache-failsafe.xml 文件所定制的策略来管理缓存。如果用户在classpath下提供了ehcache.xml或ehcache-failsafe.xml 文件,那么EhCache将会应用这个文件。如果两个文件同时提供,那么EhCache会使用ehcache.xml 文件的配置。
EhCache.xml默认内容如下(在ehcache根目录下可以找到该文件),文件属性说明如下:
diskStore:指定数据在磁盘中的存储位置。l
defaultCache: 当借助CacheManager.add("demoCache")创建Cache时,EhCache便会采 用l<defalutCache/>指定的的管理策略
以下属性是必须的:
maxElementsInMemory - 在内存中缓存的element的最大数目
maxElementsOnDisk - 在磁盘上缓存的element的最大数目l
eternall - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据 timeToIdleSeconds,timeToLiveSeconds判断
overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除.
timeToLiveSeconds - 缓存element的有效生命期
diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用) 和FIFO(先进先出)
DEMO
package com.yale.ehcache.demo; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * 缓存管理器中不存在名为yaleCache的缓存,所以需要先添加: * manager.addCache("yaleCache"); * 如果结合了spring,下述的大部分代码其实可以通过注入的方式在配置文件中完成 */ public class EhCacheManagerDemo { protected static final Log log = LogFactory.getLog(EhCacheTestDemo.class); public static void main(String[] args) { CacheManager manager = new CacheManager(); manager.addCache("yaleCache"); String[] cacheNames = manager.getCacheNames(); for (String cacheName : cacheNames) { log.info("缓存的名字:" + cacheName); } //获得缓存 Cache cache = manager.getCache("yaleCache"); Element element = new Element("yale1", "缓存数据1"); //往缓存中存放数据,EhCache会依据一定的策略将数据存储到内存或磁盘中 cache.put(element); //获得已 缓存的数据 log.info(cache.get("yale1").getValue()); element = new Element("yale2", "缓存数据2"); cache.put(element); log.info(cache.get("yale2").getValue()); log.info(cache); //打印出内存中已缓存的Element数量 log.info(cache.getMemoryStoreSize()); //打印出磁盘中已缓存的Element数量 log.info(cache.getDiskStoreSize()); //将“data1”从缓存中销毁掉 cache.remove("yale1"); log.info(cache.getMemoryStoreSize()); log.info(cache.getDiskStoreSize()); System.exit(-1); } }
整合spring acegi
web应用每次请求一个受保护的资源时,认证管理器就被调用以获取用户的安全信息。如果获取用户信息涉及到查询数据库,每次都查询相同的数据可能在性能上消耗比较大。如果用户信息不会频繁改变,更好的做法是在第一次查询时缓存用户信息,并在后续的查询中直接从缓存中获取用户信息(我配置在acegi的配置文件中):
<!-- EhCacheBasedUserCache是EhCache的一个缓存实现,提供了向缓存中放入、取得和删除用户明细信息的功能,Acegi需要用它来管理缓存--> <bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache"> <property name="cache" ref="userCacheBacked" /> </bean> <!-- EhCacheFactoryBean是用于维护Cache实例的工厂Bean,Cache需要依赖于CacheManager而存在 --> <bean id="userCacheBacked" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheManager" ref="cacheManager" /> <property name="cacheName" value="myUserCache" /> <!--缓存名称--> </bean> <!-- 缓存管理器,一个CacheManager能够创建和维护多个Cache实例 --> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="/WEB-INF/ehcache-security.xml" /> </bean> <!--身份认证提供者DaoAuthenticationProvider只需要基于字符串的用户名和密码。 好多认证机制会产 生基于字符串的用户名和密码的集合,包括(但不限于)表单和基本验证--> <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="userDetailsService"/> <property name="passwordEncoder" ref="passwordEncoder"/> <property name="saltSource" ref="saltSource"/> <property name="userCache" ref="userCache"/> </bean>
DaoAuthenticationProvider通过org.acegisecurity.providers.dao.UserCache接口的实现类支持对用户信息进行缓
存。接口UserCache中方法提供了向缓存中放入、取得和删除用户明细信息的功能。我们可以写一个自己的UserCache实现类,实现对用户信息的缓存。你考虑开发自己的UserCache实现类之前,应该首先考虑Acegi提供的两个方便的UserCache实现类:
org.acegisecurity.providers.dao.cache.NullUserCachel
org.acegisecurity.providers.dao.cache.EhCacheBasedUserCachel
NullUserCache事实上不进行任何缓存。任何时候调用它的 getUserFromCache方法,得到的返回值都是null。这是DaoAuthenticationProvider使用的默认 UserCache实现。
EhCacheBasedUserCache是一个更实用的缓存实现类如其名,它是基于开源项目ehcache实现的。ehcache是一个简单快速的针对Java的缓存解决方案,同时也是Hibernate默认的和推荐的缓存方案
维护工具
developer console
专门为开发人员提供的集群监控、调试、管理工具。允许用户查看集群的拓扑信息、查看集群中共享的数据、获取统计信息、查看CPU、Heap使用情况、获取线程堆栈试视图(thread dump)、收集调试信息等等。对于Ehcache和Hibernate用户,还可以监控缓存的使用情况,调整缓存配置等等。
operation center
为集群管理人员提供专用的管理工具。可以用来监控各个服务器以及客户端的CPU、Heap使用情况、备份共享数据、关闭服务器或者客户端程序等等。
发表评论
-
王者荣耀是用什么语言开发的!
2020-10-29 19:24 12142017年什么最火? 不用问,肯定是人人都“ ... -
王者荣耀是用什么语言开发的!
2020-10-29 19:04 02017年什么最火? 不用问,肯定是人人都在撸的“王 ... -
用消息队列和消息应用状态表来消除分布式事务(转载)
2012-11-21 11:12 3338由于数据量的巨大,大 ... -
CA认证原理以及实现(下)
2012-09-10 20:38 17088在上述的文章后了解到原理之后,我们这篇文章来进行CA的搭建。 ... -
CA认证原理以及实现(上)
2012-09-10 20:00 49476原理基础数字证书为发 ... -
企业追逐的--网络热点(云、海量数据、虚拟化)(下)
2012-06-28 21:58 1487云管理平台云是IT实现,是造出来的,不是买来的。我们可以买服务 ... -
企业追逐的--网络热点(云、海量数据、虚拟化)(上)
2012-06-28 21:08 1694云之所以热,是因为现在以及未来市场的业务推动力(回报率),现在 ... -
Terracotta Server[兵马俑]集群
2012-06-14 01:23 10816Terracotta的介绍以及原理在我之前的文章中已经做了相关 ... -
Local Cache + Server Cache
2012-05-27 00:01 785其实下面说的一些设计思路来源于一些开源的缓存软件,比如Ehca ... -
Web请求-异步模式
2012-05-26 22:45 268Comet技术已经不算是 ... -
分布式事务设计-三段式提交
2012-05-25 20:24 5548前面的文章提到的两段 ... -
分布式事务设计-两段式提交
2012-02-08 17:16 14228事务是一个很重要的概念,它必须满足ACID特性,在单机的数据库 ... -
架构设计要“注意点”
2011-09-08 14:24 370资源有限注意点:系统设计的时候总是估摸不到会有大数据量从远端传 ... -
替代分布式事务策略
2011-06-10 19:59 2251由于数据量的巨大,现 ... -
你符合成为一个架构设计师的特征吗?
2011-03-30 12:28 557其实想写这篇文章也是 ... -
缓存客户端集群
2011-03-18 17:12 1677Memcached Cache是集中式Cach ... -
Netlog中数据库演变过程
2011-03-18 15:45 476Netlog拥有4000万活跃用户,每个月有超过5000万的独 ... -
如何检测一台机器是否宕机?(转载)
2011-03-15 20:19 1766检测一台机器是否宕机 ... -
淘宝OceanBase设计(转载)
2011-03-14 16:26 1374OceanBase有什么特点 ... -
Facebook运用软件
2010-08-12 15:51 16822010年6月,Facebook现在的经营规模,诸多传统服务器 ...
相关推荐
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...