Java开发指南!java⽣成word⽂档修改样式
前⾔
难道程序员的职业⽣命线是青春饭?答案是的。
35岁考虑转⾏,然后35岁⼜成了⼀个新⼈,⽽外国可以做到60岁,啥也不说了,可能是觉得中年⼤叔油腻,不及⼩鲜⾁便宜,唉,可叹市场更新换代太快,快到我们来不及改变,所以,只有让随时保鲜才最重要。
主要内容
本⽂是从⼤型互联⽹系统的应⽤⾓度探讨分布式缓存的。本⽂站在原理、框架、架构、案例等多个视⾓对分布式缓存进⾏了探讨。
互联⽹系统随着容量需求的陡增,许多看似简单的存储类场景都⾯临着巨⼤的容量问题和稳定性风险,⽽其中⼤部分问题都可以通过对缓存的合理使⽤来规避。读者从本⽂中将会获得应对这些问题的思路,也会对分布式缓存有⼀个体系化的认识。
本⽂内容共分为三个部分,16章的内容,全⽂按照从理论到实现,再到实践的思路撰写。
⾸先介绍分布式缓存的背景知识,对“分布式”和“缓存”这两个关键词进⾏了全⾯阐述,从⽽为后续章节的叙述打下基础;
接着介绍业界主流的缓存,关注其原理与实现,囊括了Ehcache、Memcached、Redis、 Tair、 EVCache、Aerospike等六个缓存或类缓存系统;
最后讨论缓存在互联⽹系统中的实践,从⼴告、社交、新闻、电商、营销等五类典型的互联⽹应⽤⼊⼿,分析它们⾯临的性能稳定性问题以及如何利⽤分布式缓存解决这些问题。
第1章,缓存为王
在商业的世界中,常说的⼀句话是“现⾦为王”。在互联⽹、移动互联⽹乃⾄整个软件技术世界中,与之相近的⼀个说法就是“缓存为王”。什么是缓存呢?
第2章,分布式系统理论
分布式理论体系宏⼤精深,可以通过⼀⼤厚本专著来专门阐述,本⽂难以尽述之,本章拟从分布式系统概论、分布式系统概念、分布式系统理论,⽐如Paxos、分布式系统设计策略、⼼跳检测、分布式系统设计实践、全局ID⽣成等⼏个⽅⾯略勾画之。本章可作为后续章节阅读的基础,⽐如Master-Slav
e节点切换需要⼼跳检测、Redis 多节点选主也有相应的理论体系( Paxos或者Raft协议等)⽀撑,⼀致性哈希、路由表甚⾄负载均衡也是常见的分布式服务调⽤策略。
第3章,动⼿写缓存
⽬前市⾯上已经有很多开源的缓存框架,⽐如Redis、Memcached、 Ehcache 等,那为什么还要⾃⼰动⼿写缓存?本章将带领⼤家从0到1写⼀个简单的缓存框架,⽬的是让⼤家对缓存的类型、缓存的标准、缓存的实现及原理有⼀个系统的了解,做到知其然,知其所以然。
第4章,Ehcache与Guava Cache
Ehcache是⼀个⽤Java实现的使⽤简单、⾼速、线程安全的缓存管理类库,其提供了⽤内存、磁盘⽂件存储,以及分布式存储等多种灵活的管理⽅案。同时Ehcache作为开放源代码项⽬,采⽤限制⽐较宽松的ApacheLicenseV2.0作为授权⽅式,被⼴泛地⽤于Hibernate、Spring、Cocoon 等其他开源系统。Ehcache 从Hibernate 发展⽽来,逐渐涵盖了全部功能,是⽬前发展势头很好的-⼀个项⽬。Ehcache 具有快速、简单、低消耗、依赖性⼩、扩展性强、⽀持对象或序列化缓存、⽀持缓存或元素的失效、提供LRU/LFU/FIFO缓存策略、⽀持内存缓存及磁盘缓存、采⽤分布式缓存机制等特点。
为了⽅便⼤家了解最新版本的Ehcache, 4.2.1 、4.2.2、 4.2.3 节中采⽤最新的Ehcache 3.0的特性进⾏介绍,4.2.4 节采⽤Ehcache 2.10.2版本与Spring 相结合来做案例介绍,包括后⾯的源码分析也将采⽤这个版本。
GuavaCache和Ehcache⼀样也是本地缓存,但在细分领域也有不同的应⽤场景,4.5节中将做详细介绍。
redis是nosql数据库吗第5章,从Memcached开始了解集中式缓存
许多Web应⽤程序都将数据保存到RDB中,但随着数据量的增⼤,RDB的负担加重,数据库响应恶化,性能严重下降。Memcached是⾼性能的分布式内存缓存服务器,⼀般⽤来缓存访问的热点数据,减轻数据库的负担。
第6章,Memcached周边技术
对于Memcached等常⽤的缓存组件,本⾝⼤多是以单机⽅式运⾏的,服务能⼒受到单个主机处理器、内存等资源的限制。在⼤型的互联⽹应⽤中,往往需要更⼤的数据访问量以及缓存更多的数据,这些
需求都⼤⼤超出了单机缓存系统所能提供的能⼒范围。
解决⾼流量访问的⽅案有很多,直接的⽅式是提⾼单机缓存的性能和资源利⽤率,例如Twemcache,更多的是将多个缓存实例以集的⽅式提供服务,利⽤资源优势提供更好的性能和更⼤的存储容量,以满⾜应⽤对缓存能⼒的需求。
如果说缓存是以空间换时间的艺术,那么,缓存的集服务就是该艺术在另⼀种维度上的呈现,同时,还提供了⾼可⽤性。在设计缓存的集⽅案时,⼀般考虑以下⼏点:
可扩展性:集可以⽅便通过扩充机器来提供更⾼的缓存能⼒。
⾼可⽤性:集能够对应⽤提供可靠的服务,实现缓存服务的⾼可⽤性。
可维护性:集能够⽅便监控和运维。
本章主要介绍基于Memcached的周边技术,重点对Memcached的定制版Twemcache,对开源的缓存集⽅案Twemproxy,以及Mcrouter等进⾏解析,以便充分地利⽤分布式缓存服务。
第7章,Redis探秘
Redis ( REmote DIctionary Server)是⼀个key-value存储系统,由Salvatore Sanfilippo开发,使⽤ANSIC语⾔编写,遵守BSD协议。
Redis运⾏于独⽴的进程,通过⽹络协议和应⽤交互,将数据保存在内存中,并提供多种⼿段持久化内存数据。Redis具备跨服务器的⽔平拆分、复制的分布式特性。Redis不同于Memcached将value视作⿊盒,Redis 的value本⾝具有结构化的特点,对于value提供了丰富的操作。基于内存存储的特点使得
Redis 与传统的关系型数据库相⽐,拥有极⾼的吞吐量和响应性能。
第8章,分布式Redis
Redis作为数据存储系统,⽆论数据存储在内存中还是持久化到本地,作为单实例节点,在实际应⽤中总会⾯临如下挑战:
数据量伸缩:单实例Redis存储的key-value对的数量受限于单机的内存和磁盘容量。长期运⾏的⽣产
环境中,随着数据不断地加⼊,存储容量会达到瓶颈。虽然Redis提供了key的过期机制,在作为缓存使⽤时通过海汰过期的数据可以达到控制容量的⽬的。但当Redis作为NoSQL数据库时,业务数据长期有效使得淘汰机制不再适⽤。
访问量伸缩:单实例Redis单线程地运⾏,吞吐量受限于单次请求处理的平均时耗。当业务数据集⾯临超过单实例处理能⼒的⾼吞吐量需求时,如何提升处理能⼒成为难点。
单点故障。Redis持久化机制⼀定程度上缓解了宕机/重启带来的业务数据丢失问题,但当单实例所在的物理节点发⽣不可恢复故障时,如何保证业务数据不丢以及如何在故障期间迅速地恢复对应业务数据的可⽤性也成为单点结构的挑战。
上述问题对于数据存储系统⽽⾔是通⽤的,基于分布式的解决⽅案如下:
⽔平拆分:分布式环境下,节点分为不同的分组,每个分组处理业务数据的⼀个⼦集,分组之间的数据⽆交集。数据⽆交集的特性使得⽔平拆分解决了数据量瓶颈,随着分组的增加,单个分组承载的数据⼦集更⼩,即通过增加分组来伸缩数据量。同时⽔平拆分也也解决了访问量瓶颈,业务数据全集的请求被分摊到了不同分组随着分组数的增加,数据全集的总吞吐量也增加,访问量的伸缩性得以实现。
主备复制:同⼀份业务数据存在多个副本,对数据的每次访问根据⼀定规则分发到某⼀个或多个副本上执⾏。通过W+R>N的读写配置可以做到读取数据内容的实时性。随着N的增加,当读写访问量差不多时,业务的吞吐量相⽐单实例会提升到過近2倍。但实际中,读的访问量常常远⾼于写的量,W=N, R=1,吞度量会随着读写⽐例的增加⽽提升。
故障转移:当业务数据所在的节点故障时,这部分业务数据转移到其他节点上进⾏,使得故障节点在恢复期间,对应的业务数据仍然可⽤。显然,为了⽀撑故障转移,业务数据需要保持多个副本,位于不同的节点上。
本章的编写⽬的就是,帮助读者了解如何通过Redis实现上述解决⽅案,本章包含的主要知识如下:
sharding: ⽔平拆分的⽀持。
replication: 作为读写分离和故障转移的基础。
fail-deteet: 和replication配合,⽀撑故障转移。
cluster(all-in-one): 完整的分布式解决⽅案。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论