多级缓存 架构设计

说在前面

在40岁老架构师 尼恩的读者社区(50+)中,很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、网易、滴滴的面试资格,多次遇到一个很重要的面试题:

  • 20w的QPS的场景下,服务端架构应如何设计?
  • 10w的QPS的场景下,缓存架构应如何设计?

尼恩提示,缓存架构、缓存规划、缓存淘汰、多级缓存的数据一致性 相关的问题,是架构的核心知识,又是线上的重点难题。

另外,尼恩一直給大家指导简历,辅导架构转型。前几天指导美团一个超级大佬L9的简历, 也谈到了缓存的这些难题, 需要提供一些解决方案,给他作为:

  • 第一:学习材料
  • 第二:架构轮子。

基于以上原因,尼恩基于 《京东服务端应用多级缓存架构方案》以及 《有赞透明多级缓存解决方案(TMC)》,给大家做一下系统化、体系化的梳理。从而,再面试的时候,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典》V105版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到公号【技术自由圈】获取

文章目录

    • 说在前面
    • 高并发场景分析
    • 通用多级缓存方案
    • 多级缓存数据一致性问题
    • 京东发布订阅缓存同步组件选型
    • 什么是缓存污染问题?
    • 多级缓存架构的注意事项
    • 说在最后:有问题可以找老架构取经
    • 参考文献
    • 推荐阅读

高并发场景分析

一般来说, 如果 10Wqps,或者20Wqps ,可使用分布式缓存来抗。

比如redis集群,6主6从:主 提供读写,从 作为备,从 不提供读写服务。

6主6从架构下,1台平均抗3w-4W并发,还可以抗住 18Wqps -24Wqps。

并且,如果QPS达到100w,通过增加redis集群中的机器数量,可以扩展缓存的容量和并发读写能力。6主6从的架构,可以扩容到 30主30从

同时,缓存数据对于应用来讲都是共享的,主从架构,实现高可用。

问题:如何解决缓存热点(热key)问题?

一旦出现缓存热点现象,例如有 10 w流量访问同一 Key,并集中于某一个 Redis 实例,可能会导致该实例的 CPU 负载过高。

这种情况下,即便增加 Redis 集群数量,也无法根本解决问题。 那么解决热 key 问题的有效手段,到底是什么呢? 非常有效的手段之一,本地缓存。其主要原因是: 本地缓存避免了 Redis 单个缓存服务器的高负载。同时,本地内存缓存拥有更快的访问速度,因为数据直接存储在应用程序的内存中,无需通过网络传输数据。

本地缓存的实质:是多副本, 空间换时间。 通过复制多份缓存副本,将请求分散,可以缓解由缓存热点引发的单个缓存服务器压力。

凡事,有利必有弊。

那么,引入本地缓存又会带来哪些问题呢? 主要问题有:

  • 数据一致性问题
  • 本地缓存数据污染问题

关于以上两个问题,尼恩之前的文章: 《场景题:假设10W人突访,你的系统如何做到不 雪崩?》,基于有赞透明多级缓存解决方案(TMC), 給大家做过一个全面的梳理。

但是, 咱们作为未来超级架构师,需要采蜜百家之长, 极度开阔自己的技术视野。

所以,这里基于《京东服务端应用多级缓存架构方案》,給大家再梳理一篇。原文的京东服务端应用多级缓存架构方案|京东云技术团队。

通用多级缓存方案

京东服务端应用多级缓存架构方案, 其实是一种常用的2级缓存的架构方案:

(1)L1一级缓存:本地缓存guava

(2)L2二级缓存:分布式缓存redis

2级缓存的架构方案的缓存访问流程:

  • 请求优先打到应用本地缓存
  • 本地缓存不存在,再去redis 集群拉取,同时缓存到本地

以上流程,类似于cache aside 旁路缓存模式。 具体的缓存访问流程,大致如下:

