J2EE项目中使用的缓存技术.ppt

上传人:wuy****n92 文档编号:70792648 上传时间:2023-01-28 格式:PPT 页数:31 大小:2.55MB
返回 下载 相关 举报
J2EE项目中使用的缓存技术.ppt_第1页
第1页 / 共31页
J2EE项目中使用的缓存技术.ppt_第2页
第2页 / 共31页
点击查看更多>>
资源描述

《J2EE项目中使用的缓存技术.ppt》由会员分享,可在线阅读,更多相关《J2EE项目中使用的缓存技术.ppt(31页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、J2EEJ2EE项目中使用项目中使用的缓存技术的缓存技术周周 麟麟数据的访问存在热点,20%的数据占用80%的访问流量,如果能将这20%数据复制到离你更近、速度更快的介质上,提升访问速度,这就是缓存。不但要缓存热点数据,还要缓存重复的计算(做到拿来就用)缓存是什么,能解决什么问题缓存是什么,能解决什么问题l 2/8原则:想方设法,在确保系统灵活的前提下,提高系统的整体性能l 核心目标:数据热点在哪数据热点在哪l 配置文件dbroute.properties,global.properties.l SQL模板文件*.sqll 业务级配置表产品、服务、资费、依赖互斥关系、权限、菜单、静态参数.l

2、其它你能想到的,需要频繁访问,又变动不频繁的数据介质的访问速度介质的访问速度J2eeJ2ee系统中的缓存分类系统中的缓存分类本次缓存 本地只读缓存 本地读写缓存分布式缓存 Memcached缓存会话缓存共享缓存CCD缓存静态参数翻译缓存并发控制缓存 Redis缓存权限缓存为什么设计这么多缓存?为什么设计这么多缓存?就如CPU里面存在寄存器、L1 Cache、L2 Cache、L3 Cache等缓存一样,其实每种缓存都有各自的特点(优/劣),及其使用场景,如果试图用在超出其能力范围之外,不但不能发挥缓存的作用,还会带来一系列的问题。避免铁锤人心态 如果你手上只有锤子,你会发现整个世界只有钉子。典

3、型案例 当初我们的权限缓存是基于Memcached做的,但没考虑批量判权限的场景,在批量判2000个权限时,由于反复多次的反序列化操作,以及2000多次网络 Round-Trip开销,遇到了严重的性能问题,后来深入研究了Redis数据结构特 性,将权限框架做了适度的改造,一下子性能提高了4000多倍。缓存的拓扑位置缓存的拓扑位置本地缓存本地缓存在我们的系统中,本地缓存也称JVM缓存,即存在于JVM内部,其本质是一个HashMap,适用于缓存少量数据,又需要以极高频率访问的场景,典型的例子就是:CODE_CODE模板、CACHE_TABLES表、TD_S_BIZENV表、MVEL配置表、数据模糊

4、化配置表。少量:控制在1W条记录以下,否则容易导致OOM速度:单次访问 1微妙,即一秒钟能访问几百万次特点 访问速度极快 容量有限 在所有JVM中冗余,在分布式环境中会缓存多份本地缓存的细分本地缓存的细分u 本地只读缓存(IReadOnlyCache)u 本地读写缓存(IReadWriteCache)特点 通过实现loadData接口,采用一次性全量加载方式 100%命中 由于做了只读限制,多线程访问下可以做到无锁,极大提高访问速度特点 采用按需增量加载方式 采用LRU算法淘汰冷数据 多线程环境下需要采用读写锁控制数据一致性(框架级做)开发开发本地只读缓存本地只读缓存l 第一步:继承Abstr

5、actReadOnlyCache,并实现loadData接口开发本地只读缓存开发本地只读缓存l 第二步:配置localcache.xml说明:cronExpr=2 0*?,配置刷新周期,这里是每天凌晨2点刷新 init=true,系统启动时初始化该缓存,否则在首次使用时初始化注:业务侧的本地只读缓存全配置成init=false,否则系统启动时加载顺 序不对,容易造成死锁。开发本地只读缓存开发本地只读缓存l 第三步:使用本地只读缓存/*从工厂里获取缓存实例*/IReadOnlyCache cache=CacheFactory.getReadOnlyCache(BizEnvCache.class)

6、;/*从缓存实例里获取缓存对象*/Object obj=cache.get(XXX);.开发开发本地读写缓存本地读写缓存l 第一步:配置localcached.xml说明:name=MVEL_STATEMENT_CACHE,配置的读写缓存名 cronExpr=1 4*?,配置刷新周期,这里是每天凌晨4:01刷新 maxSize=2000,当超过此容量时,会采用LRU算法淘汰冷数据注:maxSize不可设置得过大,一般5000以下为宜,否则容易造成OOM开发开发本地读写缓存本地读写缓存l 第二步:使用本地读写缓存/*根据配置的缓存名,获取读写缓存实例*/IReadWriteCache cache

7、=CacheFactory.getReadWriteCache(MVEL_STATEMENT_CACHE);/*从缓存实例中,根据缓存的key,获取缓存对象*/String cacheValue=cache.get(cacheKey);if(null=cacheValue)/缓存未命中 cacheValue=./查数据库或读文件 if(null!=cacheValue)/设置缓存 cache.put(cacheKey,cacheValue);缓存介绍缓存介绍特点 采用纯C开发的开源内存型K-V缓存系统,应用十分广泛 语言中立,理论上凡带TCP/IP功能的语言都可操作它 通过客户端Hash算法来

8、实现分布式 采用LRU算法淘汰冷数据 可进行水平容量扩展,能够缓存上百GB的数据 可以对数据设置有效期 速度比不上本地缓存,但也足够快(千兆网 TPS:几万)分布式分布式memcachedmemcached缓存配置说明缓存配置说明数据中心(数据中心(datacenterdatacenter)集群定义(集群定义(clustercluster)缓存节点(缓存节点(addressaddress)u session_cache会话缓存 u shc_cache 共享缓存u codecode_cache CCD查询结果集缓存u staticparam_cache 静态参数翻译缓存u bcc_cache 并

9、发控制缓存会话缓存会话缓存我们的系统分为各个子系统,如个人、集团、帐管、信控、资源、营销等等以往的方式是每个子系统部署在各自独立的Web容器中,每个子系统做一个集群,管理各自内部的会话,由于集群内部各节点要实时同步会话对象,而且会话对象里夹杂着权限等大量信息,造成Web容器内存消耗过高,一来效率不好,二来也不利于系统的水平扩展。新系统中我们开发了SNA框架,将各个子系统会话统一管控起来,统一存储进memcached,并且将员工的权限信息从会话中抽离,保存进redis,精简了会话对象,这样整合各个子系统时更加容易,而且避免了同步开销,性能显著提升,安全性也更好,而且还大大简化了部署的复杂度。共享

10、缓存共享缓存共享缓存是所有web、web均可访问的memcached内存空间。原始的目的 为了简化页面流的数据传递。以往页面流一步步往下走,需要携带大量的数 据信息,通常我们是在页面上用隐藏域来保存,这样不但不方便、效率不好,每次都需要在客户端与服务端来回传递,而且还带来了安全问题。采用共享 缓存后,我们可以将数据保存进共享缓存中,避免数据在上下级页面来回传 递,这样能大大简化了页面流的开发。现实的类比 假如你携带十几来个大包小包,从长沙去北京。这样包裹不但容易丢,而且 还不经济(因为你可能会要为你的包裹买单)。日常生活中我们可能会考虑 先在长沙找一个快递公司把所有的包裹交给它,自己拿着快递单

11、只身前往北 京,到了之后通知快递公司送货上门。这样既轻松、经济、还安全。快递公 司就类似于我们的共享缓存,它可以让你在长沙把包裹存进去,拿着快递单,到北京再把它取出来。快递单就相当于Key,包裹就相当于你缓存的数据。三户缓存三户缓存三户(客户、用户、账户)信息,使用非常频繁,以往的系统中,一笔业务进来,往往需要多次查询三户信息,造成了系统的不必要开销。新系统中,业务框架创新性的将三户信息缓存进了共享缓存,并且统一了所有查询三户信息的API,这样一笔业务只会在第一次访问三户信息时查询数据库,后面都会通过缓存直接返回。三户缓存清理订单完工,提交事务后,主动清理三户缓存120秒超时,三户信息自动从共

12、享缓存里清除开发开发CCDCCD查询结果集缓存查询结果集缓存l 第一步:配置*.sql文件这是一条根据优惠编码查询优惠信息的SQL,由于优惠表查询频繁,且数据不会经常变动,因此考虑将此SQL查询出来的结果集做缓存。在sql文件的首行,打上-IS_CACHE=Y的标记,注意大写。开发开发CCDCCD查询结果集缓存查询结果集缓存l 第二步:检查UOP_CEN.CACHE_TABLES表中是否配置有TD_B_DISCNT 检查SQL涉及的所有表,是否存在于CACHE_TABLES中,如果不存在需要手工加上,如果已经存在就不用管了,注意大写,VERSION配置成SYSDATE,STATE配置成U,CA

13、CHE_TABLES用来保存表的版本号,通过改变版本号,可实现缓存的刷新,后面会说明原理。CCDCCD缓存原理缓存原理CCDCCD缓存原理缓存原理APP启动时,将CODE_CODE全表缓存至本地只读缓存APP启动时,将CACHE_TABLES全表缓存至本地只读缓存CODE_CODECODE_CODECACHE_TABLESCACHE_TABLESl key的构成 日期+TAB_NAME+SQL_NAME+$REL_TAB_NAME+$VERSION+$REL_PARAM_NAME+$PARAM_VALUE 日期:如 20140202,每天零点变化 REL_TAB_NAME:表名,从CrmCod

14、eCodeCache里获得 VERSION:表的版本号,从CrmCacheTablesCache里获得 REL_PARAM_NAME:参数名,从CrmCodeCodeCache里获得 PARAM_VALUE:参数值,从入参里获得l value的构成 查询结果集,IDatasetCCDCCD缓存原理缓存原理 CCD未命中 CCD命中CCDCCD缓存使用效果缓存使用效果通过监控平台收集了湖南移动线上系统42天的统计数据,总命中223亿次,消耗8G-12G内存,单次访问1ms平均每秒命中:5583452684*4/42.8/86400=6039.56(注:有四个实例)平均命中率:(558345268

15、4-187790494)/5583452684=96.6%意味着CCD缓存平均每秒要拦截掉 6000 多次数据库查询,大大降低了数据库的消耗,提升了系统的整体性能静态参数翻译缓存静态参数翻译缓存 万能的 所有基于StaticUtil返回的数据都会被缓存,并且都存进了参数翻译缓存,并不仅限于TD_S_STATIC表。静态参数缓存的更新 同样也是基于表的版本号进行更新,和CCD缓存更新机制保持一致。并发控制缓存并发控制缓存 服务端调用频率控制 控制某服务在一分钟内能够被调用的次数。做频率控制的目的 作为核心支撑系统,会和许多周边系统有交互,而且很多都是实时接口。在设计该类实时 接口时,需要考虑到当

16、外系统故障时,波及到自身的问题。J2EE项目中采用了分布式并发 控制,实现对外系统调用的并发控制。当外系统发生故障,或处理能力不够时,可以适当 调低“外依赖筏值锁”,或直接锁死。业务调用被锁的外系统接口时,直接抛“XX系统处 理能力达到上限!”。以此达到隔离外系统故障波及CRM系统的问题,这样做的最大的好 处在于:系统不会白白消耗自身的资源,不被外系统给拖累。缓存介绍缓存介绍特点 采用纯C开发的带有持久化功能的K-V系统,应用日益广泛 一个数据结构服务器,支持字符串、列表、Map、Set等复杂数据结构 性能非常好,TPS:10W左右 语言中立,理论上凡带TCP/IP功能的语言都可操作它 内存采用单线程实现,各命令都具备原子性 通过客户端hash算法来实现分布式 采用LRU算法淘汰冷数据 可设置数据的有效期 可进行水平容量扩展,能够缓存上百GB的数据 速度比不上本地缓存,但也足够快,跟Memcached属于同一数量级Thank You!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com