做者 陈彩华
文章转载交流请联系 caison@aliyun.com
复制代码
本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景。css
缓存主要分为如下四类 html
CDN(Content Delivery Network 内容分发网络)的基本原理是普遍采用各类缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工做正常的缓存服务器上,由缓存服务器直接响应用户请求git
主要缓存静态资源,例如图片,视频github
反向代理位于应用服务器机房,处理全部对WEB服务器的请求。 若是用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。若是没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。经过下降向WEB服务器的请求数,从而下降了WEB服务器的负载。redis
通常只缓存体积较小静态文件资源,如css、js、图片数据库
指的是在应用中的缓存组件,其最大的优势是应用和cache是在同一个进程内部,请求缓存很是快速,没有过多的网络开销等,在单应用不须要集群支持或者集群状况下各节点无需互相通知的场景下使用本地缓存较合适; 同时,它的缺点也是应为缓存跟应用程序耦合,多个应用程序没法直接的共享缓存,各应用或集群的各节点都须要维护本身的单独缓存,对内存是一种浪费。编程
缓存字典等经常使用数据缓存
Ehcache是一种基于标准的开源缓存,可提升性能,卸载数据库并简化可伸缩性。 它是使用最普遍的基于Java的缓存,由于它功能强大,通过验证,功能齐全,并与其余流行的库和框架集成。Ehcache能够从进程内缓存扩展到使用TB级缓存的混合进程内/进程外部署bash
懒淘汰机制:每次往缓存放入数据的时候,都会存一个时间,在读取的时候要和设置的时间作TTL比较来判断是否过时服务器
Guava Cache是Google开源的Java重用工具集库Guava里的一款缓存工具
指的是与应用分离的缓存组件或服务,其最大的优势是自身就是一个独立的应用,与本地应用隔离,多个应用可直接的共享缓存。
主要应用场景
主要接入方式
下面介绍分布式缓存常见的2大开源实现Memcached和Redis
Memcached是一个高性能,分布式内存对象缓存系统,经过在内存里维护一个统一的巨大的hash表,它可以用来存储各类格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,而后从内存中读取,从而大大提升读取速度。
LRU(最近最少使用)到期失效策略,在Memcached内存储数据项时,能够指定它在缓存的失效时间,默认为永久。当Memcached服务器用完分配的内时,失效的数据被首先替换,而后也是最近未使用的数据。
懒淘汰机制:每次往缓存放入数据的时候,都会存一个时间,在读取 的时候要和设置的时间作TTL比较来判断是否过时
服务端并无 “ 分布式 ” 功能。每一个服务器都是彻底独立和隔离的服务。 Memcached的分布式,是由客户端程序实现的
Redis是一个远程内存数据库(非关系型数据库),性能强劲,具备复制特性以及解决问题而生的独一无二的数据模型。它能够存储键值对与5种不一样类型的值之间的映射,能够将存储在内存的键值对数据持久化到硬盘,可使用复制特性来扩展读性能, Redis还可使用客户端分片来扩展写性能。内置了 复制(replication),LUA脚本(Lua scripting),LRU驱动事件(LRU eviction),事务(transactions) 和不一样级别的 磁盘持久化(persistence), 并经过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
图片来自CSDN博主——上帝禁区,若是有哪位神仙知道是用什么画图软件画的欢迎评论,我也很想知道。
启动的部分过程图解
server端持久化的部分操做图解
底层哈希表实现(渐进式Rehash)
初始化字典
新增字典元素图解
Rehash执行流程
Redis | Memcached | |
---|---|---|
支持的数据结构 | 哈希、列表、集合、有序集合 | 纯kev-value |
持久化支持 | 有 | 无 |
高可用支持 | redis自然支持集群功能,能够实现主动复制,读写分离。官方也提供了sentinel集群管理工具,可以实现主从服务监控,故障自动转移,这一切,对于客户端都是透明的,无需程序改动,也无需人工介入 | 须要二次开发 |
存储value容量 | 最大512M | 最大1M |
内存分配 | 临时申请空间,可能致使碎片 | 预分配内存池的方式管理内存,可以省去内存分配时间 |
虚拟内存使用 | 有本身的VM机制,理论上可以存储比物理内存更多的数据,当数据超量时,会引起swap,把冷数据刷到磁盘上 | 全部的数据存储在物理内存里 |
网络模型 | 非阻塞IO复用模型,提供一些非KV存储以外的排序,聚合功能,在执行这些功能时,复杂的CPU计算,会阻塞整个IO调度 | 非阻塞IO复用模型 |
水平扩展的支持 | 暂无 | 暂无 |
多线程 | Redis支持单线程 | Memcached支持多线程,CPU利用方面Memcache优于Redis |
过时策略 | 有专门线程,清除缓存数据 | 懒淘汰机制:每次往缓存放入数据的时候,都会存一个时间,在读取的时候要和设置的时间作TTL比较来判断是否过时 |
单机QPS | 约10W | 约60W |
源代码可读性 | 代码清爽简洁 | 能是考虑了太多的扩展性,多系统的兼容性,代码不清爽 |
适用场景 | 复杂数据结构、有持久化、高可用需求、value存储内容较大 | 纯KV,数据量很是大,并发量很是大的业务 |
下一篇 《理解分布式系统中的缓存架构(下)》将介绍缓存架构设计常见问题以及解决方案,业界案例。