有关 DB与Redis 缓存之间的 cache aside 旁路缓存模式的数据一致性问题, 具体请阅读尼恩的《Java高并发核心编程 卷3 加强版》。

那么,引入本地缓存又会带来哪些问题呢? 主要问题有:

  • 数据一致性问题
  • 本地缓存数据污染问题

多级缓存数据一致性问题

如何解决多级缓存数据一致性问题呢? 主要是 多级缓存同。 主要使用发布订阅模式、或者底层组件RPC通讯机制,完成本地cache与Redis缓存的数据同步。

  • 京东采用的是 发布订阅模式。
  • 有赞采用的 底层组件RPC通讯机制
  • J2cache采用的是 发布订阅模式。

首先看看 发布订阅, 深入下去,也有两种模式:

  • 推送模式:每个频道都维护着一个客户端列表,当发送消息时,会遍历该列表并将消息推送给所有订阅者。
  • 拉取模式:发送者将消息放入一个邮箱中,所有订阅该邮箱的客户端可以随时去收取。在确保所有客户端都成功收取完整邮件后,才会删除该邮件。

首先,来看看 京东的数据一致性问题:多级缓存同步方案

  1. 运营后台保存数据,写入Redis缓存,同时利用 Redis 的发布订阅功能发布信息。
  2. 业务应用集群作为消息订阅者,接收到运营数据消息后,删除本地缓存,
  3. 当 C 端流量请求到达时,若本地缓存不存在,则从 Redis 中加载缓存至本地缓存。
  4. 防止极端情况下,Redis缓存失效,通过定时任务,将数据重新加载到Redis缓存。

其次,再看看 有赞的数据一致性问题: 使用 通信模块 实现每个节点 之间的数据一致性

具体的介绍,请参见尼恩二次创作文章: 《场景题:假设10W人突访,你的系统如何做到不 雪崩?》,基于有赞透明多级缓存解决方案(TMC), 給大家做过一个全面的梳理。

另外,行业内有部分成熟的二级缓存中间件,主要使用消息队列rocketmq /kafka,实现本地缓存与分布式缓存之间的数据一致性。这种架构方案, 具体可以参见 尼恩的架构视频 《100Wqps三级缓存组件实操》

京东发布订阅缓存同步组件选型

京东使用redis的 channel(频道)机制,完成本地cache与Redis缓存的数据同步。在 Redis 的channel(频道)机制,发布订阅模式是一种推送模式。

  • 通过使用 SUBSCRIBE 命令,可以订阅一个或多个频道,以便在相关频道发布消息时接收到通知。
  • PUBLISH 命令则用于向一个或多个频道发送消息。当某个频道有消息发布时,所有订阅该频道的客户端都会收到相应的通知。

另外,Redis 的发布订阅模式是异步的。当有消息发布到某个频道时,Redis 会异步地将消息推送给所有订阅该频道的客户端。这就意味着,客户端不会因为等待消息而阻塞,而是继续执行其他任务,仅在需要接收消息时才去获取。这种异步方式有助于提高系统的并发性和效率。

什么是缓存污染问题?

引入本地缓存又会带来哪些问题呢? 主要问题有:

  • 数据一致性问题
  • 本地缓存数据污染问题

前面咱们看了 数据一致性问题。再来看看,缓存污染问题。

缓存污染问题指的是留存在缓存中的数据,实际不会再被访问了,但是又占据了缓存空间。

如果这样的数据体量很大,甚至占满了缓存,每次有新数据写入缓存时,还需要把这些数据逐步淘汰出缓存,就会增加缓存操作的时间开销。

因此,要解决缓存污染问题,最关键的技术就是能识别出这些只访问一次或是访问次数很少的数据,在淘汰数据时,优先把他们筛选出来淘汰掉。所以,解决缓存污染的核心策略,叫做

缓存中主要常用的缓存淘汰策略:

  • random 随机
  • lru
  • lfu

