001--jcs入门

jcs入门

1、概要

  JCS是Jakarta的项目Turbine的子项目,它是复合式的缓冲工具,具有配置灵活的特点。JCS提供内存、硬盘、分布式架构、构建缓存服务器四种方式来实现对象缓存;能够很方便的实现缓存的差异化定制。缓冲工具对于读操作远远多于写操作的应用性能提高非常显著。

2、 jcs架构图

在这里面涉及到三个核心概念:elements、regions、auxiliaries。一个JCS可以定义多个region,每个region的存活时间、存储方式、对象的容纳数量都可以有自己的定义。Region是JCS中进行对象缓存的单元。与Region对应的是auxiliary。每个region的存储方式以及一些属性,如存活时间等都是由auxiliary定义。Default用来定义默认值,当auxiliary中某个属性没有定义时,就采用default设定的默认值。Region有一个个hashTable组成,存放需要缓存的对象以及对应的key。Elements对应hashTables。

3、功能

JCS现在支持两种内存缓冲算法LRU和MRU。通常都是使用LRU算法。

使用内存缓冲区需要定义缓冲区大小,当超过缓冲区限制时,会将缓冲内容抛弃掉。如果有配硬盘缓冲,则将挤出来的缓冲内容写入硬盘缓冲区。

JCS对于缓冲的对象,可以设定缓冲过期时间,一个对象在缓冲区中停留的时间超过这个时间,就会被认为是“不新鲜”而被放弃。

索引式硬盘缓冲

一方面,为了避免缓冲区过大,撑爆虚拟机的内存,另一方面又希望能够缓冲更多的对象,JCS可以将超出缓冲区大小的对象缓存到硬盘上。配置上也比较方便,只需要指定缓冲临时文件的存放目录位置。硬盘缓冲将缓冲对象的内容写到文件上,但是将访问索引保存在内存中,因此也能够达到尽可能高的访问效率。

并行式的分布缓冲(Lateral)

  通常,将对象缓冲在内存中,一方面提高了应用的性能,而另一方面却使得应用不可以分布式发布。因为假设一个应用配置在两台服务器上并行运行,而两台服务器单独缓冲,则很容易导致两个缓冲区内容出现版本上的不一致而出错。一个机器上修改了数据,这个动作会影响到本地内存缓冲区和数据库服务器,但是却不会通知到另一台服务器,导致另一台上缓冲的数据实际上已经无效了。

  并行式的分布缓冲就是解决这个问题。可以通过配置,将几台服务器配成一个缓冲组,组内每台服务器上有数据更新,会横向将更新的内容通过TCP/IP协议传输到其他服务器的缓冲层,这样就可以保证不会出现上述情况。这个的缺点是如果组内的并行的服务器数量增大后,组内的数据传输量将会迅速上升。这种方案适合并行服务器的数量比较少的情况。

Client/Server式的缓冲(Remote)

客户/服务端式的缓冲集群。这种方式支持一个主服务器和最高达到256个客户端。客户端的缓冲层会尝试连接主服务器,如果连接成功,就会在主服务器上注册。每个客户端有数据更新,就会通知到主服务器,主服务器会将更新通知到除消息来源的客户端以外的所有的客户端。

  每个客户端可以配置超过一个服务器,第一个服务器是主服务器,如果与第一个服务器连接失败,客户端会尝试与备用的服务器连接,如果连接成功,就会通过备用服务器与其他客户端对话,同时会定期继续尝试与主服务器取得连接。如果备用服务器也连接失败,就会按照配置顺序尝试与下一个备用服务器连接。

  这种方式下,更新通知是一种轻量级的,一个机器上的数据更新,不会把整个数据传输出去,而只是通知一个ID,当远程的其他机器收到更新通知后,就会把对应ID的缓冲对象从本地的内存缓冲区中移除,以保证不会在缓冲区内出现错误数据。

  这种构造需要分别配置客户端和服务器,配置比较麻烦。

4、配置

  JCS的好处之一,就是应用在开发的时候,可以不用去构思底层的缓冲配置构架。同一个应用,只需要修改配置,就可以改变缓冲构架,不需要修改应用的源代码。配置方法也比较简单,就是修改配置文件cache.ccf。这个文件放置在WEB-INF/classes目录下。配置格式类似log4j的配置文件格式。下面介绍一下使用各种缓冲结构的配置方法。

内存缓冲

