[转帖]JCS(Java Cache System)的学习使用_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 5796 | 回复: 0   主题: [转帖]JCS(Java Cache System)的学习使用        下一篇 
525271414
注册用户
等级:新兵
经验:66
发帖:0
精华:0
注册:2014-6-18
状态:离线
发送短消息息给525271414 加好友    发送短消息息给525271414 发消息
发表于: IP:您无权察看 2012-4-12 14:45:50 | [全部帖] [楼主帖] 楼主

在做负载调度系统时要求有缓存功能,这样用户提交同样的query时不用node再次计算。其实cache的重头戏是cache的替换算法,它的好坏就决定了自己尝试写了一个cache

一、下载:
1、从http://svn.apache.org/viewvc/jakarta/jcs/trunk/tempbuild/上下载最新的jcs包(例如jcs-1.2.7.9.2.jar)。
2、从http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html 处下载大名鼎鼎的并行算法大师Doug Leaconcurrent.zip,因为jcs用到了里面的一个类。目前还只提供了源代码,需要自己编译。假设将zip包解压缩到了concurrent_src目录下,则从cmd下进入到该目录下后输入命令javac -d concurrent_classes -Xlint:unchecked concurrent_src/*.java-d表示将编译后的类文件放到concurrent_classes目录下,注意需要自己先创建这个目录,后面的参数表示忽略一些警告和安全,如果不使用将编译失败)。
 编译之后还只得到了类文件,为了方便使用可以将它们打成jar包,从cmd进入刚刚创建的concurrent_classes目录下,执行jar cvf concurrent.jar ./EDU命令就得到了一个名为concurrent.jar的包,然后与第1步的包一起使用即可。
二、使用:相当简单
1、配置文件cache.ccf。这个文件非常重要,它配置得好坏也可以产生很大的性能影响。具体配置可参见http://jakarta.apache.org/jcs/BasicJCSConfiguration.html。下面是我的配置文件(注意:每个属性必须在一行,为了排版我有些断成了两行):

# PRE-DEFINED CACHE REGIONS
jcs.region.proxyCache=DC
jcs.region.proxyCache.cacheattributes=org.apache.jcs.engine.
CompositeCacheAttributes
jcs.region.proxyCache.cacheattributes.MaxObjects=50
jcs.region.proxyCache.cacheattributes.MemoryCacheName=org.apache.jcs.
engine.memory.lru.LRUMemoryCache
jcs.region.proxyCache.cacheattributes.UseMemoryShrinker=true
jcs.region.proxyCache.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.region.proxyCache.cacheattributes.ShrinkerIntervalSeconds=60
jcs.region.proxyCache.cacheattributes.MaxSpoolPerRun=500
jcs.region.proxyCache.elementattributes=org.apache.jcs.engine.
ElementAttributes
jcs.region.proxyCache.elementattributes.IsEternal=false
# AVAILABLE AUXILIARY CACHES
jcs.auxiliary.DC=org.apache.jcs.auxiliary.disk.indexed.
IndexedDiskCacheFactory
jcs.auxiliary.DC.attributes=org.apache.jcs.auxiliary.disk.
indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DC.attributes.DiskPath=./data
jcs.auxiliary.DC.attributes.maxKeySize=100000


各个属性的解释可见上面的链接,那里有详细说明。配置文件可以放在classpath下,如果不想这么死板,可以像如下程序中那样指定cache.ccf的存放位置(我这里是相对当前目录,在eclipse里就是工程的目录)
2、在程序中使用:把它稍包装一下,写的类如下

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.apache.jcs.JCS;
import org.apache.jcs.access.exception.CacheException;
import org.apache.jcs.engine.control.CompositeCacheManager;
import EDU.oswego.cs.dl.util.concurrent.Channel;
public class WintimCache {
      private JCS jcs;
      private CompositeCacheManager ccm;
      public WintimCache() {
            try {
                  ccm = CompositeCacheManager.getUnconfiguredInstance();
                  Properties props = new Properties();
                  props.load(new FileInputStream(new File("./conf/cache.ccf")));
                  ccm.configure(props);
                  jcs = JCS.getInstance("proxyCache");
            } catch (CacheException e) {
                  ProxyLogger.getSysLogger().severe(
                  "Error creating cache;Cause:" + e.getMessage());
            }catch (FileNotFoundException e) {
                  ProxyLogger.getSysLogger().severe(e.getMessage());
            } catch (IOException e) {
                  ProxyLogger.getSysLogger().severe(
                  "Error reading file ./conf/cache.ccf ;Cause:" + e.getMessage());
            }
      }
      public byte[] getResponse(String request) {
            return (byte[]) jcs.get(request);
      }
      public void addCacheItem(String request, byte[] response) {
            try {
                  jcs.put(request, response);
            } catch (CacheException e) {
                  ProxyLogger.getSysLogger().warning(
                  "Error adding to cache;Cause:" + e.getMessage());
            }
      }
}


本类是对请求request的响应response的缓存。在服务器收到一个请求后首先调用getResponse方法,它在jcscache里找,如果尚未缓存则返回null。请求处理器判断返回null后,将请求发送给产生响应的node,然后将响应一方面发送给客户,另一方面调用addCacheItem方法存入缓存。
如果之简单!
PS:之前我尝试自己写了一个cache,结果是0.017秒/请求,使用jcs后速度提升到了0.003秒/请求。应该是我写的cache算法一是替换策略简单(随机替换!之前尝试过使用计数办法模拟的LRU,发现更不行)二是对缓存数据结构加了太多的同步锁(虽然我使用了功能强大的java.util.concurrent.ConcurrentHashMap)。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论