java开源缓存框架和memcache分析

JBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能。缓存数据被自动复制,让你轻松进行Jboss服务器之间的集群工作。JBossCache能够通过Jboss应用服务或其他J2EE容器来运行一个Mbean服务,当然,它也能独立运行。 JBossCache包括两个模块:TreeCache和TreeCacheAOP。 TreeCache --是一个树形结构复制的事务处理缓存。 TreeCacheAOP --是一个“面向对象”缓存,它使用AOP来动态管理POJO .

 OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。OSCache有以下特点:缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。拥有全面的API--OSCache API给你全面的程序来控制所有的OSCache特性。永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)。

Ehcache出自Hibernate,在Hibernate中使用它作为数据缓存的解决方案。 

Memcache 缓存服务 

Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。 
它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。 
为什么会有Memcache和memcached两种名称? 
其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名 

Memcache工作原理 

首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。 

与许多 cache 工具类似,Memcached 的原理并不复杂。它采用了C/S的模式,在 server 端启动服务进程,在启动时可以指定监听的 ip,自己的端口号,所使用的内存大小等几个关键参数。一旦启动,服务就一直处于可用状态。Memcached 的目前版本是通过C实现,采用了单进程,单线程,异步I/O,基于事件 (event_based) 的服务方式.使用 libevent 作为事件通知实现。多个 Server 可以协同工作,但这些 Server 之间是没有任何通讯联系的,每个 Server 只是对自己的数据进行管理。Client 端通过指定 Server 端的 ip 地址(通过域名应该也可以)。需要缓存的对象或数据是以 key->value 对的形式保存在Server端。key 的值通过 hash 进行转换,根据 hash 值把 value 传递到对应的具体的某个 Server 上。当需要获取对象数据时,也根据 key 进行。首先对 key 进行 hash,通过获得的值可以确定它被保存在了哪台 Server 上,然后再向该 Server 发出请求。Client 端只需要知道保存 hash(key) 的值在哪台服务器上就可以了。 

Java代码   收藏代码
  1.         其实说到底,memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。  
  2.   
  3. memcache测试:  
  4. package com.ctoall.core;  
  5.   
  6. import java.util.Date;  
  7.   
  8. import com.danga.MemCached.MemCachedClient;  
  9. import com.danga.MemCached.SockIOPool;  
  10.   
  11. @SuppressWarnings("deprecation")  
  12. public class MemCached {  
  13.      // 创建全局的唯一实例  
  14.     protected static MemCachedClient mcc = new MemCachedClient();  
  15.       
  16.     protected static MemCached memCached = new MemCached();  
  17.     // 设置与缓存服务器的连接池  
  18.     static {  
  19.         // 服务器列表和其权重  
  20.         String[] servers = {"192.168.0.92:11211"};  
  21.         Integer[] weights = {3};  
  22.   
  23.         // 获取socket连接池的实例对象  
  24.         SockIOPool pool = SockIOPool.getInstance();  
  25.   
  26.         // 设置服务器信息  
  27.         pool.setServers( servers );  
  28.         pool.setWeights( weights );  
  29.   
  30.         // 设置初始连接数、最小和最大连接数以及最大处理时间  
  31.         pool.setInitConn( 5 );  
  32.         pool.setMinConn( 5 );  
  33.         pool.setMaxConn( 250 );  
  34.         pool.setMaxIdle( 1000 * 60 * 60 * 6 );  
  35.   
  36.         // 设置主线程的睡眠时间  
  37.         pool.setMaintSleep( 30 );  
  38.   
  39.         // 设置TCP的参数,连接超时等  
  40.         pool.setNagle( false );  
  41.         pool.setSocketTO( 3000 );  
  42.         pool.setSocketConnectTO( 0 );  
  43.   
  44.         // 初始化连接池  
  45.         pool.initialize();  
  46.   
  47.         // 压缩设置,超过指定大小(单位为K)的数据都会被压缩  
  48.         mcc.setCompressEnable( true );  
  49.         mcc.setCompressThreshold( 64 * 1024 );  
  50.     }  
  51.     /** 
  52.      * 保护型构造方法,不允许实例化! 
  53.      * 
  54.      */  
  55.     protected MemCached()  
  56.     {  
  57.           
  58.     }  
  59.       
  60.     /** 
  61.      * 获取唯一实例. 
  62.      * @return 
  63.      */  
  64.     public static MemCached getInstance()  
  65.     {  
  66.         return memCached;  
  67.     }  
  68.       
  69.     /** 
  70.      * 添加一个指定的值到缓存中. 
  71.      * @param key 
  72.      * @param value 
  73.      * @return 
  74.      */  
  75.     public boolean add(String key, Object value)  
  76.     {  
  77.         return mcc.add(key, value);  
  78.     }  
  79.       
  80.     public boolean add(String key, Object value, Date expiry)  
  81.     {  
  82.         return mcc.add(key, value, expiry);  
  83.     }  
  84.       
  85.     public boolean replace(String key, Object value)  
  86.     {  
  87.         return mcc.replace(key, value);  
  88.     }  
  89.       
  90.     public boolean replace(String key, Object value, Date expiry)  
  91.     {  
  92.         return mcc.replace(key, value, expiry);  
  93.     }  
  94.       
  95.     /** 
  96.      * 根据指定的关键字获取对象. 
  97.      * @param key 
  98.      * @return 
  99.      */  
  100.     public Object get(String key)  
  101.     {  
  102.         return mcc.get(key);  
  103.     }  
  104.       
  105.     public static void main(String[] args)  
  106.     {  
  107.         MemCached cache = MemCached.getInstance();  
  108.        StudentDO stuDO=new StudentDO();  
  109.        stuDO.setId(10);  
  110.        stuDO.setAge(28);  
  111.        stuDO.setName("sunney");  
  112.        stuDO.setAddress("广东省深圳市福田区梅华路105号多丽科技楼9楼");   
  113.        cache.add("stu", stuDO);  
  114.        StudentDO stuDO1=(StudentDO)cache.get("stu");  
  115.        System.out.println("id:"+stuDO1.getId());  
  116.        System.out.println("name:"+stuDO1.getName());  
  117.        System.out.println("age:"+stuDO1.getAge());  
  118.        System.out.println("adress:"+stuDO1.getAddress());  
  119.        System.out.println("+++++++++++++++++++++++ok++++++++++++++++++++++++");  
  120.               
  121.     }  
  122. }  

Java代码   收藏代码
  1. package com.ctoall.core;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class StudentDO implements Serializable {  
  6.   
  7.     /** 
  8.      *  
  9.      */  
  10.     private static final long serialVersionUID = 3312721104787630488L;  
  11.     private int Id;  
  12.     private String Name;  
  13.     private int age;  
  14.     private String address;  
  15.     public int getId() {  
  16.         return Id;  
  17.     }  
  18.     public void setId(int id) {  
  19.         Id = id;  
  20.     }  
  21.     public String getName() {  
  22.         return Name;  
  23.     }  
  24.     public void setName(String name) {  
  25.         Name = name;  
  26.     }  
  27.     public int getAge() {  
  28.         return age;  
  29.     }  
  30.     public void setAge(int age) {  
  31.         this.age = age;  
  32.     }  
  33.     public String getAddress() {  
  34.         return address;  
  35.     }  
  36.     public void setAddress(String address) {  
  37.         this.address = address;  
  38.     }  
  39.       
  40. }  

在导入jar包即可 ,此处用的是2.5.1版本  

服务器端客气memcache服务,启动11211端口监听 

http://xuyuanshuaaa.iteye.com/blog/1056378

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值