[plain] view plaincopy

  1. #WEB-INF/classes/cache.ccf(以下内容不要换行)
  2. jcs.default=
  3. jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
  4. jcs.default.cacheattributes.MaxObjects=1000
  5. jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache

  上面配置了默认缓冲属性。一个应用中,由于对象类型的不同,可能会使用多个缓冲区,每个缓冲区都会有一个名字,如果在配置文件中没有指明特定的缓冲区的属性,所有的缓冲区都会根据默认属性来构建。上面的内容,指明缓冲区的大小为存放1000个对象,内存缓冲器使用LRUMemoryCache对象。可选的还有MRUMemoryCache,应该可以自定义新的内存缓冲区。1000个缓冲对象这个容量,是指每个缓冲区都缓冲1000个,而不是指所有缓冲区总容量。以上配置,就可以让应用运行起来。

时间过期

  如果需要引入时间过期机制,则需要加上

  jcs.default.cacheattributes.cacheattributes.UseMemoryShrinker=true

  jcs.default.cacheattributes.cacheattributes.MaxMemoryIdleTimeSeconds=3600

  jcs.default.cacheattributes.cacheattributes.ShrinkerIntervalSeconds=60

  这里指明对象超过3600秒则过期,每隔60秒检查一次。

索引式硬盘缓冲

  索引式硬盘缓冲是辅助缓冲的一种,使用时需要做以下事情

[plain] view plaincopy

  1. #定义一个硬盘缓冲区产生器(Factory),取名为DC
  2. jcs.auxiliary.DC=org.apache.stratum.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
  3. jcs.auxiliary.DC.attributes=org.apache.stratum.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
  4. jcs.auxiliary.DC.attributes.DiskPath=g:/dev/jakarta-turbine-stratum/raf
  5. #这里其实就是指明了缓冲文件存放到那里去。
  6. #然后,做以下修改
  7. jcs.default=DC
  8. #这样,所有未特别指定属性的缓冲区都会自己使用一个硬盘缓冲区,缓冲文件会以缓冲区的名字来命名。存放在指定的目录下。
  9. #横向式的并行缓冲
  10. #并行式的配置如下
  11. jcs.auxiliary.LTCP=org.apache.jcs.auxiliary.lateral.LateralCacheFactory
  12. jcs.auxiliary.LTCP.attributes=org.apache.jcs.auxiliary.lateral.LateralCacheAttributes
  13. jcs.auxiliary.LTCP.attributes.TransmissionTypeName=TCP
  14. jcs.auxiliary.LTCP.attributes.TcpServers=192.168.10.129:1121,192.168.10.222:1121
  15. jcs.auxiliary.LTCP.attributes.TcpListenerPort=1121
  16. jcs.auxiliary.LTCP.attributes.PutOnlyMode=false

  这里的配置是在41,129,221三台机器上实现并行缓冲的。

  大家都在1121端口上监听,同时与另外两台机器连接。如果连接失败,就会等待一个时间后再连接一次,直到连接成功为止。三台机器中任意一台的缓冲区发生更新,比如put和remove动作,就会把更新传递给另外两台。

单独指明某个缓冲区的属性

  如果,针对某个缓冲区,比如叫做TestCache1,需要单独配置属性,可以如下配置。

[plain] view plaincopy

  1. jcs.region.testCache1=DC,LTCP
  2. jcs.region.testCache1.cacheattributes=org.apache.stratum.jcs.engine.CompositeCacheAttributes
  3. jcs.region.testCache1.cacheattributes.MaxObjects=1000
  4. jcs.region.testCache1.cacheattributes.MemoryCacheName=org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache
  5. jcs.region.testCache1.cacheattributes.UseMemoryShrinker=true
  6. jcs.region.testCache1.cacheattributes.MaxMemoryIdleTimeSeconds=3600
  7. jcs.region.testCache1.cacheattributes.ShrinkerIntervalSeconds=60
  8. system.GroupIdCache
  9. #这个概念我也不是很清楚。不过JCS文档中指出配置以下内容会比较好。
  10. jcs.system.groupIdCache=DC
  11. jcs.system.groupIdCache.cacheattributes=org.apache.stratum.jcs.engine.CompositeCacheAttributes
  12. jcs.system.groupIdCache.cacheattributes.MaxObjects=10000
  13. jcs.system.groupIdCache.cacheattributes.MemoryCacheName=org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache
  14. #这可能是JCS自己的组管理体系上的缓冲区。

