服务端应用多级缓存架构方案

服务端应用多级缓存架构方案

场景

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

常规解决方案

  • 可使用分布式缓存来抗,比如redis集群,6主6从,主提供读写,从作为备,不提供读写服务。1台平均抗3w并发,还可以抗住,如果QPS达到100w,通过增加redis集群中的机器数量,可以扩展缓存的容量和并发读写能力。同时,缓存数据对于应用来讲都是共享的,主从架构,实现高可用。

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

  • 但是如果出现缓存热点,比如10w流量来自同一个key,打到同一个redis实例,那么就有可能出现CPU被打满,这种增加redis集群数量解决不了问题。
  • 本地缓存可以解决热key问题,主要原因是本地缓存可以避免redis单台缓存服务器的高负载。通过复制多份缓存副本,将请求分散到多个缓存服务器上,可以减轻缓存热点导致的单台缓存服务器压力。此外,本地内存缓存也具有更快的访问速度,因为数据存储在应用程序的内存中,无需跨网络传输数据。

通用多级缓存方案

  • 请求优先打到应用本地缓存,本地缓存不存在,再去r2m(redis)集群拉取,同时缓存到本地
  • 在这里插入图片描述

多级缓存同步方案

  • 运营后台保存数据,写入r2m缓存,同时通过redis的发布订阅功能发布消息
  • 本地应用集群作为消息订阅者,接受消息后,删除本地缓存,C端流量请求打过来的时候,如果本地缓存不存在,则将r2m中缓存加载到本地缓存。
  • 定时任务是防止极端情况下,r2m缓存失效,将数据重新加载到r2m缓存。
  • 在这里插入图片描述

缓存同步组件选型

  • 采用redis的发布订阅。
  • Redis的发布订阅模式是推模式。在Redis中,SUBSCRIBE命令用于订阅一个或多个频道,以便在有消息发布到这些频道时接收通知。PUBLISH命令用于向一个或多个频道发布消息。当有消息发布到某个频道时,所有订阅该频道的客户端都会收到该消息。在推模式下,每个频道维护一个客户端列表,发送消息时遍历该列表将消息推送给所有订阅者。拉模式则相反,发送者将消息放到一个邮箱中,所有订阅这个邮箱的客户端可以在任意时刻去收取。确保所有客户端都成功收取完整的邮件后,才删除该邮件。
  • Redis的发布订阅是异步的。当有消息发布到某个频道时,Redis会异步地将消息推送给所有订阅该频道的客户端。这意味着,客户端不会阻塞等待消息,而是继续执行其他任务,直到需要接收消息时才会去获取。这种异步方式可以提高系统的并发性和效率。

使用本地缓存注意事项

  • 本地缓存占用java进程的jvm内存空间,故不能进行大数据量存储,需要进行缓存大小评估。
  • 业务能接受短暂数据的不一致,更适用于读场景。
  • 缓存更新策略,主动更新和被动更新,本地缓存一定要设置有效期
  • 定时任务同步缓存机制,根据业务情况考虑极端情况数据丢失
  • rpc调用避免本地缓存污染,可通过深拷贝解决。
  • 本地缓存随着应用重启而失效,注意加载分布式缓存时机
  • redis的pub,sub模式更新缓存策略(删除本地缓存key,避免在pub,sub模式下传递大value,pub,sub模式不会持久化消息数据,导致消费者对应redis的缓冲区超限,从而导致数据丢失),本地缓存失效时,加锁synchronized,由一个线程加载r2m缓存,避免并发更新。

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

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

相关文章

【算法专题--双指针算法】leecode-15.三数之和(medium)、leecode-18. 四数之和(medium)

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 前言1. 三数之和2. 解法&…

选择最佳图像处理工具OpenCV、JAI、ImageJ、Thumbnailator和Graphics2D

文章目录 1、前言2、 图像处理工具效果对比2.1 Graphics2D实现2.2 Thumbnailator实现2.3 ImageJ实现2.4 JAI(Java Advanced Imaging)实现2.5 OpenCV实现 3、图像处理工具结果 1、前言 SVD(stable video diffusion)开放了图生视频的API,但是限…

使用GPT将文档生成问答对

根据文档生成问题列表 url https://api.openai.com/v1/chat/completions# 替换为您自己的API密钥 api_key sk-xxxxxxxxxmodel "gpt-3.5-turbo-16k"prompt1 #01 你是一个问答对数据集处理专家。 #02 你的任务是根据我给出的内容,生成适合作为问答对数…

Ubuntu deb文件 安装 MySQL

更新系统软件依赖 sudo apt update && sudo apt upgrade下载安装包 输入命令查看Ubuntu系统版本 lsb_release -a2. 网站下载对应版本的安装包 下载地址. 解压安装 mkdir /home/mysqlcd /home/mysqltar -xvf mysql-server_8.0.36-1ubuntu20.04_amd64.deb-bundle.tar# …

Elasticsearch性能优化:实战策略与最佳实践

-在数据密集型的应用场景中,Elasticsearch作为一个强大的搜索和分析引擎,能够提供快速的搜索能力和处理大规模数据的能力。然而,随着数据量的增长和查询需求的复杂化,对Elasticsearch的性能优化成为了维护高效、稳定服务的重要任务…

中间件学习

