理解分布式系统中的缓存架构(上)
本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景。
1. 缓存概述
2. 缓存的分类
缓存主要分为以下四类
2.1 CDN缓存
基本介绍
CDN(Content Delivery Network 内容分发网络)的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求
应用场景
主要缓存静态资源,例如图片,视频
应用图
优点
2.2 反向代理缓存
基本介绍
反向代理位于应用服务器机房,处理所有对WEB服务器的请求。 如果用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。通过降低向WEB服务器的请求数,从而降低了WEB服务器的负载。
应用场景
一般只缓存体积较小静态文件资源,如css、js、图片
应用图
开源实现
2.3 本地应用缓存
基本介绍
指的是在应用中的缓存组件,其最大的优点是应用和cache是在同一个进程内部,请求缓存非常快速,没有过多的网络开销等,在单应用不需要集群支持或者集群情况下各节点无需互相通知的场景下使用本地缓存较合适; 同时,它的缺点也是应为缓存跟应用程序耦合,多个应用程序无法直接的共享缓存,各应用或集群的各节点都需要维护自己的单独缓存,对内存是一种浪费。
应用场景
缓存字典等常用数据
缓存介质
实现
编程直接实现
Ehcache
基本介绍
Ehcache是一种基于标准的开源缓存,可提高性能,卸载数据库并简化可伸缩性。 它是使用最广泛的基于Java的缓存,因为它功能强大,经过验证,功能齐全,并与其他流行的库和框架集成。Ehcache可以从进程内缓存扩展到使用TB级缓存的混合进程内/进程外部署
应用场景
Ehcache架构图
Ehcache主要特征
Ehcache缓存数据过期策略
Ehcache过期数据淘汰机制
懒淘汰机制:每次往缓存放入数据的时候,都会存一个时间,在读取的时候要和设置的时间做TTL比较来判断是否过期
Guava Cache
2.4 分布式缓存
基本介绍
Guava Cache是Google开源的Java重用工具集库Guava里的一款缓存工具
特点与功能
应用场景
数据结构图
缓存更新策略
缓存回收策略
2.4 分布式缓存
指的是与应用分离的缓存组件或服务,其最大的优点是自身就是一个独立的应用,与本地应用隔离,多个应用可直接的共享缓存。
主要应用场景
主要接入方式
下面介绍分布式缓存常见的2大开源实现Memcached和Redis
Memcached
基本介绍
Memcached是一个高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
特点
基本架构
缓存数据过期策略
LRU(最近最少使用)到期失效策略,在Memcached内存储数据项时,可以指定它在缓存的失效时间,默认为永久。当Memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。
数据淘汰内部实现
懒淘汰机制:每次往缓存放入数据的时候,都会存一个时间,在读取 的时候要和设置的时间做TTL比较来判断是否过期
分布式集群实现
服务端并没有 “ 分布式 ” 功能。每个服务器都是完全独立和隔离的服务。 Memcached的分布式,是由客户端程序实现的
Redis
基本介绍
Redis是一个远程内存数据库(非关系型数据库),性能强劲,具有复制特性以及解决问题而生的独一无二的数据模型。它可以存储键值对与5种不同类型的值之间的映射,可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能, Redis还可以使用客户端分片来扩展写性能。内置了 复制(replication),LUA脚本(Lua scripting),LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
数据模型
数据淘汰策略
数据淘汰内部实现
持久化方式
底层实现部分解析
启动的部分过程图解
server端持久化的部分操作图解
底层哈希表实现(渐进式Rehash)
初始化字典
新增字典元素图解
Rehash执行流程
缓存设计原则
Redis与Memcached比较
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,数据量非常大,并发量非常大的业务 |
下一篇 《理解分布式系统中的缓存架构(下)》将介绍缓存架构设计常见问题以及解决方案,业界案例。
(本文同时发表于作者个人博客 www.jianshu.com/u/ced6b70c7…)
参考
从0开始学架构 —— Alibaba 李运华
Java核心技术36讲—— Oracle 杨晓峰
分析Redis架构设计 ——上帝禁区
Memcached官方文档
redis的持久化方式RDB和AOF的区别 —— 58沈剑
缓存,你真的用对了么? —— 58沈剑
选redis还是memcached,源码怎么说? —— 58沈剑
缓存那些事 —— 美团技术团队
Redis 缓存设计原则—— 雪飞鸿
Redis的缓存策略和主键失效机制 ——邴越
理解分布式系统中的缓存架构(上)相关推荐
- 深入理解分布式系统中的缓存架构(上)
转载自 深入理解分布式系统中的缓存架构(上) 本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景. 1 缓存概述 2 缓存的分类 缓存主要分为以下四类 2.1 CDN缓存 基本 ...
- 理解分布式系统中的缓存架构(下)
承接上一篇<理解分布式系统中的缓存架构(上)>,介绍了大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景,本文主要介绍缓存架构设计常见问题以及解决方案,业界案例. 1. 分层缓存架 ...
- 深入理解分布式系统中的缓存架构(下)
转载自 深入理解分布式系统中的缓存架构(下) 承接上一篇<理解分布式系统中的缓存架构(上)>,介绍了大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景,本文主要介绍缓存架构设计 ...
- 大型分布式系统中的缓存架构
作者:陈彩华 来自:51cto技术栈(ID:blog51cto) 本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景. 缓存概述 缓存概述 缓存的分类 缓存主要分为四类,如下图: ...
- 快速掌握:大型分布式系统中的缓存架构
关注我们获得更多内容 " 本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景. 缓存概述 缓存概述 缓存的分类 缓存主要分为四类,如下图: 缓存的分类 CDN 缓存 CD ...
- 深入浅出分布式系统中的缓存架构
缓存,已经是一个老生常谈的技术了,在高并发读的情况下对于读服务来说可谓是抗流量的银弹. 高并发三大利器:缓存.限流.降级. 今天我们就来谈谈缓存.对于缓存,我的理解是让数据更接近于用户,目的是让用户的 ...
- 深入理解分布式技术 - 分布式系统中的缓存
文章目录 缓存无处不在 缓存的分类 前端缓存 网络传输缓存 服务端缓存 数据库缓存 缓存无处不在 缓存是分布式系统开发中的常见技术,在分布式系统中的缓存,不止 Redis.Memcached 等后端存 ...
- 深入理解MySQL8中死锁及线上故障解决
深入理解MySQL8中死锁及线上故障解决 一.什么是死锁 死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象. 若无外力作用,事务都将无法推进下去. 解决死锁问题最简单的 ...
- 「数据一致性」理解分布式系统中的一致性
首先,什么是一致性? 一致性是指分布式系统中多个节点为达到某一数值而达成的协议. 具体来说,可以分为强一致性和弱一致性. 强一致性:所有节点的数据在任何时候都是相同的.同时,您应该得到节点A中的key ...
最新文章
- jackson 反序列化string_Java 中使用Jackson反序列化
- python django restful_详解Django rest_framework实现RESTful API
- entry for sde instance not found in services file解决方法[转]
- Linux学习笔记——gzip命令
- vue获取当前月最后一天_只争朝夕,不负韶华——站在2020年第一天,回望2019最后的两个月...
- 算法移植优化(七)cmake常用函数记录
- 怎么给php下拉框默认选中
- [vscode] python debugging
- 云计算的思想领袖:与橡树岭国家实验室云计算研究员Rob Gillen的谈话
- Android 自定义控件圆形图案
- #565. 「LibreOJ Round #10」mathematican 的二进制(期望 + 分治NTT)
- 《剑指offer》面试题15——链表中倒数第k个结点
- 在计算机内部除顶点,吉林大学材料加工CADCAM基础第章_计算机辅助设计基础课件.ppt...
- 计算机专业专业课代号408,计算机408有多难
- RNA 6. 差异基因表达之-- 火山图 (volcano)
- php全套之七,php程序员工具箱
- amd 安卓虚拟机_一款完美解决AMD兼容问题的安卓模拟器
- Clouda框架环境搭建
- 数据库mysql+401.1_MySQL 数据库
- 转:查尔斯·汉迪:你是谁,比你做什么更重要
热门文章
- Docker 网络之进阶篇
- NetScaler SDWAN 详细配置手册
- 从零开始学_JavaScript_系列(16)——CSSlt;3gt;(文本、对齐、圆角、盒模型、背景)...
- 路由器简介与IOS介绍
- windows下ffmpeg使用dxva2加速硬件解码
- ffmpeg学习1 音视频基本概念
- java中向JTextArea中添加滚动条(垂直的和水平的)
- Ice笔记--C++线程与并发(二)
- UNIX环境高级编程》笔记--getrlimit和setrlimit函数
- Windows 命名管道 + 异步I/O模型