Client/Server式的缓冲(Remote)

  这种构架需要单独配置客户端和服务端,如果要研究,可以查看http://jakarta.apache.org/turbine/jcs/RemoteAuxCache.html

这里给出一个之前系统配置的例子:cache.cff配置

[plain] view plaincopy

  1. # DEFAULT CACHE REGION
  2. # sets the default aux value for any non configured caches
  3. jcs.default=DC
  4. jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
  5. jcs.default.cacheattributes.MaxObjects=1
  6. jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
  7. jcs.default.elementattributes.IsEternal=true
  8. jcs.default.elementattributes.MaxLifeSeconds=360000
  9. jcs.default.elementattributes.IdleTime=1800
  10. jcs.default.elementattributes.IsSpool=true
  11. jcs.default.elementattributes.IsRemote=true
  12. jcs.default.elementattributes.IsLateral=true
  13. # CACHE REGIONS AVAILABLE
  14. # AUXILIARY CACHES AVAILABLE
  15. # Primary Disk Cache -- faster than the rest because of memory key storage
  16. jcs.auxiliary.DC=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
  17. jcs.auxiliary.DC.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
  18. jcs.auxiliary.DC.attributes.DiskPath=./kpicache
  19. jcs.auxiliary.DC.attributes.MaxPurgatorySize=100000000
  20. jcs.auxiliary.DC.attributes.MaxKeySize=10000000
  21. jcs.auxiliary.DC.attributes.OptimizeAtRemoveCount=300000
  22. jcs.auxiliary.DC.attributes.MaxRecycleBinSize=7500

一些方法的操作:

