深入分布式缓存 从原理到实践

🌙
手机阅读
本文目录结构

深入分布式缓存

编辑推荐

来自蚂蚁金服、京东、网联、新浪微博、同程旅游等公司的 10 余位一线架构师用心之作;

阿里研究员蒋江伟、易宝支付 CTO 陈斌、普元信息 CTO 焦烈焱、特赞科技 CTO 黄勇、 微博研发副总经理杨卫华等专家联袂推荐

深度解构 Ehcache、Memcached、Redis、tair、EVCache、Aerospike 等 6 大缓存系统的技术原理,及其在电商、社交、广告等典型场景中的应用

内容简介

这是国内首本从大型互联网系统的应用角度探讨分布式缓存的书籍,包含了原理、框架、架构、案例等多方面的视角。

互联网系统随着容量需求的陡增,许多看似简单的存储类场景都面临着巨大的容量和稳定性风险,而其中的大部分都可以通过对缓存的合理使用来规避。读者从对本书的阅读当中,将会获得应对这些问题的经验,也会对分布式缓存有一个体系化的认识。

本书内容共分为三个部分,按照从理论到实现,再到实践的思路撰写。

首先介绍分布式缓存的背景知识,对本书“分布式”和“缓存”这两个关键词进行了全面的综述,作为后续章节叙述的基础;

第二部分介绍业界主流的缓存

关注其原理与实现,囊括了 Ehcache、Memcached、Redis、tair、EVCache、Aerospike 等六个缓存或类缓存系统;

最后一部分讨论缓存在互联网系统中的实践,从广告、社交、新闻、电商、营销等五类典型的互联网应用入手,分析它们面临的性能稳定性问题以及如何利用分布式缓存解决这些问题

作者简介

于君泽:蚂蚁金服高级技术专家、花名右军,IT 从业超过十五年。对高并发、分布式架构、内建质量、研发管理有一些心得。维护公众号“技术琐话”。

程超:“爱农驿站”首席支付技术专家。InfoQ、中生代技术社区签约作者,CSDN 博主专家,Spring for all 社区贡献者,擅长微服务和分布式架构。

邱硕:蚂蚁金服技术专家,花名牧丘,在阿里和支付宝从事中间件、应用系统的性能 / 稳定性技术风险相关工作。Cobar 主要作者。

曹洪伟:70 后老码农,全栈工匠一枚,服务过多家世界 500 强,后连续创业,现任渡鸦科技 CTO,致力于人工智能硬件,维护有“wireless_com ”公众号 和博客

刘璟宇:拍拍贷资深架构师,十余年互联网行业从业经验,主要研究云计算、服务化基础框架以及各种基础组件。

张开涛:京东架构师,畅销书《亿级流量网站架构核心技术》作者,维护有“开涛的博客”公众号。

何涛:网联高级架构师,对高流量下的架构设计有丰富的实践经验,热衷于高可用、高并发和高性能的架构研究。

宋慧庆:勤诚互动研发总监兼高级架构师,十年互联网广告行业经验,主要研究高可用架构技术,为流量变现提供更好的服务。

陈波:新浪微博技术专家,负责平台基础架构及优化,经历了微博从起步到成为数亿用户的大型互联网系统的演进过程。

王晓波:同程旅游首席架构师,10 余年互联网行业从业经验,负责中间件、微服务、分布式架构、运维、安全等方面工作。

目录

  • 赞誉

  • 推荐序 1

  • 推荐序 2

  • 推荐序 3

  • 作者寄语

  • 前言

第 1 章 缓存为王 1

  • 1.1 什么是缓存?1

  • 1.2 为什么使用缓存?2

  • 1.2.1 从用户体验说起 3

  • 1.2.2 关于系统的性能 3

  • 1.3 从网站的架构发展看缓存 4

  • 1.4 客户端缓存 5

  • 1.4.1 页面缓存 6

  • 1.4.2 浏览器缓存 7

  • 1.4.3 APP 上的缓存 8

  • 1.5 网络中的缓存 11

  • 1.5.1 Web 代理缓存 11

  • 1.5.2 边缘缓存 12

  • 1.6 服务端缓存 14

  • 1.6.1 数据库缓存 14

  • 1.6.2 平台级缓存 16

  • 1.6.3 应用级缓存 18

