一次redis缓存不均衡优化经验

news2024/9/26 3:32:51

背景

高并发接口,引入redis作为缓存之后,运行一段时间发现redis各个节点在高峰时段的访问量严重不均衡,有的节点访问量7000次/s,有的节点访问量500次/s

此种现象虽然暂时不影响系统使用,但是始终是个安全隐患,随着业务量逐年上涨,风险留给未来,并非一个合格码农的职业操守。必须得看看究竟是何种情况。

思考

想要优化,得现有一番思考,先得想想究竟有哪些情况会产生这种现象,才能去逐步排查,而不能盲目就去动手。

可能的原因:

  1. 数据倾斜:如果某些键的访问频率较高,而这些键又恰好分布在某几个节点上,就会导致节点的访问不均衡。这可能是因为数据分布不均匀,或者业务逻辑导致某些键的访问频率较高。
  2. 网络问题:网络延迟或带宽限制可能导致某些节点的访问速度较慢,从而使访问不均衡。
  3. 客户端连接问题:如果某些客户端连接到了某个特定节点,而其他节点上的客户端较少,就会导致节点的访问不均衡.
  4. 业务逻辑问题:是否是因为业务逻辑原因导致的频繁访问同一批数据
  5. 是否存在热key

验证

有了上述思考,就要开始去逐一排查可能的原因

1.数据倾斜排查:检查数据在节点之间的分布情况,通过查看Redis的CPU、内存指标,并未发现某个节点的负载明显高于其他节点

2.网络问题:通过监测网络延迟或带宽限制相关情况,并未发现有此种情况

3.客户端连接问题:检查客户端连接到Redis节点的方式,如果发现某些节点受到过多的请求压力,可以考虑采用负载均衡策略,将请求均匀分散到不同的节点上;通过相关检查,并未发现此类问题

4.业务逻辑问题:分析Redis访问相关业务代码及定时任务,并未发现有重复访问的逻辑存在

5.是否存在热key:通过运维获取高峰时段的访问日志,进行统计分析,

(1) 热key有两类:网点映射+以业务账号维度的数据

(2)redis访问不均衡的原因:不同客户下单高峰分布在一天不同时间段,高频访问在不同时间分布在不同节点上

方案

通过三种策略来确保redis各节点的访问均衡

1.本地缓存策略

将将要缓存的数据根据业务形态分为两类:

(1)网点类的常用数据直接缓存在本地

(2)对于高峰时期高频访问的数据,引入缓存组件Caffeine,设置相关的策略

设置大小为1M

EXPIRE_AFTER_WRITE_TIME(60s)

EXPIRE_AFTER_ACCESS_TIME(10s)

2.节点一致性策略

使用发布-订阅模式(Pub-Sub)来实现更新通知机制; 当 Redis 中的数据更新时,Redis 可以发布一个更新通知,各节点的本地缓存订阅这个通知,并根据通知更新本地缓存

3.异常解决方案

(1)异常日志记录

(2)间隔2min重试机制

(3)重试后异常告警机制

(4)数据定时同步(兜底): DB->redis、redis->本地缓存

下图为存储与访问缓存的逻辑图:

 效果

经过上述方案的实施,最终实现了:

1.redis各节点的访问量在全时段实现了均衡态

2.redis的各节点的整体QPS也下降了10%

3.像双十一双十二高峰时段接口也是稳稳的

本地缓存原理及方案选取原因

本地缓存是指将数据存储在应用程序的本地内存中,以提高数据的读取速度和访问效率。本地缓存的本质是通过将常用或热点数据保存在内存中,避免了每次访问都需要从远程或磁盘存储中读取数据的开销。

本地缓存的工作原理如下:
1.数据加载:当应用程序第一次访问某个数据时,如果该数据还未被缓存,则从远程或磁盘存储中加载数据,并将其保存在本地缓存中。
2.数据访问:当应用程序再次访问同样的数据时,首先从本地缓存中查找数据。如果数据存在于缓存中,则直接返回缓存的数据,避免了从远程或磁盘存储中读取的开销。
3.缓存更新:当数据发生变化时,需要更新缓存中的数据,以保持缓存和存储中的数据一致性。可以通过手动或自动的方式更新缓存,例如定时刷新缓存、监听数据变更事件等。
本地缓存的优势包括快速访问、低延迟、减轻了远程或磁盘存储的负载等。它适用于那些访问频率较高、数据相对稳定的场景,可以大大提高应用程序的性能和响应速度。

但是需要注意的是,本地缓存也存在一些问题,如缓存过期、缓存一致性、内存管理等。开发者需要根据具体的应用场景和需求,合理配置和管理本地缓存,以充分发挥其优势同时避免潜在的问题。