一、ES 场景:某头部互联⽹公司的好房业务,双⼗⼀前⼀天,维护楼盘的运营⼈员突然接到合作开发商的通知,需要上线⼀批热⻔的楼盘列表,上传完成后,C端⼩程序⽀持按楼盘的名称、户型、⾯积等产品属性全模糊搜索…

aardio - godking.json 【库】测试

godkong.json1 : 主要针对数值进行了处理。 1、内部创建了一个数值处理类,所有数值均以数值对象类型保存,以避免将数值识别为科学计数法文本。 2、读取数值成员时,需用 tostring() 转换为数值文本。 3、数值可以读取,可以赋值(数值…

Spring与Spring Boot:理解它们的区别与适用场景

引言 在Java开发领域,Spring和Spring Boot是两个非常重要的框架。它们被广泛应用于企业级应用开发、微服务架构构建等场景。尽管Spring Boot是Spring框架的一个扩展,但它们之间仍然存在一些重要区别。本文将详细介绍这些区别,帮助读者更好地…

【考研数学】张宇最新全年学习包

考研数学冲高分必备,张宇老师肯定榜上有名! 考研数学,其实就像一场没有硝烟的战斗。基础题是常规武器,中难题就是重型火炮,而压轴题呢,那就是核弹级别的存在!考研的战场,关键就在那…

【CSP考点回顾】二维前缀和数组(代码实现)

1. 初始化扩展的二维前缀和数组 创建一个大小为 (rows 1) x (cols 1) 的二维前缀和数组&#xff0c;其中 rows 和 cols 分别是原始数组的行数和列数。然后&#xff0c;我们按以下方式填充这个数组&#xff1a; void initPrefixSum(vector<vector<int>>& pr…

自动驾驶的几种名词

1. 自适应巡航控制&#xff08;ACC&#xff09; 自适应巡航控制&#xff08;Adaptive Cruise Control&#xff0c;ACC&#xff09;是一种汽车驾驶辅助系统&#xff0c;它可以根据前方车辆的速度和距离自动调整车辆的速度&#xff0c;以保持与前车的安全距离。ACC系统由控制层和…

使用ChatGPT的场景之gpt写研究报告,如何ChatGPT写研究报告

推荐写研究报告使用智能站&#xff1a; dayfire.cn/ 1. 确定研究主题 明确主题&#xff1a;在开始之前&#xff0c;你需要有一个清晰的研究主题。这将帮助AI更好地理解你的需求…

上位机图像处理和嵌入式模块部署(qmacvisual拟合圆和拟合椭圆)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们学习了拟合直线&#xff0c;今天继续学习下拟合圆和拟合椭圆。其实除了最后一步不同&#xff0c;两者的逻辑是差不多的。一般都是&#xf…

elasticsearch+kibana安装部分问题:

1.elasticsearch启动问题&#xff1a; 如果elasticsearch开启https登录则第一次启动的时候需要前台启动&#xff0c;前台启动的时候会自己创建相应的token等登录信息,如果是后台启动则没有这些登录信息&#xff1a; ./elasticsearch ━━━━━━━━━━━━━━━━━━━…

SQL简单查询-2

目录 第一关任务描述 相关知识 检索数据表中一个字段的内容 检索数据表中多个字段的内容 检索数据表中所有字段的内容 编程要求 测试说明 第一关实验代码&#xff1a; 第二关任务描述 相关知识 带限制条件的查询 表达式查询 编程要求 第二关实验代码 第三关任务描…

【电机-电机控制】

电机-电机控制 ■ 步进电机■ 简介 ■■ ■ 步进电机 ■ 简介 步进电机是一个把电脉冲信号转换为角位移或线位移动的电动机。 ■ ■

(delphi11最新学习资料) Object Pascal 学习笔记---第7章第5节(完整的TDate类)

7.5.3 完整的TDate类 ​ 在本章中&#xff0c;我向您展示了TDate类不同版本的源代码的片段。第一个版本基于三个整数来存储年份、月份和日期&#xff1b;第二个版本使用RTL提供的TDateTime类型的字段。以下是定义TDate类的单元的完整接口部分&#xff1a; unit Dates; interf…

零基础入门多媒体音频(5)-alsa(1)

alsa是音频最重要的框架&#xff0c;没有之一。接下来一个月时间在总结工作知识的主线上。单开个音频支线讲解alsa。说实话&#xff0c;alsa这块我也不是很精通。只在过去的项目中增加 一路substream实现低延时。我打算从下面四个方面去学习alsa。 1.alsa官网。网址如下&#x…

汉明校验·简明教程

汉明校验 一、简介 汉明码是由 Richard Hanming 于 1950 年提出的&#xff0c;它具有一位纠错能力。 新增的汉明码校验位数应满足如下关系&#xff1a; 2 k ⩾ n k 1 2^{k}\geqslant nk1 2k⩾nk1&#xff0c;其中k为校验位位数&#xff0c;n位数据位数。 二、汉明码生成 确…

Python学习从0到1 day18 Python可视化基础综合案例 3.动态柱状图

夜色难免黑凉&#xff0c;前行必有曙光。 —— 24.3.25 目录&#xff1a; 01.基础柱状图 02.基础时间线柱状图 03.GDP动态柱状图绘制 一、基础柱状图构建 掌握构建一个基础的柱状图并能够反转x和y轴 1.通过Bar功能构建基础柱状图 基础柱状图的开发 # 导包 Bar包&#xff0c;生…