第 2 章 分布式系统理论 24

  • 2.1 分布式系统概论 24

  • 2.2 分布式系统概念 26

  • 2.2.1 进程与线程 26

  • 2.2.2 并发 26

  • 2.2.3 锁 26

  • 2.2.4 并行 27

  • 2.2.5 集群 27

  • 2.2.6 状态特性 28

  • 2.2.7 系统重发与幂等性 28

  • 2.2.8 硬件异常 30

  • 2.3 分布式系统理论 31

  • 2.3.1 CAP 理论 32

  • 2.3.2 CAP 理论澄清 34

  • 2.3.3 Paxos35

  • 2.3.4 2PC38

  • 2.3.5 3PC39

  • 2.3.6 Raft40

  • 2.3.7 Lease 机制 41

  • 2.3.8 解决“脑裂”问题 43

  • 2.3.9 Quorum NWR44

  • 2.3.10 MVCC45

  • 2.3.11 Gossip46

  • 2.4 分布式系统设计策略 49

  • 2.4.1 心跳检测 50

  • 2.4.2 高可用设计 50

  • 2.4.3 容错性 52

  • 2.4.4 负载均衡 53

  • 2.5 分布式系统设计实践 54

  • 2.5.1 全局 ID 生成 54

  • 2.5.2 哈希取模 56

  • 2.5.3 一致性哈希 57

  • 2.5.4 路由表 58

  • 2.5.5 数据拆分 58

第 3 章 动手写缓存 60

  • 3.1 缓存定义的规范 60

  • 3.1.1 新规范的主要内容及特性 60

  • 3.1.2 新规范的 API 介绍 61

  • 3.2 缓存框架的实现 62

  • 3.2.1 前期准备 63

  • 3.2.2 缓存的架构介绍 63

  • 3.2.3 设计思路以及知识点详解 64

  • 3.3 缓存框架的使用示例 74

第 4 章  Ehcache 与 Guava Cache76

  • 4.1 Ehcache 的主要特性 76

  • 4.2 Ehcache 使用介绍 77

  • 4.2.1 Ehcache 架构图 77

  • 4.2.2 缓存数据过期策略 78

  • 4.2.3 Ehcache 缓存的基本用法 81

  • 4.2.4 在 Spring 中使用 Ehcache83

  • 4.3 Ehcache 集群介绍 85

  • 4.3.1 集群的方式 86

  • 4.3.2 如何配置集群 88

  • 4.4  Ehcache 的适用场景 89

  • 4.5 Guava Cache 的使用 92

  • 4.5.1 Guava Cache 的适用场景 92

  • 4.5.2 Guava Cache 的创建方式 93

  • 4.5.3 缓存数据删除 95

  • 4.5.4 并发场景下的使用 95

  • 4.6 本章小结 96

第 5 章 从 Memcached 开始了解集中式缓存 97

  • 5.1 Memcached 基本知识 98

  • 5.1.1 Memcached 的操作命令 98

  • 5.1.2 Memcached 使用场景 100

  • 5.1.3 Memcached 特征 100

  • 5.1.4 Memcached 的一些问题 101

  • 5.2 Memcached 内存存储 102

  • 5.2.1 Slab Allocation 机制 102

  • 5.2.2 使用 Growth Factor 进行调优 104

  • 5.2.3 Item105

  • 5.3 典型问题解析 106

  • 5.3.1 过期机制 106

  • 5.3.2 哈希算法 107

  • 5.3.3 热点问题 108

  • 5.3.4 缓存与数据库的更新问题 108

  • 5.3.5 别把缓存当存储 109

  • 5.3.6 命名空间 110

  • 5.3.7 CAS110

  • 5.4 Memcached 客户端分析 110

  • 5.4.1 Memcached 的 Client111

  • 5.4.2 Spymemcached 设计思想解析 111

  • 5.5 Memcached 周边工具发展 117