传统缓存组件方案:

FIFO:按照数据最早进入缓存的顺序进行替换。即,先进入缓存的数据先被替换掉。FIFO策略简单直观,但可能导致缓存命中率较低,因为最早进入缓存的数据可能不一定是最常用的数据。

LRU:根据数据最近被访问的时间进行替换。即,最长时间未被访问的数据会被替换掉。LRU策略基于“时间局部性”原理,认为最近被访问的数据更有可能在将来被访问,因此替换最久未被访问的数据。但实现LRU策略需要维护访问数据的顺序,可能带来一定的开销。

LFU:根据数据被访问的频率进行替换。即,最不经常被访问的数据会被替换掉。LFU策略基于“访问局部性”原理,认为最常被访问的数据更有可能在将来继续被访问,因此替换最不经常被访问的数据。但实现LFU策略需要维护数据的访问频率,可能带来更大的开销。

Caffeine
一个高性能、高命中率、接近最优的本地缓存,被称为”新一代缓存“或”现代缓存之王。

脱胎于Guava Cache , 结合LRU+LFU的优势,使用一种W-TinyLFU的算法结构

从Spring5开始,Caffeine将取代Guava Cache成为Spring默认的缓存组件

Caffeine是一个基于Java的内存缓存库,与其他缓存组件相比,它具有以下几个优势:

  1. 高性能:Caffeine被设计成高性能的缓存库,它使用了多种优化技术来提供快速的缓存访问,包括使用本地内存和原生数据结构,避免了不必要的开销。
  2. 低延迟:Caffeine的设计目标之一是提供低延迟的缓存访问。它采用了基于时间戳的缓存失效策略和预先加载机制,以减少对外部资源的依赖和等待时间。
  3. 强大的功能:Caffeine提供了丰富的功能,包括缓存过期、缓存加载、缓存刷新、缓存移除等。它支持异步加载和自定义缓存策略,可以根据具体需求进行灵活配置。
  4. 内存管理:Caffeine提供了细粒度的内存管理功能,可以设置缓存的最大大小、最大条目数、过期时间等。它还支持缓存的自动回收和大小基于权重的淘汰策略,可以有效地管理内存。
  5. 易于使用:Caffeine提供了简单易用的API,可以方便地创建和管理缓存。它还提供了详细的文档和示例代码,以帮助开发者快速上手和集成。

Caffeine在性能、延迟、功能和内存管理等方面都具有优势,适用于对缓存性能要求较高的场景。它可以作为Java应用程序的缓存解决方案,提供快速、可靠和灵活的缓存支持。

 

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

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

相关文章

ARM进阶:内存屏障(DMB/DSB/ISB)的20个使用例子详解

