亿级请求下多级缓存那些事

本文转自:中生代技术

什么是多级缓存

 

所谓多级缓存,即在整个系统架构的不同系统层级进行数据缓存,以提升访问效率,这也是应用最广的方案之一。我们应用的整体架构如图1所示:

图1 多级缓存方案

整体流程如上图所示:

1)首先接入Nginx将请求负载均衡到应用Nginx,此处常用的负载均衡算法是轮询或者一致性哈希,轮询可以使服务器的请求更加均衡,而一致性哈希可以提升应用Nginx的缓存命中率,相对于轮询,一致性哈希会存在单机热点问题,一种解决办法是热点直接推送到接入层Nginx,一种办法是设置一个阀值,当超过阀值,改为轮询算法。

2)接着应用Nginx读取本地缓存(本地缓存可以使用Lua Shared Dict、Nginx Proxy Cache(磁盘/内存)、Local Redis实现),如果本地缓存命中则直接返回,使用应用Nginx本地缓存可以提升整体的吞吐量,降低后端的压力,尤其应对热点问题非常有效。

3)如果Nginx本地缓存没命中,则会读取相应的分布式缓存(如Redis缓存,另外可以考虑使用主从架构来提升性能和吞吐量),如果分布式缓存命中则直接返回相应数据(并回写到Nginx本地缓存)。

4)如果分布式缓存也没有命中,则会回源到Tomcat集群,在回源到Tomcat集群时也可以使用轮询和一致性哈希作为负载均衡算法。

5)在Tomcat应用中,首先读取本地堆缓存,如果有则直接返回(并会写到主Redis集群),为什么要加一层本地堆缓存将在缓存崩溃与快速修复部分细聊。

6)作为可选部分,如果步骤4没有命中可以再尝试一次读主Redis集群操作。目的是防止当从有问题时的流量冲击。

7)如果所有缓存都没有命中只能查询DB或相关服务获取相关数据并返回。

8)步骤7返回的数据异步写到主Redis集群,此处可能多个Tomcat实例同时写主Redis集群,可能造成数据错乱,如何解决该问题将在更新缓存与原子性部分细聊。

应用整体分了三部分缓存:应用Nginx本地缓存、分布式缓存、Tomcat堆缓存,每一层缓存都用来解决相关的问题,如应用Nginx本地缓存用来解决热点缓存问题,分布式缓存用来减少访问回源率、Tomcat堆缓存用于防止相关缓存失效/崩溃之后的冲击。

虽然就是加缓存,但是怎么加,怎么用细想下来还是有很多问题需要权衡和考量的,接下来部分我们就详细来讨论一些缓存相关的问题。

如何缓存数据

接下来部将从缓存过期、维度化缓存、增量缓存、大Value缓存、热点缓存几个方面来详细介绍如何缓存数据。

过期与不过期

对于缓存的数据我们可以考虑不过期缓存和带过期时间缓存,什么场景应该选择哪种模式需要根据业务和数据量等因素来决定。

不过期缓存场景一般思路如图2所示:

图2不过期缓存方案

使用Cache-Aside模式,首先写数据库,如果成功,则写缓存。这种场景下存在事务成功、缓存写失败但无法回滚事务的情况。另外,不要把写缓存放在事务中,尤其写分布式缓存,因为网络抖动可能导致写缓存响应时间很慢,引起数据库事务阻塞。如果对缓存数据一致性要求不是那么高,数据量也不是很大,则可以考虑定期全量同步缓存。

也有提到如下思路:先删缓存,然后执行数据库事务;不过这种操作对于如商品这种查询非常频繁的业务不适用,因为在你删缓存的同时,已经有另一个系统来读缓存了,此时事务还没有提交。当然对于如用户维度的业务是可以考虑的。

不过为了更好地解决以上多个事务的问题,可以考虑使用订阅数据库日志的架构,如使用canal订阅mysql的binlog实现缓存同步。

对于长尾访问的数据、大多数数据访问频率都很高的场景、缓存空间足够都可以考虑不过期缓存,比如用户、分类、商品、价格、订单等,当缓存满了可以考虑LRU机制驱逐老的缓存数据。

 