第 6 章 Memcached 周边技术 119

  • 6.1 Twemcache119

  • 6.1.1 Twemcache 的设计原理 120

  • 6.1.2 Twemcache 的安装及命令行详解 122

  • 6.1.3 基于 Java 的 Twemcache 用法 125

  • 6.2 Twemproxy126

  • 6.2.1 Twemproxy 的常用部署模式 127

  • 6.2.2 Twemproxy 的可扩展性 129

  • 6.2.3 Twemproxy 源代码简析 131

  • 6.3 Mcrouter137

  • 6.3.1 Mcrouter 路由算法 138

  • 6.3.2 典型的使用场景 139

  • 6.3.3 Mcrouter 的可扩展性 142

  • 6.3.4 源码简要解析 144

第 7 章 Redis 探秘 148

  • 7.1 数据结构 148

  • 7.1.1 value 对象的通用结构 149

  • 7.1.2 String149

  • 7.1.3 List152

  • 7.1.4 Map155

  • 7.1.5 Set157

  • 7.1.6 Sorted-Set159

  • 7.2 客户端与服务器的交互 160

  • 7.2.1 客户端 / 服务器协议 161

  • 7.2.2 请求 / 响应模式 163

  • 7.2.3 事务模式 164

  • 7.2.4 脚本模式 168

  • 7.2.5 发布 / 订阅模式 169

  • 7.3 单机处理逻辑 171

  • 7.3.1 多路复用 171

  • 7.3.2 定时任务处理 173

  • 7.4 持久化 174

  • 7.4.1 基于全量模式的持久化 174

  • 7.4.2 基于增量模式的持久化 176

  • 7.4.3 基于增量模式持久化的优化 178

第 8 章 分布式 Redis180

  • 8.1 水平拆分(sharding)181

  • 8.1.1 数据分布 181

  • 8.1.2 请求路由 182

  • 8.2 主备复制(replication)182

  • 8.2.1 主备复制流程 183

  • 8.2.2 断点续传 183

  • 8.3 故障转移(failover)184

  • 8.3.1 sentinel 间的相互感知 185

  • 8.3.2 master 的故障发现 186

  • 8.3.3 failover 决策 186

  • 8.4 Redis Cluster187

  • 8.4.1 拓扑结构 187

  • 8.4.2 配置的一致性 188

  • 8.4.3 sharding190

  • 8.4.4 failover193

  • 8.4.5 可用性和性能 196

第 9 章 Tair 探秘 198

  • 9.1 Tair 总体架构 198

  • 9.2 Config Server 简介 199

  • 9.3 Data Server 简介 201

  • 9.4 Tair 高可用和负载均衡 204

  • 9.4.1 对照表 204

  • 9.4.2 数据迁移 219

  • 9.5 存储引擎 220

  • 9.6 Tair 的 API222

  • 9.6.1 key/value 相关 API223

  • 9.6.2 prefix 相关的 API226

第 10 章 EVCache 探秘 229

  • 10.1 EVCache 项目介绍 230

  • 10.1.1 EVCache 的由来 231

  • 10.1.2 EVCache 的发展 232

  • 10.1.3 EVCache 的演进 234

  • 10.2 EVCache 的使用场景 238

  • 10.2.1 典型用例 238

  • 10.2.2 典型部署 239

  • 10.3 EVCache 的性能 240

  • 10.3.1 EVCache 集群的性能 240

  • 10.3.2 全局化复制时的性能问题 242

  • 10.3.3 Moneta 项目中的组件性能 243

  • 10.4 EVCache 的高可用性 244

  • 10.4.1 AWS 的多可用区 244

  • 10.4.2 EVCache 对 AWS 高可用性的增强 245

  • 10.5 源码与示例 245

  • 10.5.1 源码浅析 245

  • 10.5.2 EVCache 示例 253

第 11 章 Aerospike 原理及广告业务应用 259

  • 11.1 Aerospike 架构 259

  • 11.2 Aerospike 具体实现 261

  • 11.2.1 Aerospike 集群管理 261

  • 11.2.2 数据分布 263

  • 11.3 Aerospike 集群配置和部署 265

  • 11.3.1 搭建集群的方式与配置 266

  • 11.3.2 部署集群 267

  • 11.4 Aerospike 与 Redis 的对比 271

  • 11.5 Aeropsike 在广告行业的具体应用 272

  • 11.5.1 Aerospike 在个性化推荐广告中的应用 273

  • 11.5.2 Aerospike 在实时竞价广告中的应用 274

