第一章:缓存为王
-
缓存为王,不同的语境中所代表的缓存意义不同。
-
缓存的一个主要目的在于提高用户体验,是一种非功能性约束。
-
大型网站架构
-
页面缓存,不用多次渲染
-
页面自身对元素进行缓存;
-
服务端黄金静态页面或动态页面;
-
-
浏览器缓存:根据一套与服务器约定的规则进行工作,如在http头设置expires
-
Cache-Control/Expires的优先级高于Last-Modified.ETag
-
-
网络缓存
-
web代理缓存,Squid
-
边缘缓存,Varnish、CDN
-
-
服务端缓存
-
msql缓存(Query Cache):
-
平台级缓存:java(Ehcache,Cacheonix,Voldemort,JBoss Cache,OSCache)
-
应用级缓存:Redis、MongoDb、Memcachaed
-
redis:去中心化,通过Gossip协议交换状态;客户端与节点直连
-
-
-
多级缓存架构:Nginx本地缓存解决热点数据缓存问题;Redis分布式缓存减少访问回源率;Tomcat缓存防止缓存失效/崩溃之后的冲击;数据库换成提高查询效率
第二章分布式系统理论
2.2 分布式系统概念
-
分拆锁和分离锁:如果一个锁守护多个相互独立的状态变量,则可以分拆锁;分拆锁的集合会分离锁;ConcurrentHashMap使用到分离锁
-
分布式系统中的任何节点也都是无状态的
-
缓存雪崩:大量key在统一时间失效
-
解决方案:即使查询空也缓存空结果,并设置较短的过期时间;单线程写缓存
-
2.3 分布式系统理论
-
CAP理论(一致性,可用性,分区容忍性):CAP并不是三选二,大多数情况下C和A可以同时满足,所以实质上是需要一种当P出现时的应对策略
-
ACID(原子性,一致性,隔离性,一致性)
-
BASE(基本可用,软状态,最终一致性)
-
Paxos算法:解决分布式系统一致性问题的通信协议
-
两阶段:Prepare,Accept
-
进一步阅读《从Paxos到ZooKeeper》
-
-
一致性算法还有:2PC、3PC、Raft算法、Lease机制
-
MVCC(基于多版本并发控制),如InnoDB。
-
存储引擎会给每张表增加两个字段:create version和delete version
-
查询操作必须满足:当前版本号>=create version且<delete version,才会被查询到
-
-
Gossip是一种去中心化思路的分布式协议,解决状态在集群中的传播和一致性问题。
2.4 分布式系统设计策略
-
如何检测或者;保障高可用;容错处理;重试机制;负载均衡。
2.5 分布式系统设计实践
-
全局id生成
-
snowFlake:41位时间序列 + 10位机器标识 + 12位计数顺序号
-
id缓存,如换成1000个id
-
-
哈希取模分配
-
一致性哈希:就是将所有的桶连成环,当有新节点加入时,只要将新节点加入位置之前的数据顺时针移动到下一个节点中即可。
-
-
路由表;数据拆分
第三章 动手写缓存
3.1 缓存定义规范:
-
CachingProvider -> CacheManager -> Cache -> Entry
3.2 缓存框架的实现
-
参考Ehcache、Guava
-
简单设计的缓存框架结构
-
工程结构和类图
-
SPI机制:META_INF/services下的文件javax.cache.spi.CachingProvider
-
Service Provider Interface,是JDK内置的一种服务提供发现机制。用于为某个接口寻找服务实现的机制,有点类似IOC
-
SPI的使用约定:使用loads的迭代器会遍历所有实现类
-
第四章 Ehcache与Guava Cache
-
Ehcache
-
快速简单,是目前最快的java换成之一,不需要复杂配置,API易于使用与部署
-
多种缓存策略,LRU、LFU、FIFO
-
缓存数据有两级,内存+磁盘,所以无需当心容量问题
-
缓存数据会在虚拟机重启过程中写入磁盘,Ehcache是地一个引入缓存数据持久化存储的开源java缓存框架
-
可通过RMI、可插入API等方式做分布式缓存
-
具有缓存和缓存管理器的监听接口
-
4.2 Ehcache使用介绍
-
APP - > CacheManager -> Cache -> Element
-
架构:
-
Cache Replication:用于处理缓存同步
-
InProcess APIS:对外开放常用的API
-
Network:通讯协议,即网络调用接口的方式
-
Ehcache Core:缓存核心功能的实现
-
-
配置项:
-
SDK使用
-
Spring+Ehcache
-
EhCacheManagerFactoryBean用于加载Ehcache配置文件;注解功能通过<cache:annotation-drive.......>开启
-
@Cacheable @CachePut @CacheEvict @CacheConfig
-
4.3 Ehcache集群介绍
-
集群方式:RMI、JMS、Ehcache Server;
4.4 Ehcache(本地缓存)的适用场景
-
场景要求:
-
较少更新数据表,因为Ehcache作为Hibernate缓存时,更新表操作会情况所有与该表相关的缓存。
-
并发以及一致性要求不严格,多台服务器缓存不能实时同步;高一致要求建议使用Redis、Memcached等集中式缓存。
-
-
本地缓存+分布式缓存(集中式换成 redis)
-
将Ehcahe作为二级缓存,当Redis宕机可以继续抗住大量请求。
-
采用一定的同步策略,维护本地缓存和分布式缓存的一致性(定时轮询、主动通知)。
-
4.5 Guava Cache的使用
-
更新锁定:当查询一个未被缓存的key时,若并发量很大,则可能都从源中读取数据,该机制保证之让一个请求读源
第五章 从Memcached开始了解集中式缓存
5.1 memcached基础知识
-
memcached服务器并没有分布式功能,不能进行通讯,分布式实现在于客户端
5.2 memcached内存存储
-
完整的item包含如下,共32字节
-
key:键
-
nkey:键长
-
flags:用户定义的flag
-
nbytes:值长(包括换行符号)
-
suffix:后缀buffer
-
nsuffix:后缀长
-
5.3 典型问题解析
-
过期机制:
-
Lazy Expiration:只有GET和LRU会删除过期数据,不在监视过期时间上耗费CPU时间
-
LRU
-
-
热点数据
-
CAS:通过版本号进行控制,gets+set
第六章 memcached周边技术
6.1 Twemcache
-
有Twitter研发团队根据Memcached v1.4.4开发的
-
git地址:http://github.com/twitter/twemcache