缓存是系统性能提升优先法宝,在互联网应用系统中,屡试不爽。网上有很多资料介绍缓存理论及使用策略,本文就不再涉及了,今天简单将缓存做个归类,重点分享以前在实际业务中碰到场景以及如何使用。

接下来主要分两部分介绍:缓存分类与应用实践案例。

缓存分类

缓存一般有以下几类:客户端、浏览器、CDN缓存、NGINX缓存、应用缓存及统一缓存(如redis)。

▲缓存分类:用户->数据层

  • 客户端缓存:很少使用,一般都是传统企业才会使用。把不变化或很长时间才变化的数据按一定格式存储在客户端的本地文件中,使用时通过js读取解析使用,延用了C/S结构的方式,适合数据量很大业务且技术有所不足的开发。

  • 浏览器缓存:这种形式使用很广泛,极大地提升了用户体验,但有时会出现没及时更新导致显示“错误”的信息。把已经请求过的Web资源(如html页面,图片,js,css等)拷贝一份副本储存在浏览器中,缓存会根据进来的请求保存输出内容的副本。这种缓存带来的好处有三点:减少网络带宽消耗,降低服务器压力,减少网络延迟、加快页面打开速度,适合请求量大、静态的数据请求。

  • CDN缓存:在用户和服务器之间增加cache层,把数据存放到内容分发网络机房服务器中,用户请求进从最近的CDN节点获取。主要缓存图片、js及css文件,CDN需要付费,有些规模的网站才会使用。

  • NGINX缓存:对客户已经访问过的内容在Nginx服务器本地建立副本,达到减少Nginx服务器与后端服务器之间的网络流量。

  • 应用缓存:在后端应用中使用缓存,如java常使用Ehcache及gauva缓存组件进行数据缓存,也可以针对特殊场景在请求中进行线程缓存。适合调用量大且应用内部方法间调用,减少网络消耗。

  • 统一缓存:使用内存减少对数据库的直接访问,提高网站性能,如使用memcache或redis搭建缓存服务。

前四类都是在网络传输中进行数据缓存,一般研发很少会去使用,后两类在应用中缓存,在开发中经常使用,接下来介绍后两类缓存的实践案例。

实践案例

1、热点key

场景:在大促期间,给所有活动页及频道页提供侧滑html片段数据,会有修改。

特点:数据记录少,调用量比较大(峰值400万/分钟)。

在接到需求时,第一反应是使用redis进行缓存,数据更新时删除redis缓存。读取时先读取redis,缓存为空,读取DB并存放redis。

该场景是使用redis当缓存使用,存在一定风险:由于数据量少并发高时,成为热点key会集中命中单个redis实例,流量上去后,性能会变差,甚至可能拖垮实例。

进一步改进本地JVM缓存,加redis缓存,JVM缓存一分种失效,回源redis及数据库。存在集中穿透缓存回源数据库,拖垮应用或数据库的情况,之前有过缓存失效,集中回源数据库的经历,结果应用服务一台台全部倒下,数据库没有压力。事后分析,数据库配置最大连接数为10,外部请求超时时间为500ms,不断有新请求进来,大量请求在等待连接。最后选择在JVM使用ConcurrentMap存放当DB使用,1分钟异步刷新数据。

在大促当天,页面该请求返回性能不太理想,数据返回大概73KB,使用Nginx增加gzip压缩后,数据压缩到13KB,性能提高不少。后续在Nginx增加代理缓存,性能稳定。

2、类目中心设计

类目是电商领域最基础的数据,使用依赖的系统很多,早期是各个系统直接从数据库读取并自行缓存使用,人为给数据库增压。为了避免该情况,着手搭建类目中心,对性能及稳定要求极致,类目中心服务异常不能影响使用方,类目更新后要及时同步给使用方。

经过多次讨论,确认使用三级缓存:客户端缓存、类目系统jvm缓存及统一redis缓存。

▲类目中心--读

  • 客户端缓存:在对外提供的api依赖包中进行缓存封装,通过调用类目系统接口提供缓存后的服务方法。缓存数据记录失效时间,调用时发现缓存数据已失效时,更新失效时间并返回,异步请求类目中心数据刷新。若缓存没有命中,回源请求类目中心。客户端会定时检测类目版本信息,若版本更新变化,客户端数据强制更新。

  • 类目系统jvm缓存:使用jvm缓存,若有过期异步回源,统一缓存redis,穿透直接回源redis。

  • 统一缓存redis:当DB使用,不回源数据库,并定时从数据库把数据刷新至redis中。为了避免并发刷新,使用redis实现排它锁,保证只一个任务刷新。

数据更新请求,有一定的规则:

  • 更新数据库,保证数据库是正确数据,后续步骤异常也可通过定时全量更新弥补;

  • 更新redis缓存;

  • 更新类目中心所有实例JVM缓存:由于系统是多实例集群,需要通知所有实例更新JVM缓存;

  • 更新版本号,用于客户端查验强制更新标识。一定需要JVM更新完成之后,否则客户端可能获取到更新前的“错误”数据。

▲类目中心--更新

客户端95%的请求被客户端缓存命中,调用次数3700万/分钟,性能TP999为1ms。

▲客户端调用次数

▲客户端性能

服务端请求次数3000万/分钟也没有压力,单实例现实际调用次数150万/分钟。

▲服务端调用次数

