分布式缓存(memcached、JBoss Cache)的学习

来源:互联网 发布:seo最牛的人 编辑:程序博客网 时间:2024/05/22 02:11
一、分布式缓存
memcached,JBoss Cache,SwarmCache,OSCache,JCS,EHCache等开源项目的关注率比较高。
memcached和其他几个不同,JBoss Cache的特点是,功能大而全,可算是Cache集大成者,几乎什么都支持。
其余的几个都很轻量。SwarmCache,OSCache,JCS支持Cluster。EHCache不支持Cluste

Cache的基本特性。
1. 时间记录
数据进入Cache的时间。
2. timeout过期时间
Cache里面的数据多久过期
3. Eviction Policy 清除策略
Cache满了之后,根据什么策略,应该清除哪些数据。
比如,最不经常被访问的数据,最久没有访问到的数据。
4. 命中率
Cache的数据被选中的比率
5. 分级Cache
有些Cache有分级的概念。比如,几乎所有的Cache都支持Region分区的概念。可以指定某一类的数据存放在特定的Region里面。JBoss Cache可以支持更多的级别。
6. 分布式Cache
分布在不同计算机上的Cache
7. 锁,事务,数据同步
一些Cache提供了完善的锁,事务支持。
以上特性,大部分Cache都有相应的API支持。这些API很直观,也很简单

1)memcached
是一个C/S结构的远程Cache实现,主要使用在Shared Nothing Architecture中.
不同计算机上的应用程序通过一个IP地址来访问memcahced Server。
同一个key对应的数据,只存在于一台memcached server的一份内存中.
memcached server也可以部署在多台计算机上。Memcached通过key的hashcode来判断从哪台memcached server上存取数据数据。我们可以看到,同一个key对应的数据,还是只存在于一台memcached server的一份内存中.所以,memcached不存在数据同步的问题.
memcached由于是远程Cache,要求放到Cache的Key和Value都是Serializable.
2)JBoss Cache 
Cluster Cache的数据同步,需要网络通信,这就要求放到Cache的数据是Serializable。
JBoss Cache提出了POJO(Plain Ordinary Java Objects的缩写,它通指没有使用Entity Beans的普通java对象,可以把POJO作为支持业务逻辑的协助类,POJO有一些private的参数作为对象的属性。然后针对每个参数定义了get和set方法作为访问的接口,也被称为Data对象) Cache的概念,意思是数据不是Serializable,一样能够在Cluster中同步
JBoss POJO Cache通过AOP机制(Aspect Oriented Programming 面向切面编程,也叫面向方面编程,是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率),支持对象同步,支持对象属性的同步,支持关联对象的Cache,支持继承,集合,Query,并支持不同级别的事务,俨然一个小型内存数据库级别的数据存储系统。 
JBoss POJO Cache的对象管理类似Hibernate,JDO,JPA等ORM工具,同样有Detach和Attach的概念.Attach就是put,把对象放入到Cache中。Detach就是remove,把对象从Cache中删除。put的时候,放进去的是个干干净净的POJO,出来的时候,就是Enhanced Object,里面夹杂了很多Interceptor代码,监听对象的方法。


1)Cache的操作通常有4个,get,put,remove,clear。
对 于Cluster Cache来说,读操作(get)肯定是Local方法,只需要从本台计算机内存中获取数据。Remove/clear两个写操作,肯定是Remote方 法,需要和Cluster其他计算机进行同步。Put这个写方法,可以是Local,也可以是Remote的。 Local Put比起Remote Put的优势很明显,所以,通常的Cluster Cache都采用Local Put的策略。
2)Memcached可以看作是Center Cache。
Center Cache和Cluster Cache的特性比较如下:
Center Cache没有同步问题,所以,remove/clear的时候,比较有优势,不需要把通知发送到好几个计算机上。
但是,Center Cache的所有操作,get/put/remove/clear都是Remote操作。而Cluster Cache的get/put都是Local操作,所以,Cluster Cache在get/put操作上具有优势。Local get/put在关联对象的组装和分拆方面,优势比较明显。 
3)Cache可以用在任何地方,比如,页面缓存。但Cache的最常用场景是用在ORM(对象关系映射,提供了概念性的、易于理解的模型化数据的方法)中,比如,Hibernate(一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库),JDO(Java Data Object,是Java对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储),JPA(Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中)中。ORM Cache的使用方法有个原则——不要把没有Commit的修改数据放入到缓存中。这是为了防止Read Dirty。数据库事务分为两种,一种是读事务,不修改数据,一种是写事务,修改数据。 
4)ORM Cache一般分为两种。一种是ID Cache(ORM文档中称为二级Cache),用来存放Entity ID对应的Entity对象;一种是Query Cache,用来存放一条查询语句对应的查询结果集.Query Cache的性能需要考虑几个方面。比如,Query Key。Query Key一般由2个部分组成:Query String部分,SQL, HQL, EQL, or OQL;参数部分。寻找Query Key的对应数据的时候,Query Key的比较有两个步骤,先hash,然后equals 

原创粉丝点击