什么是缓存
缓存是存储在计算机的一个原始数据的复制集。为了便于访问
为什么缓存为王
缓存无处不在
按照位置来分:客户端缓存,服务端缓存,网络中的缓存
按照部署方式来分:单机缓存,集群缓存。分布式缓存
为什么使用缓存
提高用户体验。一个成功的软件用户体验是关键
从网站架构看缓存
从位置层面来看缓存
客户端缓存
页面缓存
页面缓存是将之前的渲染的页面保存为文件。用户再次访问时就可以避免网络连接。提高性能
html5支持离线缓存和本地缓存
浏览器缓存
浏览器会检查以确保副本是最新的。通过一次会话浏览器就会在硬盘上开辟一个空间来存缓存
app缓存
不搞这块。跳过
网络中的缓存
web代理缓存
常见的有正向代理,反向代理。透明代理
正向代理
客户端向代理服务器发送一个请求并指定目标服务器。代理服务器向源服务器转交请求并返回给客户端
作用:
- 访问本无法访问的服务器B。如vpn
- 加速访问服务器B
- Cache作用
- 隐藏访问者的行踪。代理服务器Z就是肉鸡
反向代理
客户端直接给代理服务器发送一个请求。代理服务器会判断向何处转发。并且返回给客户端
作用:
- 隐藏原服务器。防火墙只允许代理服务器Z访问
- 负载均衡。不同的代理应答不同的客户
- 缓存作用
透明缓存
透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。透明代理实践的例子就是时下很多公司使用的行为管理软件
服务端缓存
数据库缓存
拿mysql来说。mysql使用查询缓冲机制。将select语句和结果存在缓冲区。下次遇到相同select就直接从缓冲区拿数据
注:如果是写入操作很频繁的数据库。缓存会成为累赘。因为数据库更新缓存会占用大量性能
平台级缓存
具有缓存特性的框架能够帮助提高性能。比如spring的注解缓存、encache、jbosscache等
应用缓存
主要是用nosql做缓存。需要程序员自己写代码实现缓存机制。比如redis、memcached、mongodb
redis缓存
redis作为缓存应该是世界出名的。redis集群采用无中心点实现。用户根据hash算法算出对应的redis服务器。直接在redis服务器执行命令。redis集群还实现了动态加入节点,动态迁移节点。故障转移。
redis内部通过ping-pong机制彼此互联。客户只需要连接一台服务器就好。不用连接所有服务器。
为了让这个集群更加稳定。需要为每一个节点都准备slave服务器。保证服务挂了后能马上补上
如何判断一个节点是否挂掉。
如果一半以上的服务器连接某节点超时。则认为该服务器挂掉。slave服务器上
如果某个master节点和slave节点都挂了。
那么这个服务器就进入fail状态。少量不会有什么问题。如果有一半的master都挂了。集群就挂了
多级缓存
请求流程。如果中途某个缓存命中直接就返回
nginx缓存-->redis缓存-->tomcat 本地缓存 -->数据库缓存-->数据库
CAP理论
- 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
- 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
- 分区容错性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
CAP不可能同时满足,只能满足其中两个
放弃分区容忍性
也就是允许分区。如关系型数据库,LDAP.
放弃可用性
则要求请求的强一致。如分布式事务,分布式锁
放弃一致性
高可用并且允许分区。如nosql。为了高可用,用本地数据服务。导致不一致
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。