在上一节内存屏障指令之DMB、DSB和ISB详解中,介绍了一下内存屏障的三个指令的作用并举了一些例子,对于内存屏障指令的使用时机,与处理器架构(比如Cortex-M和Cortex-A)和处理器的系统实现(同样的架构,有不同的实现,如ST…

大厂必面:你们系统qps多少,怎么部署的?假设每天有几千万请求,该如何部署?

前言 在40岁老架构师 尼恩的读者社区(50)中,很多小伙伴要拿高薪,这就要面大厂、面架构,拿高薪。 在高级开发面试、大厂面试、架构师的面试过程中,常常会遇到下面的问题: 你们系统qps多少?怎么部署的&…

第三章 图论 No.4最小生成树的简单应用

文章目录 裸题:1140. 最短网络裸题:1141. 局域网裸题:1142. 繁忙的都市裸题:1143. 联络员有些麻烦的裸题:1144. 连接格点 存在边权为负的情况下,无法求最小生成树 裸题:1140. 最短网络 1140. 最…

【三极管双稳态电路】2022-3-5

缘由multisim仿真问题-嵌入式-CSDN问答

《算法竞赛·快冲300题》每日一题:“ 盲文文字编码”

《算法竞赛快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 盲…

《cuda c编程权威指南》05 - cuda矩阵求和

目录 1. 使用一个二维网格和二维块的矩阵加法 1.1 关键代码 1.2 完整代码 1.3 运行时间 2. 使用一维网格和一维块的矩阵加法 2.1 关键代码 2.2 完整代码 2.3 运行时间 3. 使用二维网格和一维块的矩阵矩阵加法 3.1 关键代码 3.2 完整代码 3.3 运行时间 1. 使用一个二…

==和equals():比较对象等不等?

引言: 在编程中,我们常常需要判断两个对象是否相等。而在Java中,有两种常用的方法:使用""运算符和调用equals()方法。这两个方法有什么区别呢?它们又有哪些有趣的应用呢?让我们一起来探索一下吧&…

RTT学习笔记12-KConfig 语法学习

KConfig 语法学习 RTT 官方教程 https://www.rt-thread.org/document/site/#/development-tools/build-config-system/Kconfig 我自己写的IIC配置 menuconfig BSP_USING_I2C # I2C 菜单bool "Enable I2C BUS" # 提示I2C 菜单default n # 默认不使能I2C 菜单…

第三章 图论 No.3 flody之多源汇最短路,传递闭包,最小环与倍增

文章目录 多源汇最短路:1125. 牛的旅行传递闭包:343. 排序最小环:344. 观光之旅345. 牛站 flody的四个应用: 多源汇最短路传递闭包找最小环恰好经过k条边的最短路 倍增 多源汇最短路:1125. 牛的旅行 1125. 牛的旅行 …

Camera之PhysicalCameraSettingsList/SurfaceMap/CameraMetadata/RequestList的关系(三十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

打开的idea项目maven不生效

方法一:CtrlshiftA(或者help---->find action), 输入maven, 点击add maven projects,选择本项目中的pom.xml配置文件,等待加载........ 方法二:view->tools windows->mave…

使用Python将Word文档转换为PDF的方法

摘要: 文介绍了如何使用Python编程语言将Word文档转换为PDF格式的方法。我们将使用python-docx和pywin32库来实现这个功能,这些库提供了与Microsoft Word应用程序的交互能力。 正文: 在现实生活和工作中,我们可能会遇到将Word文…

软考高级架构师——2、操作系统

一、进程管理 • 进程的状态(★) • 进程的同步与互斥(★★★★) 临界资源:诸进程间需要互斥方式对其进行共享的资源,如打印机、磁带机等 临界区:每个进程中访问临界资源的那段代码称为临界区…

ubuntu18.04 虚拟机与主机不通,虚拟机无法上网,导致无法git clone代码

问题前置:修改了固定ip。 虚拟机ip: 虚拟机设置NAT模式: 主机配置网络适配器:分配ipv4192.168.152.2保持与虚拟机的虚拟网关192.168.152.0,192.168.152.1在同一网段。虚拟机静态ip为192.168.152.146 虚拟机,网关&#…

【项目 线程4】3.12生产者消费者模型 3.13条件变量 3.14信号量 C++实现生产者消费者模型

3.12生产者消费者模型 生产者消费者模型中的对象: 1、生产者 2、消费者 3、容器 若容器已满,生产者阻塞在这,通知消费者去消费;若容器已空,则消费者阻塞,通知生产者去生产。生产者可以有多个,消…

供水管网漏损监测,24小时保障城市供水安全

供水管网作为城市生命线重要组成部分,其安全运行是城市建设和人民生活的基本保障。随着我国社会经济的快速发展和城市化进程的加快,城市供水管网的建设规模日益增长。然而,由于管网老化、外力破坏和不当维护等因素导致的供水管网漏损&#xf…

RabbitMQ的安装

RabbitMQ的安装 1、Windows环境下的RabbitMQ安装步骤 使用的版本:otp_win64_23.2 rabbitmq-server-3.8.16 版本说明:https://www.rabbitmq.com/which-erlang.html#compatibility-matrix 1.1 下载并安装erlang RabbitMQ 服务端代码是使用并发式语言…

8.5作业

要求实现AB进程对话 a.A进程先发送一句话给B进程&#xff0c;B进程接收后打印 b.B进程再回复一句话给A进程&#xff0c;A进程接收后打印 c.重复1.2步骤&#xff0c;当收到quit后&#xff0c;要结束AB进程 A进程 #include<stdio.h> #include<string.h> #include&…

Linux文本三剑客---grep、sed、awk

目录标题 1、grep1.1 命令格式1.2命令功能1.3命令参数1.4grep实战演练 2、sed2.1 认识sed2.2命令格式2.3常用选项options2.4地址定界2.5 编辑命令command2.6用法演示2.6.1常用选项options演示2.6.2地址界定演示2.6.3编辑命令command演示 3、awk3.1认识awk3.2常用命令选项3.3awk…

中国中医中药元宇宙 中药材价格缘何“狂飙”

◇相比去年同期&#xff0c;有超200个常规品种涨幅高于50%&#xff0c;25个常用大宗药材涨幅超200%&#xff0c;个别品种甚至涨价4至9倍 ◇在中药材价格普遍高涨的情况下&#xff0c;部分市场仓库库存数量也较多&#xff0c;出现囤积居奇倾向 ◇“不少游资和热钱涌入中药材市场…