深入理解分布式系统中的缓存架构(上)

转载自   深入理解分布式系统中的缓存架构(上)

本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景。

1 缓存概述

 

2 缓存的分类

缓存主要分为以下四类

2.1 CDN缓存

基本介绍

CDN(Content Delivery Network 内容分发网络)的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求

应用场景

主要缓存静态资源,例如图片,视频

应用图

未使用CDN缓存

优点

2.2 反向代理缓存

基本介绍

反向代理位于应用服务器机房,处理所有对WEB服务器的请求。
如果用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。通过降低向WEB服务器的请求数,从而降低了WEB服务器的负载。

应用场景

一般只缓存体积较小静态文件资源,如css、js、图片

应用图

开源实现

2.3 本地应用缓存

基本介绍

指的是在应用中的缓存组件,其最大的优点是应用和cache是在同一个进程内部,请求缓存非常快速,没有过多的网络开销等,在单应用不需要集群支持或者集群情况下各节点无需互相通知的场景下使用本地缓存较合适;
同时,它的缺点也是应为缓存跟应用程序耦合,多个应用程序无法直接的共享缓存,各应用或集群的各节点都需要维护自己的单独缓存,对内存是一种浪费。

应用场景

缓存字典等常用数据

缓存介质

实现

编程直接实现

 

Ehcache

基本介绍

Ehcache是??一种基于标准的开源缓存,可提高性能,卸载数据库并简化可伸缩性。
它是使用最广泛的基于Java的缓存,因为它功能强大,经过验证,功能齐全,并与其他流行的库和框架集成。Ehcache可以从进程内缓存扩展到使用TB级缓存的混合进程内/进程外部署

应用场景

Ehcache应用场景

Ehcache架构图

Ehcache架构图

Ehcache主要特征

Ehcache主要特征

Ehcache缓存数据过期策略

Ehcache过期数据淘汰机制

懒淘汰机制:每次往缓存放入数据的时候,都会存一个时间,在读取的时候要和设置的时间做TTL比较来判断是否过期

 

2.4 分布式缓存

基本介绍

Guava Cache是Google开源的Java重用工具集库Guava里的一款缓存工具

特点与功能

应用场景

数据结构图

Guava Cache数据结构图

缓存更新策略

缓存回收策略

2.4 分布式缓存

指的是与应用分离的缓存组件或服务,其最大的优点是自身就是一个独立的应用,与本地应用隔离,多个应用可直接的共享缓存。

主要应用场景

主要接入方式

下面介绍分布式缓存常见的2大开源实现Memcached和Redis

 

Memcached

基本介绍

Memcached是一个高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

特点

基本架构

缓存数据过期策略

LRU(最近最少使用)到期失效策略,在Memcached内存储数据项时,可以指定它在缓存的失效时间,默认为永久。当Memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。

数据淘汰内部实现

懒淘汰机制:每次往缓存放入数据的时候,都会存一个时间,在读取
的时候要和设置的时间做TTL比较来判断是否过期

分布式集群实现

服务端并没有 “ 分布式 ” 功能。每个服务器都是完全独立和隔离的服务。 Memcached的分布式,是由客户端程序实现的

数据读写流程图

Memcached分布式集群实现

 

Redis

基本介绍

Redis是一个远程内存数据库(非关系型数据库),性能强劲,具有复制特性以及解决问题而生的独一无二的数据模型。它可以存储键值对与5种不同类型的值之间的映射,可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,
Redis还可以使用客户端分片来扩展写性能。内置了 复制(replication),LUA脚本(Lua scripting),LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。

数据模型

数据淘汰策略

数据淘汰内部实现

持久化方式

底层实现部分解析

  • 启动的部分过程图解

  • server端持久化的部分操作图解

  • 底层哈希表实现(渐进式Rehash)

初始化字典

新增字典元素图解

Rehash执行流程

缓存设计原则

Redis与Memcached比较

 RedisMemcached
支持的数据结构哈希、列表、集合、有序集合纯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,数据量非常大,并发量非常大的业务

 

参考

从0开始学架构 —— Alibaba 李运华

Java核心技术36讲—— Oracle 杨晓峰

分析Redis架构设计  ——上帝禁区

Memcached官方文档

redis的持久化方式RDB和AOF的区别 —— 58沈剑

缓存,你真的用对了么? —— 58沈剑

选redis还是memcached,源码怎么说? —— 58沈剑

缓存那些事 —— 美团技术团队

Redis 缓存设计原则—— 雪飞鸿

Redis的缓存策略和主键失效机制  ——邴越

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软向开发者推出区块链概念验证框架

微软在近期的一篇博文中宣布了一个新的框架,用以在Azure云平台上加速已通过企业概念验证(PoC)的区块链部署。微软希望用户能在可支持分布式账本(DLT)解决方案的基础设施上,借助于灵活的契约和更少的时间&am…

Cookie和Session 登录