1. 过期缓存机制

即采用懒加载,一般用于缓存别的系统的数据(无法订阅变更消息、或者成本很高)、缓存空间有限、低频热点缓存等场景;常见步骤是:首先读取缓存如果不命中则查询数据,然后异步写入缓存并过期缓存,设置过期时间,下次读取将命中缓存。热点数据经常使用即在应用系统上缓存比较短的时间。这种缓存可能存在一段时间的数据不一致情况,需要根据场景来决定如何设置过期时间。如库存数据可以在前端应用上缓存几秒钟,短时间的不一致时可以忍受的。

2.   维度化缓存与增量缓存

对于电商系统,一个商品可能拆成如基础属性、图片列表、上下架、规格参数、商品介绍等;如果商品变更了要把这些数据都更新一遍那么整个更新成本很高:接口调用量和带宽;因此最好将数据进行维度化并增量更新(只更新变的部分)。尤其如上下架这种只是一个状态变更,但是每天频繁调用的,维度化后能减少服务很大的压力。

图3 维度化缓存方案

按照不同维度接收MQ进行更新。

3.   大Value 缓存

要警惕缓存中的大Value,尤其是使用Redis时。遇到这种情况时可以考虑使用多线程实现的缓存,如Memcached,来缓存大Value;或者对Value进行压缩;或者将Value拆分为多个小Value,客户端再进行查询、聚合。

4.   热点缓存

对于那些访问非常频繁的热点缓存,如果每次都去远程缓存系统中获取,可能会因为访问量太大导致远程缓存系统请求过多、负载过高或者带宽过高等问题,最终可能导致缓存响应慢,使客户端请求超时。一种解决方案是通过挂更多的从缓存,客户端通过负载均衡机制读取从缓存系统数据。不过也可以在客户端所在的应用/ 代理层本地存储一份,从而避免访问远程缓存,即使像库存这种数据,在有些应用系统中也可以进行几秒钟的本地缓存,从而降低远程系统的压力。

原文地址:https://www.cnblogs.com/flying607/p/8257035.html

时间: 2024-10-01 08:52:52

亿级请求下多级缓存那些事的相关文章

亿级用户下的新浪微博平台架构读后感

阅读文章:亿级用户下的新浪微博平台架构 文章网址:https://mp.weixin.qq.com/s?__biz=MzA3NzgzMzUxMw==&mid=203412989&idx=4&sn=2df0c60f56ae1e228ff269420803c3ef&scene=21#wechat_redirect 微博平台第一代架构为LAMP架构,数据库使用的是MyIsam,后台用的是php,缓存为Memcache. 随着应用规模的增长,衍生出的第二代架构对业务功能进行了模块化

千亿级数量下日志分析系统的技术架构选型

?? 随着数据已经逐步成为一个公司宝贵的财富,大数据团队在公司往往会承担更加重要的角色.大数据团队往往要承担数据平台维护.数据产品开发.从数据产品中挖掘业务价值等重要的职责.所以对于很多大数据工程师,如何根据业务需求去选择合适的大数据组件,做合适的大数据架构工作就是日常工作中最常遇到的问题.在这里根据七牛云在日增千亿级的日志分析工作,和大家分享一下大数据技术架构选型的一些经验.? 大数据架构师在关注什么 ?在一个大数据团队中,大数据架构师主要关注的核心问题就是技术架构选型问题.架构选型问题一般会

亿级用户下的新浪微博平台架构

序言 新浪微博在2014年3月公布的月活跃用户(MAU)已经达到1.43亿,2014年新年第一分钟发送的微博达808298条,如此巨大的用户规模和业务量,需要高可用(HA).高并发访问.低延时的强大后台系统支撑. 微博平台第一代架构为LAMP架构,数据库使用的MyIsam,后台用的php,缓存为Memcache. 随着应用规模的增长,衍生出的第二代架构对业务功能模块化.服务化.组件化,后台系统从php替换为Java,逐渐形成面向服务的SOA架构,在很长一段时间支撑微博平台业务发展. 在此基础上又

《亿级流量电商详情页系统实战:缓存架构+高可用服务架构+微服务架构》

