描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111585190
编辑推荐
内容简介
书内容在逻辑上共分为三个部分,按照从理论到实现,再到实践的思路撰写。首先介绍分布式缓存的背景知识,对本书“分布式”和“缓存”这两个关键词进行了全面的综述,作为后续章节叙述的基础;第二部分介绍业界主流的缓存,关注其原理与实现,囊括了Ehcache、Memcached、Redis、tair、EVCache、Aerospike等六个缓存或类缓存系统;后一部分讨论缓存在互联网系统中的实践,从广告、社交、新闻、电商、营销等五类典型的互联网应用入手,分析它们面临的性能稳定性问题以及如何利用分布式缓存解决这些问题。
目 录
Contents 目录
赞誉
推荐序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.
赞誉
推荐序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.
前 言
Preface 前 言为了初心的纪念一本历时2年的书即将出版难免有些激动,同时亦有些忐忑。激动在于这是一次有意义的社会实践,诸多作者参与其中。至完稿时,作者与发起计划时已有些不同。一些朋友因为各种原因退出了,所以从坚持的角度看,完成就意味着第一层面的成功。忐忑在于从初心出发,通读全稿仍有不足之处,诸位作者在具体实践中所遇到的线上问题远非本书所能尽数容纳。而最后精华的实践章节亦经过公司PR审核,略有删减。再一层,设计和编码很重要,运维管理同等重要。一个好用、易用、稳定的运维工具也是选择一套开源组件的重要参考因素,为了集中注意力,本书基本未覆盖运维部分的内容,且待有心人续之。写一本书,面世之后,作者或喜或忧,因为臧否之权利在于读者。
自觉而言,本书适合有一定研发经验的朋友阅读,它山之石,亦有攻玉之效。本书在逻辑上可分为三大篇章:基础概念篇、开源框架篇、应用案例篇。基础概念除了基础知识,也介绍了一些分布式方面的方法和思路;开源框架篇遴选了近年来流行的框架(比如Redis),同时对淘宝Tair、EVCache也做了一些探索。在Redis大行其道之时,对于Memcached及其周边知识也做了介绍,某些公司还有大量的Memcached实例,比如微博、Twitter等。工具的革新总是源自需求的不断被满足,而根据被满足的特性可以归纳其共性,比如解决单点高可用问题就是一个普适性问题,涉及主从模式、双活模式等,可用性同时又和性能、数据一致性相关。缓存为性能而生,但“缓存”设施的存在就决定了这个设施要符合分布式理论的要求。业界介绍理论和概要,或介绍设计原则的书不少,但拿出具体实践的稀有,比如新浪微博、Twitter这样的社交SNS具体如何设计缓存。简约而不简单!在应用案例篇,笔者邀请了对应领域的专家为大家解读案例,可以让大家触摸到真实的设计意图。重要的是大家可以获得不同场景下不同设计策略的启发。
本书的产生要追溯到多年前。笔者一直对缓存技术抱有热情,关注开源框架的发展,亦在工作中关注所遇、所见,乃至所听的案例。从应用程序研发方面看分布式缓存,并不需要所有的程序员都具备开发一套组件的能力,但是需要具备正确使用它的能力。正如易宝CTO陈斌老师所言:“解决雪崩问题的最好办法是不发生雪崩”。不论是在硅谷互联网公司里还是在国内的互联网平台上,曾多次遇到过海量规模的交易瞬间吞噬平台的悲惨故事。笔者亦了解一些缓存因为代码缺陷或者使用不当被击穿的案例,不同数量级的请求产生的结果有天壤之别,不可不慎。
两年前偶遇机械工业出版社的杨福川老师,攀谈之下就萌发了创作本书的念头。但由于工作繁忙且想呈现心中所想之提纲,故邀请一些不同场景下的专家共同完成。组团过程多有波折,特别感动的是北京的孔庆龙兄。他非常有兴趣参与合作,但时逢小孩即将出生,为此,孔兄开了一次家庭会议来讨论此事。虽然孔兄后续未决定参与,但可见其待人之真、之诚,是值得交的朋友。两年间发生了不少事情,刘暻宇(leo)、何涛、曹洪伟和程超都换了工作。在本书项目开始时程超家的小朋友还未出生,现在都快2岁了。大家都很忙,大约1个月碰一下进度,有时候可能一点进展都没有。期间,程超和leo都一度要退出,终坚持了下来。还有些朋友中间退出了,同时有陈波、王晓波等朋友加入。到这时,啥时候出版已不那么心焦了,水到渠成。就是问初心,我们有没有尽自己的努力来呈现一份关于工具书的纪念?特别感谢曹洪伟身体力行,按时按质完成了分配的章节,同时review了不少章节,带动了这个虚拟组织迈上一个新台阶。这是一本书的编写过程,是一次心灵的旅行,是一次基于互联网的跨组织协同,也是关于工作和生活的点缀。感谢妻子晓娜对于我写作的支持,她对于进度的关注甚于我自己。她花了大量的时间辅导两个小朋友的学习,虽然周末有辅导班、家务等各种事项,但我总能申请到一些时间来构思本书。本书也是送给我的两个宝贝的礼物。这个礼物是初心,想到什么有意义的事情要义无反顾去做;同时,这个礼物也代表“坚持”,如同写作文一样,观察、总结,然后不断练习。
同时还要感谢所有的合作者,我们交叉review了所有章节。感谢机械工业出版社的杨福川老师、孙海亮老师。孙老师的审阅非常专业,从读者视角直面问题所在。朱攀兄弟review了部分章节,在写作过程中和高磊兄弟、丁浪兄弟也有交流,一并表示感谢。
囿于篇幅和知识局限,错漏之处难免,后续将通过勘误和调整完善的形式持续优化。为了初心的纪念,一次心灵的旅游!祝大家阅读愉快!
于君泽(右军)
自觉而言,本书适合有一定研发经验的朋友阅读,它山之石,亦有攻玉之效。本书在逻辑上可分为三大篇章:基础概念篇、开源框架篇、应用案例篇。基础概念除了基础知识,也介绍了一些分布式方面的方法和思路;开源框架篇遴选了近年来流行的框架(比如Redis),同时对淘宝Tair、EVCache也做了一些探索。在Redis大行其道之时,对于Memcached及其周边知识也做了介绍,某些公司还有大量的Memcached实例,比如微博、Twitter等。工具的革新总是源自需求的不断被满足,而根据被满足的特性可以归纳其共性,比如解决单点高可用问题就是一个普适性问题,涉及主从模式、双活模式等,可用性同时又和性能、数据一致性相关。缓存为性能而生,但“缓存”设施的存在就决定了这个设施要符合分布式理论的要求。业界介绍理论和概要,或介绍设计原则的书不少,但拿出具体实践的稀有,比如新浪微博、Twitter这样的社交SNS具体如何设计缓存。简约而不简单!在应用案例篇,笔者邀请了对应领域的专家为大家解读案例,可以让大家触摸到真实的设计意图。重要的是大家可以获得不同场景下不同设计策略的启发。
本书的产生要追溯到多年前。笔者一直对缓存技术抱有热情,关注开源框架的发展,亦在工作中关注所遇、所见,乃至所听的案例。从应用程序研发方面看分布式缓存,并不需要所有的程序员都具备开发一套组件的能力,但是需要具备正确使用它的能力。正如易宝CTO陈斌老师所言:“解决雪崩问题的最好办法是不发生雪崩”。不论是在硅谷互联网公司里还是在国内的互联网平台上,曾多次遇到过海量规模的交易瞬间吞噬平台的悲惨故事。笔者亦了解一些缓存因为代码缺陷或者使用不当被击穿的案例,不同数量级的请求产生的结果有天壤之别,不可不慎。
两年前偶遇机械工业出版社的杨福川老师,攀谈之下就萌发了创作本书的念头。但由于工作繁忙且想呈现心中所想之提纲,故邀请一些不同场景下的专家共同完成。组团过程多有波折,特别感动的是北京的孔庆龙兄。他非常有兴趣参与合作,但时逢小孩即将出生,为此,孔兄开了一次家庭会议来讨论此事。虽然孔兄后续未决定参与,但可见其待人之真、之诚,是值得交的朋友。两年间发生了不少事情,刘暻宇(leo)、何涛、曹洪伟和程超都换了工作。在本书项目开始时程超家的小朋友还未出生,现在都快2岁了。大家都很忙,大约1个月碰一下进度,有时候可能一点进展都没有。期间,程超和leo都一度要退出,终坚持了下来。还有些朋友中间退出了,同时有陈波、王晓波等朋友加入。到这时,啥时候出版已不那么心焦了,水到渠成。就是问初心,我们有没有尽自己的努力来呈现一份关于工具书的纪念?特别感谢曹洪伟身体力行,按时按质完成了分配的章节,同时review了不少章节,带动了这个虚拟组织迈上一个新台阶。这是一本书的编写过程,是一次心灵的旅行,是一次基于互联网的跨组织协同,也是关于工作和生活的点缀。感谢妻子晓娜对于我写作的支持,她对于进度的关注甚于我自己。她花了大量的时间辅导两个小朋友的学习,虽然周末有辅导班、家务等各种事项,但我总能申请到一些时间来构思本书。本书也是送给我的两个宝贝的礼物。这个礼物是初心,想到什么有意义的事情要义无反顾去做;同时,这个礼物也代表“坚持”,如同写作文一样,观察、总结,然后不断练习。
同时还要感谢所有的合作者,我们交叉review了所有章节。感谢机械工业出版社的杨福川老师、孙海亮老师。孙老师的审阅非常专业,从读者视角直面问题所在。朱攀兄弟review了部分章节,在写作过程中和高磊兄弟、丁浪兄弟也有交流,一并表示感谢。
囿于篇幅和知识局限,错漏之处难免,后续将通过勘误和调整完善的形式持续优化。为了初心的纪念,一次心灵的旅游!祝大家阅读愉快!
于君泽(右军)
评论
还没有评论。