最后

  • 缓存不仅能当缓存,也可以当DB使用,避免穿透

  • 数据的更新分主动缓存及被动缓存

  • 需要解决数据的一致性及有效性

如何使用,怎么组合,缓存什么数据,都需要结合业务场景,也需要一步步观察、总结才能优化。

转载自:京东技术


资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2018DTC,2018 DTC 大会 PPT

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2018OOW ,Oracle OpenWorld 资料

产品推荐

云和恩墨zData一体机现已发布超融合版本和精简版,支持各种简化场景部署,零数据丢失备份一体机ZDBM也已发布,欢迎关注。

特别推荐:系统性能提升优先法宝 | 缓存应用实践相关推荐

  1. 系统性能提升优先法宝 | 缓存应用实践

    缓存是系统性能提升优先法宝,在互联网应用系统中,屡试不爽.网上有很多资料介绍缓存理论及使用策略,本文就不再涉及了,今天简单将缓存做个归类,重点分享以前在实际业务中碰到场景以及如何使用. 接下来主要分两 ...

  2. IO系统性能之二:缓存和RAID如何提高IO

    2019独角兽企业重金招聘Python工程师标准>>> 从上一篇文章:IO系统性能之一:衡量性能的几个指标的计算中我们可以看到一个15k转速的磁盘在随机读写访问的情况下IOPS竟然只 ...

  3. 史上最全最强的手机软件列表(特别推荐)

    史上最全最强的手机软件列表(特别推荐) ------系统增强类------ ★CodeGuard手机保险箱 ★生日管里软件SmartBirthday 1.02 完全版 ★Diglet.CodeGuar ...

  4. IO系统性能之二:缓存和RAID如何提高磁盘IO性能

    高速缓存(Cache) RAID(Redundant Array Of Inexpensive Disks) 四个性能指标的变化 IO响应时间(IO Response Time) IOPS 传输速度( ...

  5. 浅谈系统性能提升的经验和方法

    浅谈系统性能提升的经验和方法 随着信息技术的快速发展,系统性能优化变得越来越重要.在现代应用程序中,高性能系统已经成为了一个非常重要的目标,因为这可以帮助提高用户体验和提高生产力.在本篇博客中,我将探 ...

  6. 特别推荐 | 专利引用数据,可以用来做哪些研究?

    一.引言 最近有不少学界的朋友向我们询问关于专利引用数据的情况.看来学界已经不能再满足简单统计企业各类专利申请.授权的数量,而希望以更丰富的专利信息为切入点对创新展开更为深入的研究. 文献检索发现,目 ...

  7. 特别推荐:RHCE考试经验

    特别推荐:RHCE考试经验 RHCE考试经验 RHCE在每科考试之前都必须签署不得于考后泄题的同意书,违者会被取消 RHCE资格,这造成了RHCE的考古题取得不易,及RHCE的重考率高.一方面RHCE ...

  8. 《程序员》2007第2期,新产品工具点评 特别推荐“万能数据库查询分析器”发布...

    在<程序员>2007第2期的"新产品&工具点评"部分,编辑"特别推荐"了"万能数据库查询分析器"发布.          ...

  9. Webview离线功能(优先cache缓存+cache缓存管理)

    在做Webview显示服务器的html功能时 需要加入离线功能. 开始思路很狭隘,以为一定应该是从服务器得到的html文件,下载到本地后加载~ 但是这样不能离线查看图片,因为图片数据并不再html中, ...

最新文章

  1. 安装指定版本Angular-CLI
  2. [微信小程序]单选框以及多选框实例代码附讲解
  3. TensorFlow之会话
  4. 机器学习模型调参指南(附代码)
  5. python人脸识别plc_三个Python项目实战,打造人脸识别系统!
  6. python期末考试题及答案翻译-用 python 解 NOIP 竞赛题
  7. 内容分析在用户反馈分析中的应用
  8. 安卓通讯录管理软件_安卓又曝严重漏洞,或监控数亿用户,请尽快更新系统补丁!...
  9. Deep Belief Networks
  10. 安装后添加没有class library_《没有秘密的你》:戚薇曝光手机号,粉丝急忙添加后却甜哭了?...
  11. 前端学习(169):无语义元素
  12. Dell Inspiron 6400上安装Fedora 5后使声卡义务正常的方法
  13. MIDP应用程序的属性
  14. VS2017产品密钥
  15. PDF文件限制密码如何解除
  16. mt4接入python_mt4 调用 api
  17. bin、hex、elf、axf文件的认识
  18. 基于QT的IM(jabber)库和客户端
  19. 2.4g和5g要不要合并_路由器2.4g和5g双频合一好还是分开好
  20. 向量空间模型(vector space model)

热门文章

  1. linux 穿件文件_关于Linux的25件事
  2. 把冰卖给爱斯基摩人_爱斯基摩人使用冰屋应用程序来节省资源
  3. LeetCode 396. 旋转函数(Rotate Function)
  4. ffmpeg解码H.264视频数据,MFC播放视频
  5. es6 Class 的 Generator函数
  6. es6 Reflect对象的静态方法
  7. java密码模块怎么做_密码模块设计
  8. linux能运行英魂之刃吗,英魂之刃需要什么电脑配置
  9. python入门指南阅读答案_【python】入门指南1
  10. ocdma相干非相干_非相干系统是什么意思