(1) random 随机: 是随机选择数据进行淘汰 主要包括volatile-random和allkeys-random。随机淘汰,比如volatile-random和allkeys-random ,无法把不再访问的数据筛选出来,可能会造成缓存污染。

(2)LRU:LRU算法的基本思想是,当缓存空间不足时,要淘汰最近最少使用的缓存项,即淘汰访问时间最长的数据项。这样可以保证最常用的数据项始终保留在缓存中,从而提高系统的响应速度和吞吐量。 由于LRU策略只考虑数据的访问时效,对于只访问一次的数据来说,LRU策略无法很快将其筛选出来。

(3)LFU策略再LRU策略基础上进行了优化,在筛选数据时,首先会筛选并淘汰访问次数少的数据,然后针对访问次数相同的数据,再筛选并淘汰访问时间最久的数据。

在实际业务应用中,LRU和LFU两个策略都有应用。

LRU和LFU两种策略关注的数据访问特征各有侧重,LRU策略更加关注数据的时效性,而LFU策略更加关注数据的访问频次

通常情况下,实际应用的负载具有较好的时间局部性,所以LRU策略的应用会更加广泛。

但是,在扫描式查询的应用场景中,LFU策略就可以很好地应对缓存污染问题了,建议你优先使用。

京东本地缓存用的是guava,那么策略是LRU,LRU策略更加关注数据的时效性, 具有较好的时间局部性,使用于大部分数据场景。

大部分本地缓存用的建议使用caffeine,那么策略是LRU+LFU,既 具有较好的时间局部性,使用于大部分数据场景。也具有关注数据的访问频次, 避免扫描式查询的应用场景中数据污染问题。 具体的原理, 请参见尼恩的 《100Wqps三级缓存组件》视频,里边对caffeine 内部原理和架构,做了深入介绍,而且caffeine的性能也比guava高。

多级缓存架构的注意事项

  1. 由于本地缓存会占用 Java 进程的 JVM 内存空间,因此不适合存储大量数据,需要对缓存大小进行评估。
  2. 如果业务能够接受短时间内的数据不一致,那么本地缓存更适用于读取场景。
  3. 在缓存更新策略中,无论是主动更新还是被动更新,本地缓存都应设置有效期。
  4. 考虑设置定时任务来同步缓存,以防止极端情况下数据丢失。
  5. 在 RPC 调用中,需要避免本地缓存被污染,可以通过合理的缓存淘汰策略,来解决这个问题。
  6. 当应用重启时,本地缓存会失效,因此需要注意加载分布式缓存的时机。
  7. 通过发布/订阅解决数据一致性问题时,如果发布/订阅模式不持久化消息数据,如果消息丢失,本地缓存就会删除失败。 所以,要解决发布订阅消息的高可用问题。
  8. 当本地缓存失效时,需要使用 synchronized 进行加锁,确保由一个线程加载 Redis 缓存,避免并发更新。

说在最后:有问题可以找老架构取经

架构之路,充满了坎坷

架构和高级开发不一样 , 架构问题是open/开发式的,架构问题是没有标准答案的

正由于这样,很多小伙伴,尽管耗费很多精力,耗费很多金钱,但是,遗憾的是,一生都没有完成架构升级

所以,在架构升级/转型过程中,确实找不到有效的方案,可以来找40岁老架构尼恩求助.

昨天一个小伙伴,他们要进行 电商网站的黄金链路架构, 开始找不到思路,但是经过尼恩 10分钟语音指导,一下就豁然开朗。

参考文献

https://it.sohu.com/a/696701644_121438385

https://blog.csdn.net/crazymakercircle/article/details/128533821

推荐阅读

《百亿级访问量,如何做缓存架构设计》

《消息推送 架构设计》

《阿里2面:你们部署多少节点?1000W并发,当如何部署?》

《美团2面:5个9高可用99.999%,如何实现?》

《网易一面:单节点2000Wtps,Kafka怎么做的?》

《字节一面:事务补偿和事务重试,关系是什么?》

