第五周学习心得
缓存
缓存是介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取时候,用于加快读取的速度。
缓存Cache和缓冲Buffer的区别:缓冲是用于平衡两个设备多谢不一致(如内存和硬盘),而缓存是用于多次多取
缓存的基本数据结构
通常采用Hash表,计算HashCode跟Hash表大小区余获取存储索引
缓存命中率
依赖于能多少次重用同一个缓存响应业务请求;
影响缓存命中率的因素包括:缓存键集合大小、缓存可使用内存空间、缓存对象生存时间。
键集合空间是你能生成的键数量大小,越大,重用机会越小,命中率越低
内存直接决定缓存对象的平均大小和数量
生存时间TTL越长,命中率越高
缓存分类
通读缓存
包括代理缓存(一般指本地)、反向代理缓存(一般在目标服务)、CDN缓存(一般在网络供应商)
通读缓存给客户端返回缓存资源,并在请求未命中缓存时,代理连接获取实际数据
客户端连接的是通读缓存而不是生成响应的原始服务器
旁路缓存
应用代码通常询问对象缓存(旁路缓存)对象是否存在,如果不存在或过期,连接主数据源来组装对象,并将其保存会对象缓存中以便将来使用
对象缓存是旁路缓存
对象缓存包括本地对象缓存、浏览器对象缓存、远程分布式对象缓存(Mamcached是例子)
分布式缓存的一致性hash算法
一致性Hash是用来解决分布式缓存中扩容时数据存储不一致的问题。
一般建立2^32大小的首尾连接的Hash环,然后把K个服务器的建立虚拟节点放到环上。查找是,把目标数据的hash值顺时针找最近的服务器虚拟节点。
技术栈各个层次的缓存
客户端缓存(HTTP和对象缓存)-> HTTP反向代理/CDN->Web服务器本地缓存/分布式缓存->HTTP反向代理->WEB服务器(本地缓存,分布式缓存)->主数据存储
合理使用缓存
频繁修改数据 数据的读写比2:1时,缓存才有意义
遵循二八原则,20%的数据占有80%访问,如果大部分数据访问不是集中在小部分数据上,缓存没有意义
数据不一致于脏读:一般会对缓存数据设置失效时间,超过失效时间,就重新加载。数据更新通知缓存失效时,删除缓存数据。
缓存雪崩:当缓存服务器崩溃时,大量请求到数据库服务器,不能承受宕机。重启缓存服务器和数据库服务器解决
缓存预热:热点数据启动时先加载缓存
缓存击穿 恶意持续高并发的请求某个不存在数据,因为缓存不存在该数据,都落在数据库上,给数据库造成压力,甚至崩溃。简单的对策将不存在的数据缓存起来(set null),并设较短的失效时间
消息队列与异步架构
通过消息队列构建异步调用架构
消息队列架构分为:生产者、消息队列、消费者
点对点模型
消息订阅模型
消息队列的好处
提升性能
更好的伸缩性
削峰填谷
失败隔离和自我修复 生产者和消费者互相不受对方失败影响
解耦
事件驱动架构EDA
负载均衡架构
负载均衡种类
HTTP重定向负载均衡
DNS负载均衡
反向代理负载均衡
IP负载均衡
数据链路负载均衡
负载均衡算法
轮询
加权轮询
随机
最小连接
源地址散列(会导致会话粘滞,相同的来源落到相同机器,如果摸个机器出问题,落地该机器的请求就不能用了)
应用服务器Session管理
应用服务器高可用基于无状态。但实际业务总是有状态的,需要Session信息,分布式负载均衡session管理包括以下:
Session 复制(导致每个服务器都保存全量Session,达不到分布式的目的)
Session 绑定(类似于源地址散列,导致不高可用)
利用Cookie记录Session (交互报文的数据量增多,有些客户端禁用Cookie)
Session服务器(Redis等)
分布式数据库
主从复制
解决分布式读的问题,读写分离
分摊负载
专机专用
便于冷备
高可用
主主复制
解决写的问题,防止主服务器宕机不能写
同一时间只能够有一个写,不然又问题
评论