[java] view plaincopy

  1. package com.zyujie.util;
  2. import org.apache.jcs.JCS;
  3. public class JCSManagerDTO {
  4. private static JCSManagerDTO instance;
  5. private static int checkedOut = 0;
  6. public static JCS ObjCache;
  7. private JCSManagerDTO() {
  8. try {
  9. ObjCache = JCS.getInstance("ObjCache");
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. public static JCSManagerDTO getInstance() {
  15. synchronized (JCSManagerDTO.class) {
  16. if (instance == null) {
  17. instance = new JCSManagerDTO();
  18. }
  19. }
  20. synchronized (instance) {
  21. instance.checkedOut++;
  22. }
  23. return instance;
  24. }
  25. public Object getObj(Object key) {
  26. Object obj = null;
  27. obj = (Object) ObjCache.get(key);
  28. return obj;
  29. }
  30. public void storeObject(Object key, Object obj) {
  31. try {
  32. if (!key.equals("")) {
  33. // ObjCache.remove(key);
  34. }
  35. ObjCache.put(key, obj);
  36. } catch (Exception e) {
  37. }
  38. }
  39. public void clearObject(Object key) {
  40. try {
  41. ObjCache.remove(key);
  42. } catch (Exception e) {
  43. }
  44. }
  45. public void clear() {
  46. try {
  47. ObjCache.clear();
  48. } catch (Exception e) {
  49. }
  50. }
  51. public void clearMatchObject(String key) {
  52. // CacheAccess access1=CacheAccess.getAccess("DC");
  53. // java.util.Map map=access1.get.getMatchingCacheElements(key);
  54. }
  55. public static void main(String[] args) {
  56. JCSManagerDTO dto = JCSManagerDTO.getInstance();
  57. dto.storeObject("test1", "111");
  58. dto.storeObject("test2", "222");
  59. dto.storeObject("test3", "333");
  60. dto.storeObject("test4", "444");
  61. System.out.println("test1 is  " + dto.getObj("test1"));
  62. System.out.println("test2 is  " + dto.getObj("test2"));
  63. System.out.println("test3 is  " + dto.getObj("test3"));
  64. System.out.println("test4 is  " + dto.getObj("test4"));
  65. }
  66. }

5、涉及包

依赖jar包

jcs-1.3.jar

commons-lang-2.3.jar

commons-collections-2.1.1.jar

concurrent-1.3.4.jar

时间: 2024-10-22 07:08:41

001--jcs入门的相关文章

从安装PHP到第一个tomcat执行的hello world其实没那么难

001 初入门的朋友问我为什么她的PHP老是不能安装运行成功,作为一个乐(shi)于(li)助(liao)人(mei)的半程序员, 自然是要好好研究然后手把手教妹纸了! 002 话不多说,进入正题 为了公平公正公开,我新开了个空的虚拟机,一切从零开始安装的 电脑操作系统位64位 win10,其他系统未经测试可能有未知问题 开始--- 首先,没有什么比下载并……解压一个php更重要的了(是的,并不需要执行安装程序什么的,解压就好) 天生习惯,就是喜欢最新版的软件,下载后解压到本地. 没错,就是这货

JavaScript入门:001—概述

关于JavaScript JavaScript针对html页面进行交互行为:JavaScript是脚本语言,解释执行的:JavaScript可以直接嵌入html页面,也可以是个.js文件加载到html页面执行: JavaScript是免费的. JavaScript的作用 JavaScript是为html页面提供的编程工具 即使不是程序员也可以使用javascript进行页面的设计和美化,只需写一段javascript程序即可.JavaScript能响应事件 在html元素上设置一个事件,当事件被

快闪PPT 快速入门教程 脑洞大开,特效随你定 ----口袋动画PA(初学易上手001):

你没有看错--10分钟入门--30分钟精通---随心所愿--特效你定!!! 举个栗子:废话不多说直接进入教程: 直接上插件:如果慢慢学习可能立马见效效果不明显 上插件:"口袋动画PA"       链接:https://pan.baidu.com/s/1qmfi_ylNuGG5mN143KhfEQ 密码:zj1k 1.现在安装,安装完毕启动PPT,即可效果如下 看到上图恭喜你!!!! 2.使用方法: (1)第一快速套用效果快!!!别太激动,仔细琢磨 使你的快闪PPT无懈可击,带动全场气

【Android学习篇】安卓自学入门:001

Android-使用人数最多的手持设备操作系统 为何我要学习Android? 我在校的时候学习的是Java web开发,毕业后来到一家游戏公司,主要做unity 3D 和 cocos 2d 开发.在公司,我等于是闲人,啥都不用做,偶尔帮他们写个SQL,统计个数据啥的! 在公司待了半个月吧,这没事儿做.公司给的需求业务不明确.刚毕业的毛头小子也看不懂需求.我就觉得该学习点别的,打发打发没事做的时间,于是我选择Android ,毕竟这是最近烫手的技术. 声明: 我初学Android,很多地方理解不到

001.Getting Started -- 【入门指南】

Getting Started 入门指南 662 of 756 people found this helpful Meng.Net 自译 1. Install .NET Core 到官网安装 .NET Core 2. Create a new .NET Core project: 用cmd命令窗口 ,创建一个新的 工程 mkdir aspnetcoreapp 新建目录 aspnetcoreapp cd aspnetcoreapp 移动到目录  aspnetcoreapp dotnet new

django从入门到放弃之001.初探

环境:为了使服务器能够开发多个应用程序,环境版本互不影响,利用virtualenv来创建独立隔离的环境进行开发使用. #安装virtualenv: [[email protected] django]# pip3 install virtualenv #创建一个虚拟环境 [[email protected] django]# virtualenv django_env Using base prefix '/usr/local' New python executable in /django/

css入门001

css层叠样式表 css的使用方式 在元素的style属性内 行内式 内联式 写在<style>标签内 写在外部css文件中,用<link>关联到html中 @import可以引入css,用于css中引入css css的格式 选择器{ 属性:值; 属性:值: } css的长度单位 px 像素 em 相对于默认大小倍数 百分比 颜色的表示 英文单词 rgb方式 rgb(0~255,0~255,0~255) rgb(百分比,百分比,百分比) rgb(255,255,255) 白色 rg

HTML入门之001

什么是HTML: 超文本标记语言 HTML基本语法 HTML基本标签(元素): 单标签 <标签名>或</标签名> 双标签<标签名>内容</标签名> 属性: 属性属于标签 一个标签可以有多个属性,每个属性 有不同的意义 属性值最好写在双引号中 代码规范 缩进TAB或4个空格 HTML主体结构标签 文档声明 <!doctype html> html标签 <html></html> head 标签 <head><

001课-java_web开发入门

一.Tomcat服务器常见启动问题:(1).Java_home环境变量,由于tomcat服务器的bin目录中的一些jar文件必须使用到java类库,所以必须先配置Java_home环境变量.(2).端口占用问题(3).Catalina_home环境变量的问题,如果配置了catalina_home环境变量,则默认启动的是catalina_home所指向的tomcat服务器. 二.Tomcat目录结构:(1).bin:存放启动和关闭tomcat的脚本文件.(2).conf:存放tomcat服务器中的