《网易一面:25Wqps高吞吐写Mysql,100W数据4秒写完,如何实现?》

《亿级短视频,如何架构?》

《炸裂,靠“吹牛”过京东一面,月薪40K》

《太猛了,靠“吹牛”过顺丰一面,月薪30K》

《炸裂了…京东一面索命40问,过了就50W+》

《问麻了…阿里一面索命27问,过了就60W+》

《百度狂问3小时,大厂offer到手,小伙真狠!》

《饿了么太狠:面个高级Java,抖这多硬活、狠活》

《字节狂问一小时,小伙offer到手,太狠了!》

《收个滴滴Offer:从小伙三面经历,看看需要学点啥?》

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国际版阿里云/腾讯云:弹性高性能计算E-HPC入门概述

入门概述 本文介绍E-HPC的运用流程,帮助您快速上手运用弹性高性能核算。 下文以创立集群,在集群中安装GROMACS软件并运转水分子算例进行高性能核算为例,介绍弹性高性能核算的运用流程,帮助您快速上手运用弹性高性能核算。运用流程…

企业架构LNMP学习笔记7

PHP介绍: HTML:超文本标记语言 http: 超文本传输协议 端口80 浏览器将html代码解析成web页面。 PHP:超文本预处理器。后端语言开发,页面上需要动态改变修改的,需要连接数据库查询数据,转为html。 主要…

电脑每次开机杀毒软件报iusb3mon.exe病毒已清除,电脑中病毒iusbmon杀毒办法,工具杀毒

不知道什么时候开始,我电脑C盘的系统数据存储文件夹programdata 不知不觉就没了,找不到了 programdata文件夹为存储系统数据文件的,这个文件不见了,而且我打开了显示隐藏文件和文件夹还是没有显示 然后我重启电脑,杀毒…

万物流动 万物永驻 ——C++ Core Guidelines的流动哲学

众所周知,C 是一门自由的语言,语言的设计哲学之一就是赋予程序员极大的自由度和灵活性,因此,使用C 完成一个任务时,不同的程序员往往会有不同的实现方法,这真正阐释了什么叫条条大路通罗马。不过&#xff0…

CSS transition 过渡

1 前言 CSS过渡(transition)可以在一个元素切换到另一种状态时为其定义平滑的过渡效果。 例如,用户鼠标悬停在按钮上时,按钮颜色平滑的从一个颜色过渡到另一个颜色。 .btn:hover{background-color: red;color: black; }默认悬停效果 添加过渡效果 .b…

电商项目part10 高并发缓存实战

缓存的数据一致性 只要使用到缓存,无论是本地内存做缓存还是使用 redis 做缓存,那么就会存在数据同步的问题。 先读缓存数据,缓存数据有,则立即返回结果;如果没有数据,则从数据库读数据,并且把…

MusicBrainz Picard for Mac :音乐文件ID3编辑器

MusicBrainz Picard for Mac是一款macOS平台的音乐文件ID3编辑器,能够帮助我们在Mac电脑上编辑音乐文件的ID3标签信息,包括艺人、专辑等信息,非常快速和简单方便。Picard是下一代MusicBrainz标记应用程序。 这个新的标签概念是面向专辑的&…

自动化测试(四):pytest结合allure生成测试报告

Allure 报告框架的名称 allure: noun [ U ] 诱惑;魅力;吸引力 文章目录 1. allure下载2. pytest框架使用allure3. 生成allure报告 1. allure下载 下载前需要先安装JDK,这里可以参考自动化测试(二)。 Allure下载路径:https://github.com/allu…

C语言——函数的使用

无参无返回值 语法格式如下: // 函数定义 void 函数名() {函数体 }// 函数调用 函数名();函数名是标识符的一种,需要遵循规则函数只需要定义一次,反复调用只定义函数, 不调用函数, 函数永远不会被执行案例需求: 编写一个函数&am…

视频动态壁纸 Dynamic Wallpaper for Mac中文

