由于要做一个产品,并想希望产品实现分布式,不得不研究下分布式缓存。
缓存的开源项目很多,通过测试,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;
}
}
}