缓存
缓存有多个级别的缓存,从 cpu缓存 到 内存 到 redis远程缓存,都可以认为是缓存
缓存 和 缓冲的区别
缓存 cache
缓冲 buffer
区别在于 缓存 用户多次的读取
而 缓冲 用于写和读
缓存数据存储
一般使用 Hash 表的方式
缓存的关键指标
缓存命中率
影响缓存命中率的主要原因
- 缓存键集合大小
- 缓存可使用内存空间
- 缓存对象生存时间
缓存种类
客户端侧的代理缓存
反向代理缓存
比如 nginx 等
多层反向代理缓存
CDN
动静分离的访问,动态资源 和 静态资源访问的域名是分开的
动静资源合在一起的
实际用的是动静分离的方式
通读缓存
旁路缓存
浏览器对象缓存
// webstorage 缓存
var preferences = {/* data object to be stored */};
localStorage.setItem('preferences', JSON.stringify(preferences));
var cachedData = localStorage.getItem('preferences');
var preferences = JSON.parse(cachedData);
本地对象缓存
放在应用程序中的缓存
比如服务器的应用程序中,或者客户端的应用程序中
这种集群方式已经不适用了,同步内容太多
远程分布式对象缓存
比如 memchaced redis
一致性 hash
image.png基于虚拟节点的一致性 hash
image.png
合理的使用缓存
-
频繁修改的数据,不适合缓存
-
没有热点的访问数据,不适合缓存
-
数据不一致 与 脏读,是潜在的存在的问题,是否允许
-
缓存雪崩问题,当大量缓存同时失效时,比如,大量缓存过期时间到了,比如缓存服务挂了,都会导致大量的请求到达数据库,有可能会导致 数据库故障,甚至重启数据库也解决不了,因为大量请求一直存在,数据库频繁挂掉。
此时,可以使用 nginx 设置 百分之多少的请求过来,慢慢的放开请求 -
缓存预热,预先加载数据到缓存系统中
-
缓存穿透,恶意的请求缓存中不存在的数据,导致请求到达数据库
解决方式是,对这个不存在的请求数据设置一个较短的失效时间
消息队列与异步调用架构
有两种模式
点对点
发布订阅
消息队列的好处
- 实现异步处理,提升处理性能
- 更好的伸缩性,比如 多个消费者消费队列,可多可少
- 削峰填谷,按照一定速度消费,可以把起伏过大的请求数量,填平
- 失败隔离 和 自我修复
生产者失败 和 消费者失败 隔离开来,
意味着任意时刻,都可以重启 消费者系统,或者添加删除服务器 - 解耦
负载均衡架构
HTTP重定向负载均衡 实际中不使用
重定向负载均衡服务器,返回 302 重定向一个 ip上
DNS 负载均衡 现实中一定要使用
反向代理负载均衡 现实中使用受限
比如 nginx
一般只能用在 代理的后端服务器数量 不超过 10 台,具体的还需要根据情况来看
因为 nginx 等只在 http 代理,所以所有的流量等都需要通过 nginx , nginx 的性能网卡等是个瓶颈
所以,应用受限,但通常一般的应用,也够用了
但对于大型的互联网产品,肯定不行了
IP 负载均衡 现实中经常应用
IP 负载均衡,在 ip 层实现负载均衡,可以和 nginx 一起使用
但, 同样还有个问题,流量问题,如果还是都通过同一个服务转发,还是有瓶颈,
所以,需要更好的性能,使用下面的方式
数据链路层负载均衡 经常使用
回复,不再通过代理返回,而是直接返回给客户端
应用服务器集群的 Session 管理
包含以下手段
session 复制 现实中不使用
有新session,复制给其他所有服务器
session 绑定 现实中不使用
让用户只请求在同一台机器上
利用 cookie 记录session 现实中经常使用
Session 服务器 现实中经常使用
使用专门的服务器存储 session,比如 redis
分布式数据库
Mysql主从复制 现实中经常使用
从服务器 获取主服务器的 binlog 来同步
注意,对于 建表等 DDL语句,不要同步,否则,从服务器会非常耗时,最好手动的操作从数据库
Mysql 一主多从复制 现实中经常使用
同样 DDL 语句最好不要 同步过去
一主多从复制的优点 :
- 分摊负载
- 专机专用,读写分离,并且不同功能的服务器可以只读取对应的从服务
- 便于热备
- 高可用
Mysql 主主复制 现实中经常使用
注意事项
:
- 主主复制的两个数据库不能并发写入
也就是说,虽然有两个主服务器,但是只能向其中的一个主服务器写,不能同时写两个,会造成数据的混乱
比如,操作了A主,B主还没同步过来,又操作了B主刚刚提交的数据 - 主主复制,只是增加了数据的读并发处理能力,没有增加写并发能力和存储能力
- 更新表结构,会造成据他巨大的同步延迟
所以,表结构的操作,要,一台一台的从服务器操作
网友评论