Dynamic Wallpaper是一款Mac平台上的动态壁纸应用程序,它可以根据时间等因素动态切换壁纸,提供更加生动和多样化的桌面体验。 Dynamic Wallpaper包含了多个动态壁纸,用户可以根据自己的喜好选择和切换。这些动态壁纸可以根据时间等因素进行自…

VBA技术资料MF51:VBA_在Excel中突出显示唯一值

【分享成果,随喜正能量】世间万物,因果循环不休,你的善心善行,都可能成为你的善缘善果。每天忆佛念佛,每天都在佛菩萨的加持下生活,自然吉祥如意,法喜充满。 。 我给VBA的定义:VBA是…

iPhone 14 Plus与iPhone 14 Pro:你应该买哪一款

又到了iPhone季,这意味着你可能会在几种不同的机型之间左右为难,无法决定买哪一款。更令人困惑的是,苹果推出的iPhone变体——iPhone 14 Plus,只比老款iPhone 14 Pro低100美元。 有这么多选择,你可能想知道哪款iPhone最适合你。你应该买一部大屏幕的iPhone 14 Plus并节省…

164到网络安全面试大全(附答案)

最近有不少小伙伴跑来咨询: 想找网络安全工作,应该要怎么进行技术面试准备?工作不到 2 年,想跳槽看下机会,有没有相关的面试题呢? 为了更好地帮助大家高薪就业,今天就给大家分享两份网络安全工…

pytorch中nn.Conv1d功能介绍

在使用Conv1d函数时,pytorch默认你的数据是一维的,比如一句话“深度学习”可以用一个一维数组 [深, 度, 学, 习] 表示,这个数据就是一维的。图片是二维数据,它有长宽两个维度。 因此在使用 Conv1d 函数时,输入是一个三…

Three.js相机参数及Z-Fighting问题的解决方案

本主题讨论透视相机以及如何为远距离环境设置合适的视锥体。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 透视相机是一种投影模式,旨在模仿人类在现实世界中看待事物的方式。 这是渲染 3D 场景最常用的投影模式。 - three.js 如果你看一下 Three.js 文档…

数据结构(Java实现)-java对象的比较

元素的比较 基本类型的比较 在Java中&#xff0c;基本类型的对象可以直接比较大小。 对象比较的问题 Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较 默认情况下调用的就是equal方法&#xff0c;但是该方法的比较规则是&#xff1a;没有比较引用变量引用对象的…

Linux服务器中创建SVN项目详细步骤

一、Linux服务器中的SVN安装和搭建项目环境可以参考一下文章: 1、《阿里云服务器搭建》------搭建SVN服务 2、在一个服务器的svn上&#xff0c;设置一个端口号对应一个项目 3、如何解决Linuxsvn无法显示日志的问题 二、Linux服务器中的SVN项目如何添加项目的忽略文件&#xff1…

多维时序 | Matlab实现LSTM-Adaboost和LSTM多变量时间序列预测对比

多维时序 | Matlab实现LSTM-Adaboost和LSTM多变量时间序列预测对比 目录 多维时序 | Matlab实现LSTM-Adaboost和LSTM多变量时间序列预测对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实现LSTM-Adaboost和LSTM多变量时间序列预测对比 模型…

Elasticsearch 集成--Flink 框架集成

一、Flink 框架介绍 Apache Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。 Apache Spark 掀开了内存计算的先河&#xff0c;以内存作为赌注&#xff0c;赢得了内存计算的飞速发展。 但是在其火热的同时&#xff0c;开发人员发现&#xff0c;在 Spark …

数据结构入门 — 队列

本文属于数据结构专栏文章&#xff0c;适合数据结构入门者学习&#xff0c;涵盖数据结构基础的知识和内容体系&#xff0c;文章在介绍数据结构时会配合上动图演示&#xff0c;方便初学者在学习数据结构时理解和学习&#xff0c;了解数据结构系列专栏点击下方链接。 博客主页&am…