JCS实现分布式缓存共享

来源:互联网 发布:lol物品数据库哪里有 编辑:程序博客网 时间:2024/06/05 02:43

由于要做一个产品,并想希望产品实现分布式,不得不研究下分布式缓存。

缓存的开源项目很多,通过测试,JCS配置及使用最为容易,所以就选用它做为产品缓存管理器。

 

JCS是Apache的一个开源项目,项目网址:http://jakarta.apache.org/jcs/

实现步骤:

1、下载项目jar包,及依赖jar包

    jcs-1.3.jar

    commons-lang-2.3.jar

    commons-collections-2.1.1.jar

    concurrent-1.3.4.jar

2、JCS分布式配置

    在你项目WEB-INF/classes下配置文件cache.ccf

    内容如下:

       jcs.default=LTCP
       jcs.default.cache.attributes=org.apache.jcs.engine.CompositeCacheAttributes
       jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
       jcs.auxiliary.LTCP=org.apache.jcs.auxiliary.lateral.socket.tcp.LateralTCPCacheFactory
       jcs.auxiliary.LTCP.attributes=org.apache.jcs.auxiliary.lateral.socket.tcp.TCPLateralCacheAttributes
       jcs.auxiliary.LTCP.attributes.PutOnlyMode=true
       jcs.auxiliary.LTCP.attributes.TcpListenerPort=1100
       jcs.auxiliary.LTCP.attributes.UdpDiscoveryAddr=228.5.6.8
       jcs.auxiliary.LTCP.attributes.UdpDiscoveryPort=1101
       jcs.auxiliary.LTCP.attributes.UdpDiscoveryEnabled=true

   以上配置实现了局域网内组播形式的通信,你可以配置多台服务器,当一台更新缓存时,其他几台缓存同时被通知更新,实现分布式缓存需求。

3、代码实现

   实现代码相当简洁,附上我的缓存管理类。

   当其中一台机子实现addCache.updateCache.removeCache方法时,均会触发缓存同步事件。

 

 

附:

package com.framework.cache;

import org.apache.jcs.JCS;

/**
 * 用途:缓存管理器
 *
 * @author 顾伟民
 * @date 2009-11-12
 */
public class CacheManager {
 /**
  * 系统缓存体
  */
 public static JCS CACHE;
 
 /**
  * 初始化缓存管理器
  * @autor 顾伟民
  */
 public static void init() {
  try {
   CACHE = JCS.getInstance("SystemCache");
  }
  catch(Exception e) {
   e.printStackTrace();
  }
 }
 
 /**
  * 新增缓存
  * @autor 顾伟民
  *
  * @param cacheKey 标识
  * @param obj 缓存对象
  * @return true或false
  */
 public static boolean addCache(String cacheKey, Object obj) {
  try {
   CACHE.put(cacheKey, obj);
   return true;
  }
  catch(Exception e) {
   e.printStackTrace();
   return false;
  }
 }
 
 /**
  * 更新缓存
  * @autor 顾伟民
  *
  * @param cacheKey 标识
  * @param obj 缓存对象
  * @return true或false
  */
 public static boolean updateCache(String cacheKey, Object obj) {
  try {
   if(CACHE.get(cacheKey)!=null) removeCache(cacheKey);
   return addCache(cacheKey, obj);
  }
  catch(Exception e) {
   e.printStackTrace();
   return false;
  }
 }
 
 /**
  * 删除缓存
  * @autor 顾伟民
  *
  * @param key 标识
  * @return true或false
  */
 public static boolean removeCache(String cacheKey) {
  try {
   CACHE.remove(cacheKey);
   return true;
  }
  catch(Exception e) {
   e.printStackTrace();
   return false;
  }
 }
 
 /**
  * 获取指定缓存对象
  * @autor 顾伟民
  *
  * @param key 标识
  * @return Object 缓存对象
  */
 public static Object getCache(String cacheKey) {
  try {
   return CACHE.get(cacheKey);
  }
  catch(Exception e) {
   e.printStackTrace();
   return null;
  }
 }
}