第 12 章 社交场景架构进化:从数据库到缓存 283

  • 12.1 社交业务示例 283

  • 12.1.1 业务模型 283

  • 12.1.2 业务场景 284

  • 12.1.3 业务特点 285

  • 12.2 关系(relation)的存储 286

  • 12.2.1 基于 DB 的最简方案 286

  • 12.2.2 DB 的 sharding 方案 288

  • 12.2.3 引入缓存 290

  • 12.2.4 缓存的优化方案 292

  • 12.3 帖子(post)的存储 293

  • 12.3.1 基于 DB 的方案 294

  • 12.3.2 引入服务端缓存 296

  • 12.3.3 本地缓存 297

  • 12.4 时间线(timeline)的存储 297

  • 12.4.1 基于 DB 的方案—push 模式 298

  • 12.4.2 基于 DB 的方案—pull 模式 300

  • 12.4.3 增量查询引入服务端缓存 302

第 13 章 缓存在社交网络 Feed 系统中的架构实践 304

  • 13.1 Feed 系统架构 304

  • 13.2 Feed 缓存模型 307

  • 13.3 Feed 缓存架构的设计 309

  • 13.3.1 简单数据类型的缓存设计 310

  • 13.3.2 集合类数据的缓存设计 312

  • 13.3.3 其他类型数据的缓存设计 314

  • 13.4 Feed 缓存的扩展 315

  • 13.4.1 Redis 的扩展 315

  • 13.4.2 计数器的扩展 316

  • 13.4.3 存在性判断的扩展 318

  • 13.5 Feed 缓存的服务化 319

第 14 章 典型电商应用与缓存 324

  • 14.1 电商类应用的挑战及特点 324

  • 14.2 应用数据静态化架构高性能单页 Web 应用 325

  • 14.2.1 整体架构 326

  • 14.2.2 CMS 系统 326

  • 14.2.3 前端展示系统 328

  • 14.2.4 控制系统 328

  • 14.3 应用多级缓存模式支撑海量读服务 329

  • 14.3.1 多级缓存介绍 329

  • 14.3.2 如何缓存数据 331

  • 14.3.3 分布式缓存与应用负载均衡 332

  • 14.3.4 热点数据与更新缓存 334

  • 14.3.5 更新缓存与原子性 336

  • 14.3.6 缓存崩溃与快速修复 336

  • 14.4 构建需求响应式亿级商品详情页 337

  • 14.4.1 商品详情页前端结构 338

  • 14.4.2 单品页技术架构发展 338

  • 14.4.3 详情页架构设计原则 343

  • 14.4.4 遇到的一些问题 349

第 15 章 同程凤凰缓存系统基于 Redis 的设计与实践 357

  • 15.1 同程凤凰缓存系统要解决什么问题 357

  • 15.1.1 Redis 用法的凌乱 358

  • 15.1.2 从实际案例再看 Redis 的使用 360

  • 15.1.3 如何改变 Redis 用不好的误区 362

  • 15.1.4 凤凰缓存系统对 Redis 系统化改造 364

  • 15.2 用好 Redis 先运维好它 366

  • 15.2.1 传统的 Redis 运维方式 366

  • 15.2.2 Redis 的 Docker 化部署 368

  • 15.2.3 凤凰缓存系统对 Redis 的监控 369

  • 15.2.4 凤凰缓存系统对 Redis 的集群分片优化 370

  • 15.2.5 客户端在运维中的作用 371

  • 15.2.6 凤凰缓存系统在 Redis 运维上的工具 372

  • 15.3 凤凰缓存系统的使用效果 373

第 16 章 新的旅程 374

  • 16.1 更好的引入缓存技术 374

  • 16.1.1 缓存引入前的考量 374

  • 16.1.2 缓存组件的选择 375

  • 16.1.3 缓存架构的设计 376

  • 16.1.4 缓存系统的监控及演进 377

  • 16.2 缓存分类总结 377

  • 16.3 缓存知识结构更多 Tips378

  • 16.3.1 缓存使用模式 379

  • 16.3.2 缓存协议 379

  • 16.3.3 缓存连接池 380

  • 16.3.4 几个关注点 383

  • 16.3.5 管理缓存 387

  • 16.3.6 缓存可用性 390

  • 16.3.7 数据一致性 392

  • 16.3.8 热点数据处理 393

  • 16.3.9 注意事项 Tips396

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了