Cookie 实现免登陆和Session 01、 需求说明 完成用户登录功能 登录成功后跳到成功页面,显示用户名 登录失败可以跳回登录页面 登录成功后后续操作均能显示当前登录的用户名 02、完成代码 DologinServlet.java Override protected void service(HttpServletRequest req, Http…

《给教师的阅读建议》经典语录

System.out.print("今天开始继续读书摘录"); //不知道官方让不让我在博客里面记录 //如果不让的话我可能得转到别的上面记录 System.out.print("现在开始看《给教师的阅读建议》"); System.out.println("今天是第1天!也是最后一天");…

教你一招快速打开idea的秘诀

大家根据电脑系统的位数,选择 32 位的 VM 配置文件或者 64 位的 VM 配置文件32 位操作系统内存不会超过 4G,所以没有多大空间可以调整,建议不用调整了64 位操作系统中 8G 内存以下的机子或是静态页面开发者是无需修改的。64 位操作系统且内存…

深入理解分布式系统中的缓存架构(下)

转载自 深入理解分布式系统中的缓存架构(下) 承接上一篇《理解分布式系统中的缓存架构(上)》,介绍了大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景,本文主要介绍缓存架构设计常见问题以及解决方案,业界案例。 分…

【jzoj】2018.2.1 NOIP普及组——D组模拟赛

前言 懒… 正题 题1:牛车(jzoj1390) 有m条公路,有n头牛各开一辆车,如果有x辆车开在它前门,它速度就会降低d*x,路上速度至少为l。求有多少头牛可以上路。 输入 第1行: 4个空格隔开的整数N,M,…

JSP的四大作用域和九大内置对象

JSP的四大作用域和九大内置对象 https://wenku.baidu.com/view/a0974190152ded630b1c59eef8c75fbfc77d949d?ivk_sa1023194j&bfetypenew

事件总线知多少(2)

1.引言 之前的一篇文章事件总线知多少(1),介绍了什么是事件总线,并通过发布订阅模式一步一步的分析重构,形成了事件总线的Alpha版本,这篇文章也得到了大家的肯定和积极的反馈和建议,在此谢谢大…

记录程序人生2020.8.11

1.晚休的时间总是短暂的,甚至你都没有来得及闭眼呢就需要将它睁开。上眼皮与下眼皮一直恋恋不舍的分开,天花板渐渐的呈现出来,该起了! 2.5点一刻准时坐在外面的水泥台阶上,飞速打开屏幕中的背单词软件,%……

DDD理论学习系列(4)-- 领域模型

1.引言 我们还是先来拆词理解,领域模型可以拆为“领域”和“模型”二词。 领域:按照我们之前的文章的理解,DDD中的领域是指软件系统要解决的问题,如我们的办公设备公众号在线商城就是为了解决电商问题,对应的就是电商…

Ajax判断用户名是否可用

Ajax的简介 01展示效果并认识Ajax 方案1:传统方案 提交表单,服务器端处理,错误后跳转到注册页面,同时显示错误信息。返回客户端的是整个注册页面。 缺点:较大的网络流量,用户体验不好 方案2:使…

学习分布式不得不会的ACP理论

转载自 学习分布式不得不会的ACP理论 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。 无…

浅谈我的读书史

点击上方蓝字关注我们本文是【雄雄的小课堂】原创的第 137 篇文章昨日晚间,一个朋友突然问我:“读书真的会有所收获吗?”“读书,真的会改变一个人吗?”刚看到这个问题时,我有点愕然,想着为啥会突…

.NetCore+Jexus代理+Redis模拟秒杀商品活动

开篇叙 ,顺手点个推荐也不错; a. 秒杀流程 b. 封装StackExchange.Redis的使用类 c. Ubuntu16.04上使用Jexus搭建代理完成分布式部署 d. NetCore写实时监控队列服务 秒杀架构设计图︿( ̄︶ ̄)︿三幅 1. 一般业务性架构 2. 后端…

如何快速搭建一个免费的,无限流量的Blog

转载自 如何快速搭建一个免费的,无限流量的Blog 喜欢写Blog的人,会经历三个阶段。 第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写。 第二阶段,发现免费空间限制太多,就自己购买域…

切记!构造函数里面别一定不要初始化其他类,踩过坑的都知道

点击上方蓝色关注我们!先来看看什么是构造函数(方法):是一种特殊的方法,特殊之处就在于它没有返回类型,void也不可以有。且方法名与类名完全相同。主要是用来创建对象时初始化对象,也就是为对象…

线程安全问题解决

方式一(同步代码块) synchronized(同步监视器){ //需要被同步的代码 } 说明:1.操作共享数据的代码,即为需要被同步的代码。 -->不能包含代码多了,也不能包含代码少了。 2.共享数据:多个线程共同操作的变量。比如:…

Chrome DevTools 调研笔记

1 说明 此篇文章针对Chrome DevTools常用功能进行调研分析。描述了每个功能点能实现的功能、应用场景和详细操作。 2 Elements 2.1 功能 检查和实时更新页面的HTML与CSS 在 Elements 面板中检查和实时编辑 DOM 树中的任何元素。在 Styles 窗格中查看和更改应用到任何选…

java中你知道的这四种代码块吗?

点击上方蓝字关注我们大家好,我是雄雄,今天给大家分享的是:java中的四种代码块什么叫代码块?代码块就是将多行代码封装到一个“{}”中,形成一个独立的代码区,这就构成了代码块,一般常见的代码块…