第五周总结

用户头像
Geek_a327d3
关注
发布于: 2020 年 07 月 08 日

缓存

缓存可以解决哪些问题?

缓存的本质就是把数据拷贝一份存放到访问速度更快的存储介质上,提供更快的数据访问速度。主要针对读多写少的场景。

例如:

在一个并发量较高的电商系统中,商品的访问量是非常大的,针对这些访问量较大的数据,我们可以放在缓存中。

商品数据本身存放在MySQL、Oracle的数据中,数据的存储以及读取是在硬盘上。

当大量的请求访问商品数据时,由于硬盘的访问速度满足不了请求的访问速度,这时就需要使用缓存技术来解决这个问题,数据可以缓存在内存中。内存的访问速度要比硬盘快100倍左右,可以提供更快的访问速度。

无处不在的缓存



在CPU中存在的L1,L2,L3级缓存;

在浏览器中可以使用Http参数缓存对应的图片;

使用CDN可以将静态资源缓存到离用户最近的服务器;



缓存的关键指标



缓存的命中率:查询了10次数据,有9次是在缓存中查询到的,那么它的命中率就是90%。



影响缓存的关键指标

缓存键集合大小

定位一个对象的方式通常都是使用缓存键执行精确匹配,从统计数字上看,应用生成的唯一键越多,重用的机会越小。

例如:基于用户IP地址缓存天气数据,则可能有多达40亿个键。如果基于用户来源城市缓存天气数据,则可能仅需要几百个缓存键。一定要想办法减少可能的缓存键数量。键数量越少,缓存的效率就越高。

缓存可使用的内存空间

通常来讲访问越快的存储介质价格也就更昂贵,所以不会很大,当常被访问的数据无法被存进缓存的时候,就会导致无法命中缓存。



缓存对象生存时间

缓存数据通常都需要设置过期时间,在缓存过期时访问数据就会导致无法命中缓存。



各种介质数据访问延迟

本地内存 :100ns

SSD磁盘 :100000ns

磁盘: 10000000ns



缓存为什么能显著提升性能

  1. 缓存数据通常来自内存,比磁盘上的数据有更快的访问速度

  2. 缓存存储数据的最终结果形态,不需要中间计算,减少CPU资源的消耗

  3. 缓存降低数据库、磁盘、网络的负载压力,使这些I/O设备获得更好的响应特性



合理使用缓存

使用缓存对提高系统性能有很多好处,但是不合理的使用缓存可能非但不能提高系统性能,还会成为系统的累赘,甚至风险。

有哪些场景不适合使用缓存?
  1. 频繁修改的数据:数据修改后就会导致缓存失效,还来不及读取就已经失效或者更新,徒增系统负担。一般来说,数据的读写在 2 :1 以上,才有意义。

  2. 没有热点的访问:缓存使用内存作为存储,内存资源宝贵而有限,不能将所有数据都缓存到内存起来,如果应用系统访问数据没有热点,不遵循二八定律,那么缓存就没有意义。

  3. 没有出现数据读取的性能瓶颈:如果系统访问量并不大,就没有必要使用缓存技术,徒增系统复杂度。



缓存问题

缓存不一致与脏读

一般在用户修改数据后,其他用户可能会读到不是最新的数据。一般在互联网应用中,这种延迟通常是可以接受的。



缓存雪崩

缓存是为了提高数据读取性能的,一般使用了缓存就代表着当前的数据库是承受不住用户的访问量的(如果数据库可以承受,就不需要用缓存了)。在缓存服务器崩溃后,所有的请求会直接访问到数据库,数据库很有可能承受不住巨大的压力而宕机,导致系统不可用。



缓存预热

访问量特别大的热点数据,在项目启动之前可以预先加载到缓存中,因为当缓存读取不到的时候,就会访问到数据库,大量的请求直接访问数据库,很有可能导致数据库直接因承受不住巨大的访问量而宕机,导致系统崩溃。



缓存穿透

如果不恰当的业务,或者遭受到恶意的攻击持续高并发请求某个不存在的数据,因为缓存没有就会访问数据库,所有的请求都会落在数据库上会对数据库造成巨大的压力。



消息队列与异步架构



同步调用 VS 异步调用



需求:当用户购买商品并且成功付款后,要根据订单消费的金额计算积分,并加到用户积分余额中。



同步调用: 付款成功 -》 计算积分 -》 存入到用户账户

异步调用: 付款成功 -》 发送付款成功消息

营销模块: 订阅付款消息,计算积分,存入用户积分账户



消息队列



消息队列的好处
  1. 更好的伸缩性,削峰填谷; 例如: 大量的写请求可以直接写入到消息队列中,而不用直接写入到数据库中,数据库的写性能要比消息队列差很多,因此可以撑住大量的写请求。

  2. 解耦 例如:用户积分的例子,订单&付款模块可以完全不感知积分营销模块的存在,只用发一条消息即可。

  3. 失败隔离和自我修复; 例如:因为发布者不直接依赖消费者,所以消息系统可以将消费者系统错误与生产者系统组件隔离,生产者和消费者相互不受对方失败影响



主要MQ产品比较

RabbitMQ的主要特点是性能好,社区活跃,但是RabbitMQ用Erlang开发,对不熟悉Erlang的同学不便于二次开发和维护。

ActiveMQ影响比较广泛,可以跨平台,使用Java开发,对Java友好。

RocketMQ使用Java开发,性能比较好,可靠性也较高。

Kafka,Scala开发,分布式伸缩性会比较好。



负载均衡

四层负载均衡

四层负载均衡服务器只做数据包转发功能。

四层负载均衡优点

  1. 性能好

四层负载均衡缺点

  1. 无法根据数据包内容编程

七层负载均衡

七层负载均衡负责与客户端握手后,再将客户端的数据包转发给后端的WEB服务器(还需要与后端WEB服务器进行握手)。

七层负载均衡优点

  1. 性能相比于四层负载均衡差

  2. 可以根据数据包进行编程,例如,软防火墙等

DNS负载均衡

根据一个域名配置多个IP地址进行负载均衡。



负载均衡算法

轮询

所有请求依次被分发到每个应用服务器上,适用于所有服务器硬件都相同的场景

加权轮询

根据应用服务器硬件性能的情况,在轮询的基础上,按照配置的权重将请求分发到不同的服务器上,按照配置的权重将请求分发到每个服务器

随机

请求被随机分配到每个服务器上

最小连接数

负载均衡服务记录每个服务器的正在处理的连接数,将新的请求分发到最小连接数的服务器上

原地址散列

根据用户请求来源IP地址进行Hash计算,得到响应的服务器,该算法可以保证同一个来源的请求总在一个服务器上处理

分布式数据库



MySQL主从复制



一主多从

一主多从优点:

  1. 分摊负载

  2. 专机专用

  3. 便于冷备

  4. 高可用

一主多从缺点:

  1. 无法解决大量的写入问题

  2. 主节点宕机后无法提供写服务

  3. 无法解决大量数据存储问题



主主多从

主主多从:可以解决主从节点主节点挂掉后无法提供写入服务问题



用户头像

Geek_a327d3

关注

还未添加个人签名 2020.04.14 加入

还未添加个人简介

评论

发布
暂无评论
第五周总结