《深入分布式缓存:从原理到实践》学习笔记(1)

第一章:缓存为王

  • 缓存为王,不同的语境中所代表的缓存意义不同。

  • 缓存的一个主要目的在于提高用户体验,是一种非功能性约束。

  • 大型网站架构
    image.png

  • 页面缓存,不用多次渲染

    • 页面自身对元素进行缓存;

    • 服务端黄金静态页面或动态页面;

  • 浏览器缓存:根据一套与服务器约定的规则进行工作,如在http头设置expires
    image.png

    • Cache-Control/Expires的优先级高于Last-Modified.ETag

  • 网络缓存

    • web代理缓存,Squid

    • 边缘缓存,Varnish、CDN

  • 服务端缓存

    • msql缓存(Query Cache):
      image.png

    • 平台级缓存:java(Ehcache,Cacheonix,Voldemort,JBoss Cache,OSCache)

    • 应用级缓存:Redis、MongoDb、Memcachaed

      • redis:去中心化,通过Gossip协议交换状态;客户端与节点直连

  • 多级缓存架构:Nginx本地缓存解决热点数据缓存问题;Redis分布式缓存减少访问回源率;Tomcat缓存防止缓存失效/崩溃之后的冲击;数据库换成提高查询效率
    image.png

第二章分布式系统理论

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

  • 简单设计的缓存框架结构

    image.png

  • 工程结构和类图

    image.pngimage.png

  • SPI机制:META_INF/services下的文件javax.cache.spi.CachingProvider

    • Service Provider Interface,是JDK内置的一种服务提供发现机制。用于为某个接口寻找服务实现的机制,有点类似IOC

    • SPI的使用约定:使用loads的迭代器会遍历所有实现类

      image.png

第四章 Ehcache与Guava Cache

  • Ehcache

    • 快速简单,是目前最快的java换成之一,不需要复杂配置,API易于使用与部署

    • 多种缓存策略,LRU、LFU、FIFO

    • 缓存数据有两级,内存+磁盘,所以无需当心容量问题

    • 缓存数据会在虚拟机重启过程中写入磁盘,Ehcache是地一个引入缓存数据持久化存储的开源java缓存框架

    • 可通过RMI、可插入API等方式做分布式缓存

    • 具有缓存和缓存管理器的监听接口

4.2 Ehcache使用介绍

  • APP - > CacheManager -> Cache -> Element

  • 架构:

    image.png

    • Cache Replication:用于处理缓存同步

    • InProcess APIS:对外开放常用的API

    • Network:通讯协议,即网络调用接口的方式

    • Ehcache Core:缓存核心功能的实现

  • 配置项:

    image.png

  • SDK使用

    image.png

  • Spring+Ehcache

    • EhCacheManagerFactoryBean用于加载Ehcache配置文件;注解功能通过<cache:annotation-drive.......>开启

      image.png

    • @Cacheable @CachePut @CacheEvict @CacheConfig

4.3 Ehcache集群介绍

  • 集群方式:RMI、JMS、Ehcache Server;

4.4 Ehcache(本地缓存)的适用场景

  • 场景要求:

    • 较少更新数据表,因为Ehcache作为Hibernate缓存时,更新表操作会情况所有与该表相关的缓存。

    • 并发以及一致性要求不严格,多台服务器缓存不能实时同步;高一致要求建议使用Redis、Memcached等集中式缓存。

  • 本地缓存+分布式缓存(集中式换成 redis)

    image.png

    • 将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

6.2 Twemproxy(不关注)

6.3 Mcrouter 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值