视频教程:http://www.roncoo.com/course/view/af7d501667fe4a19a60e9467e6d2b3d9 升级说明: 该课程原本是123节课时,已于2017年7月份全部更新完毕.在原有123节课时的基础上,再免费新增70到80节左右的内容(注:课程大纲可能会做进一步优化,具体以最终更新为准),课程名将变更为<亿级流量电商详情页系统实战(第二版):缓存架构+高可用服务架构+微服务架构>简称第二版.本次免费新增内容将会从9月中旬开始更新,一直到10月底更新完毕

亿级流量电商详情页系统的大型高并发与高可用缓存架构实战

对于高并发的场景来说,比如电商类,o2o,门户,等等互联网类的项目,缓存技术是Java项目中最常见的一种应用技术.然而,行业里很多朋友对缓存技术的了解与掌握,仅仅停留在掌握redis/memcached等缓存技术的基础使用,最多了解一些集群相关的知识,大部分人都可以对缓存技术掌握到这个程度.然而,仅仅对缓存相关的技术掌握到这种程度,无论是对于开发复杂的高并发系统,或者是在往Java高级工程师.Java资深工程师.Java架构师这些高阶的职位发展的过程中,都是完全不够用的.技术成长出现瓶颈,在自己

关于亿级流量网站架构一书缓存机制的探讨

在京东的亿级流量网站架构一书,175页介绍缓存有这样一段话 仅就这段代码来看,在高并发情况下,实际上并不能阻止大量线程调用loadSync函数 当然这个书里的代码是作者的简写,这里探讨只是针对书中这段代码,实际生成代码应该有考虑这个问题,另外loadSync函数的逻辑看不到,也可能有考虑到到这个问题. 这中情况应该使用双锁,另外firstCreateNewEntry也应该是定义为volatile类型.还有如果是分布式缓存,针对远程客户端的回源请求应该要设置一个时限,比如30秒内只受理一个回源请求

百亿级日访问量的应用如何做缓存架构设计?

微博日活跃用户 1.6 亿+,每日访问量达百亿级,面对庞大用户群的海量访问,良好的架构且不断改进的缓存体系具有非常重要的支撑作用. 本文由新浪微博技术专家陈波老师,分为如下四个部分跟大家详细讲解那些庞大的数据都是如何呈现的: 微博在运行过程中的数据挑战 Feed 平台系统架构 Cache 架构及演进 总结与展望 微博在运行过程中的数据挑战 Feed 平台系统架构 Feed 平台系统架构总共分为五层: 最上面是端层,比如 Web 端.客户端.大家用的 iOS 或安卓的一些客户端,还有一些开放平台.

日访问量百亿级的应用如何做缓存架构设计

微博日活跃用户1.6亿+,每日访问量达百亿级,面对庞大用户群的海量访问,良好架构且不断改进的缓存体系具有非常重要的支撑作用. 4月21日,中生代技术走进盒子科技的现场技术交流活动上,新浪微博技术专家陈波为大家讲解了微博Cache架构的设计实践过程. 刷微博吗?跟我们一起听听那些庞大的数据是如何呈现的吧! 数据挑战 Feed平台系统架构 总共分为五层,最上层是端层,比如web端,客户端,大家用的ios或安卓的一些客户端,还有一些开放平台,第三方接入的一些接口.下面是平台接入层,不同的池子,主要是为

下一波千亿级富豪将要的这些产业,你入对行了吗

在中国A股市场上,大约只有23家市值千亿级别的大公司,这些大多数是在政府垄断行业如金融,石油,电力,汽车等行业,国有四大银行总市值约3.9万亿人民币.而在互联网行业,中国互联网产业目前有三大巨头,百度(830亿美元),阿里巴巴(2400亿美元),腾讯(1500亿美元),这些都是千亿级的. 中国企业需要千亿级公司去引领,去推动新兴产业的发展.联想,海尔,华为他们都感受到阵阵寒意,“中国制造”优势即将挥霍殆尽,人口福利终将消失,而是外部世界级公司已经摩拳擦掌,咄咄逼人,他们已经开始全面进攻中国的大市