Redis最佳实践——性能优化技巧之监控与告警详解
Redis 在电商应用的性能优化技巧之监控与告警全面详解
一、监控体系构建
1. 核心监控指标矩阵
指标类别 | 关键指标 | 计算方式/说明 | 健康阈值(参考值) |
---|---|---|---|
内存相关 | used_memory | INFO Memory 获取 | 不超过 maxmemory 的 80% |
mem_fragmentation_ratio | 内存碎片率 = used_memory_rss / used_memory | 1.0-1.5 | |
命中率 | keyspace_hits | INFO Stats 获取 | > 98% |
keyspace_misses | 缓存命中率 = hits / (hits + misses) | ||
延迟监控 | instantaneous_ops_per_sec | 每秒操作数 | 根据业务基准值 ±30% |
latency_percentiles_usec | P50/P95/P99 延迟(微秒) | P99 < 10ms | |
连接数 | connected_clients | 当前连接数 | < maxclients 的 70% |
rejected_connections | 被拒绝连接数 | 持续 >0 需告警 | |
持久化 | rdb_last_bgsave_status | 最近 RDB 状态 | 必须为 ok |
aof_current_size | AOF 文件大小 | 监控增长率 | |
主从复制 | master_link_status | 主从连接状态 | 必须为 up |
master_sync_in_progress | 同步进行中 | 持续 1 需检查 |
2. 监控数据采集方案
// 使用 Jedis 采集指标示例
public class RedisMetricsCollector {private JedisPool jedisPool;public Map<String, Object> collectMetrics() {try (Jedis jedis = jedisPool.getResource()) {String info = jedis.info();Map<String, Object> metrics = parseInfo(info);// 补充自定义指标metrics.put("custom.command_latency", jedis.time().get(0));return metrics;}}private Map<String, Object> parseInfo(String info) {// 解析 INFO 命令返回数据return Arrays.stream(info.split("\r\n")).filter(line -> line.contains(":")).collect(Collectors.toMap(line -> line.split(":")[0],line -> line.split(":")[1]));}
}
二、告警策略设计
1. 多级告警触发规则
告警级别 | 触发条件示例 | 响应动作 |
---|---|---|
紧急 | 内存使用率 >95% 持续 1分钟 | 1. 自动触发内存分析 2. 短信通知值班人员 |
重要 | 主从复制延迟 >5分钟 | 1. 自动切换从节点 2. 邮件通知技术主管 |
警告 | 命中率 <90% 持续 30分钟 | 1. 生成缓存分析报告 2. 企业微信通知 |
2. 波动性告警算法
// 基于指数加权移动平均的异常检测
public class EWMAAlert {private double alpha = 0.3; // 平滑系数private Double prevAvg;public boolean checkAnomaly(double currentValue) {if (prevAvg == null) {prevAvg = currentValue;return false;}double newAvg = alpha * currentValue + (1 - alpha) * prevAvg;boolean isAnomaly = Math.abs(currentValue - prevAvg) > 3 * calculateStdDev();prevAvg = newAvg;return isAnomaly;}
}
3. 预测性告警配置
# Prometheus 预测规则示例
- record: redis:memory_usage_predictionexpr: predict_linear(redis_memory_used_bytes[1h], 3600 * 2)- alert: RedisMemoryWillFullexpr: redis:memory_usage_prediction > redis_config_maxmemory * 0.9for: 10mlabels:severity: criticalannotations:summary: "Redis内存将在2小时内达到上限"
三、监控工具整合
1. 全链路监控架构
2. 关键监控面板配置
内存分析面板(Grafana):
- 内存使用趋势图
- 大Key Top10(通过
redis-cli --bigkeys
定期扫描) - 内存碎片率变化曲线
命令分析面板:
- 每秒操作类型分布
- 慢查询(>10ms)统计
- Pipeline使用效率分析
四、Java 应用层监控
1. 客户端监控埋点
// 使用 Lettuce 的 CommandLatencyTracker
public class LatencyMonitor implements CommandLatencyTracker {@Overridepublic void recordCommandLatency(CommandLatencyId latencyId, long firstResponseLatency,long completionLatency) {Metrics.timer("redis.command.latency", "command", latencyId.commandType().name()).record(completionLatency, TimeUnit.NANOSECONDS);}
}// 初始化配置
RedisClient client = RedisClient.create();
client.setOptions(ClientOptions.builder().autoReconnect(true).pingBeforeActivateConnection(true).build());
client.getResources().setCommandLatencyTracker(new LatencyMonitor());
2. Spring Boot 健康检查
@Configuration
public class RedisHealthConfig {@Beanpublic RedisHealthIndicator redisHealthIndicator(RedisConnectionFactory factory) {return new RedisHealthIndicator(factory) {@Overrideprotected void doHealthCheck(Health.Builder builder) {Properties info = getConnection(factory).info();builder.up().withDetail("version", info.getProperty("redis_version")).withDetail("memory", info.getProperty("used_memory_human"));}};}
}
五、日志分析与告警
1. 慢查询日志配置
# redis.conf 配置
slowlog-log-slower-than 10000 # 10ms
slowlog-max-len 1000
2. ELK 日志告警规则
// Logstash Grok 解析规则
filter {grok {match => { "message" => "\[%{INT:pid}\] %{NUMBER:timestamp} \[%{INT:db}\] %{WORD:command} %{DATA:key}" }}if [command] =~ /GET|SET/ {metrics {meter => "redis_commands"add_tag => "metric"}}
}
3. 自定义告警规则
# 慢查询告警
GET redis-slowlog-*/_search
{"query": {"range": {"duration": {"gte": 10000000 # 10ms}}}
}
六、实战优化案例
案例1:热点Key导致负载不均
现象:某个商品详情页Key的QPS达到10万+
解决方案:
- 使用本地缓存(Caffeine)+ Redis二级缓存
- 监控Key访问频率:
redis-cli --hotkeys
- 告警规则:单个Key QPS > 5000触发告警
案例2:大Value导致网络阻塞
检测方法:
public void checkBigKeys(Jedis jedis) {String result = jedis.memoryUsage("key");if (Long.parseLong(result) > 1024 * 1024) { // 1MBalertService.trigger("BIG_KEY_ALERT");}
}
案例3:Pipeline优化批量操作
public List<Object> batchGet(List<String> keys) {try (Jedis jedis = jedisPool.getResource()) {Pipeline pipeline = jedis.pipelined();keys.forEach(pipeline::get);return pipeline.syncAndReturnAll();}
}// 监控指标:pipeline.batch.size > 50 触发优化建议
七、告警处理 SOP(标准操作流程)
内存告警处理流程:
- 立即检查
INFO MEMORY
输出 - 使用
redis-cli --bigkeys
分析大Key - 检查
OBJECT ENCODING key
优化数据结构 - 必要时动态调整maxmemory
- 验证碎片率是否正常
- 执行
MEMORY PURGE
(Redis 4.0+)
高延迟处理流程:
- 分析
SLOWLOG GET 25
- 检查
CONFIG GET slowlog-log-slower-than
- 使用
redis-cli --latency
测试基线延迟 - 检查客户端连接池配置
- 分析是否达到带宽瓶颈
八、高级监控技巧
1. 动态追踪技术
# 使用 perf 分析 Redis 内核
perf record -p $(pidof redis-server) -g -- sleep 30
perf report --stdio# 监控系统调用
strace -ttt -p $(pidof redis-server) -c -o /tmp/strace.out
2. 容量预测模型
# 基于历史数据的 ARIMA 预测
from statsmodels.tsa.arima_model import ARIMAmodel = ARIMA(history_data, order=(5,1,0))
model_fit = model.fit(disp=0)
forecast = model_fit.forecast(steps=7)[0]
3. 混沌工程测试
// 使用 Chaos Monkey 注入故障
@ChaosTest
public void testRedisFailover() {chaos.killMasterNode();assertThat(client.get("key")).isNull(); chaos.restoreCluster();
}
通过以上全方位的监控与告警体系建设,电商系统可以达成:
- 99.95% 的 Redis 可用性
- P99 延迟控制在 10ms 以内
- 内存异常发现时间 < 1分钟
- 故障平均恢复时间(MTTR)< 5分钟
实际生产环境中,建议结合 APM 工具(如 SkyWalking、PinPoint)实现全链路监控,并与 CI/CD 流程集成,实现监控即代码(Monitoring as Code)。
更多资源:
https://www.kdocs.cn/l/cvk0eoGYucWA
本文发表于【纪元A梦】
相关文章:

Redis最佳实践——性能优化技巧之监控与告警详解
Redis 在电商应用的性能优化技巧之监控与告警全面详解 一、监控体系构建 1. 核心监控指标矩阵 指标类别关键指标计算方式/说明健康阈值(参考值)内存相关used_memoryINFO Memory 获取不超过 maxmemory 的 80%mem_fragmentation_ratio内存碎片率 used_m…...

R3GAN训练自己的数据集
简介 简介:这篇论文挑战了"GANs难以训练"的广泛观点,通过提出一个更稳定的损失函数和现代化的网络架构,构建了一个简洁而高效的GAN基线模型R3GAN。作者证明了通过合适的理论基础和架构设计,GANs可以稳定训练并达到优异…...
MATLAB实战:Arduino硬件交互项目方案
以下是一个使用MATLAB与Arduino进行硬件交互的项目方案,涵盖传感器数据采集和执行器控制。本方案使用MATLAB的Arduino硬件支持包,无需额外编写Arduino固件。 系统组成 硬件: Arduino Uno 温度传感器(如LM35) 光敏电…...
bert扩充或者缩小词表
在BERT模型中添加自己的词汇(pytorch版) - 知乎 输入 1. 扩充词表 替换bert词表中的【unused】 2. 缩小词表 因为要使用预训练的模型,词id不能变,词向量矩阵大小不变 要做的是将减少的那一部分词全部对应为unk,即可…...
什么是 TOML?
🛠 Rust 配置文件实战:TOML 语法详解与结构体映射( 在 Rust 中,Cargo.toml 是每个项目的心脏。它不仅定义了项目的名称、版本和依赖项,还使用了一种轻巧易读的配置语言:TOML。 本文将深入解析 TOML 的语法…...
git怎么合并两个分支
git怎么合并分支代码 注意: 第一步你得把当前分支合到远程分支去才能有下面的操作 另外我是将develop分支代码合并到release分支去 git 命令 查看本地所有分支 git branch切换分支 例如切换到release分支 git checkout release拉取代码 git pull up release 合并分支 …...
1.文件操作相关的库
一、filesystem(C17) 和 fstream 1.std::filesystem::path - cppreference.cn - C参考手册 std::filesystem::path 表示路径 构造函数: path( string_type&& source, format fmt auto_format ); 可以用string进行构造,也可以用string进行隐式类…...
Pytorch中一些重要的经典操作和简单讲解
Pytorch中一些重要的经典操作和简单讲解: 形状变换操作 reshape() / view() import torchx torch.randn(2, 3, 4) print(f"原始形状: {x.shape}")# reshape可以处理非连续张量 y x.reshape(6, 4) print(f"reshape后: {y.shape}")# view要求…...

【容器docker】启动容器kibana报错:“message“:“Error: Cannot find module ‘./logs‘
说明: 1、服务器数据盘挂了,然后将以前的数据用rsync拷贝过去,启动容器kibana服务,报错信息如下图所示: 2、可能是拷贝docker文件夹,有些文件没有拷贝过去,导致无论是给文件夹授权用户kibana或者…...
基于bp神经网络的adp算法
基于BP神经网络的ADP(自适应动态规划)小程序的MATLAB实现示例。这个小程序包含Actor网络和Critic网络,用于解决优化问题。 MATLAB代码示例 % 基于BP神经网络的ADP小程序 % 包含Actor网络和Critic网络% 定义网络结构 inputSize 2; % 输入层…...

C#里与嵌入式系统W5500网络通讯(4)
怎么样修改W5500里的socket收发缓冲区呢? 需要进行下面的工作,首先要了解socket缓冲区的作用,接着了解缓冲区的硬件资源, 最后就是要了解自己的需求,比如自己需要哪个socket的收发送缓冲区多大。 硬件的寄存器为: 这是 W5500 数据手册中关于 Sn_RXBUF_SIZE(Socket n …...

Spring boot集成milvus(spring ai)
服务器部署Milvus Run Milvus with Docker Compose (Linux) milvus版本可在docker-compose.yml中进行image修改 启动后,docker查看启动成功 spring boot集成milvus 参考了这篇文章 Spring AI开发RAG示例,理解RAG执行原理 但集成过程中遇到了一系列…...

Visual Studio+SQL Server数据挖掘
这里写自定义目录标题 工具准备安装Visual studio 2017安装SQL Server安装SQL Server Management Studio安装analysis service SSMS连接sql serverVisual studio新建项目数据源数据源视图挖掘结构部署模型设置挖掘预测 部署易错点 工具准备 Visual studio 2017 analysis servi…...
maven项目编译时复制xml到classes目录方案
maven项目编译时复制xml到classes目录方案 <resources><resource><!-- xml放在java目录下 --><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources…...

通过阿里云服务发送邮件
通过阿里云服务发送邮件 1. 整体描述2. 方案选择2.1 控制台发送2.2 API接口接入2.3 SMTP接口接入2.4 结论 3. 前期工作3.1 准备工作3.2 配置工作3.3 总结 4. 收费模式4.1 免费额度4.2 资源包4.3 按量付费 5. Demo开发5.1 选择SMTP服务器5.2 pom引用5.3 demo代码5.4 运行结果 6 …...

Vad-R1:通过从感知到认知的思维链进行视频异常推理
文章目录 速览摘要1 引言2 相关工作视频异常检测与数据集视频多模态大语言模型具备推理能力的多模态大语言模型 3 方法:Vad-R13.1 从感知到认知的思维链(Perception-to-Cognition Chain-of-Thought)3.2 数据集:Vad-Reasoning3.3 A…...

黑马Java面试笔记之MySQL篇(事务)
一. 事务的特性 事务的特性是什么?可以详细说一下吗? 事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失…...

群辉(synology)NAS老机器连接出现网页端可以进入,但是本地访问输入一样的账号密码是出现错误时解决方案
群辉(synology)NAS老机器连接出现网页端可以进入,但是本地访问输入一样的账号密码是出现错误时解决方案 老机器 装的win7 系统 登入后端网页端的时候正常,但是本地访问登入时输入登入网页端一样的密码时候出现问题解决方案 1.登…...
C++多重继承详解与实战解析
#include <iostream> using namespace std; //基类,父类 class ClassA { public:void displayA() {std::cout << "Displaying ClassA" << std::endl;}void testFunc(){std::cout << "testFunc ClassA" << std::e…...

【深度学习】实验四 卷积神经网络CNN
实验四 卷积神经网络CNN 一、实验学时: 2学时 二、实验目的 掌握卷积神经网络CNN的基本结构;掌握数据预处理、模型构建、训练与调参;探索CNN在MNIST数据集中的性能表现; 三、实验内容 实现深度神经网络CNN。 四、主要实验步…...

实现一个免费可用的文生图的MCP Server
概述 文生图模型为使用 Cloudflare Worker AI 部署 Flux 模型,是参照视频https://www.bilibili.com/video/BV1UbkcYcE24/?spm_id_from333.337.search-card.all.click&vd_source9ca2da6b1848bc903db417c336f9cb6b的复现Cursor MCP Server实现是参照文章https:/…...
无公网ip远程桌面连接不了怎么办?内网计算机让外网访问方法和问题分析
无公网IP时,可以通过内网穿透技术实现远程桌面连接。 具体方法包括使用 NAT123 或类似端口映射软件将内网IP和端口映射到公网域名和端口上。用户需要在本地安装NAT123客户端,并登录添加设置映射,将内网的远程桌面连接IP和3389端口映射到一…...

【手搓一个原生全局loading组件解决页面闪烁问题】
页面闪烁效果1 页面闪烁效果2 封装一个全局loading组件 class GlobalLoading extends HTMLElement {constructor() {super();this.attachShadow({ mode: open });}connectedCallback() {this.render();this.init();}render() {this.shadowRoot.innerHTML <style>.load…...

CSS基础巩固-基础-选择
目录 CSS是如何工作的? 当浏览器遇到无法解析的CSS代码时 如何导入CSS样式? 改变元素的默认样式 选择 前缀符号(后面会具体介绍) 优先级 同时应用样式到多个类上 属性选择器 伪类 伪元素 关系选择器 后代选择器 子代…...

一种在SQL Server中传递多行数据的方法
这是一种比较偷懒的方法,其实各种数据库对Json 支持的很好。sql server 、oracle都不错。所以可以直接传json declare 这是一个json varchar(max) set 这是一个json{"data":[{"code":"1","name":"啥1"},{"…...

【Docker 从入门到实战全攻略(一):核心概念 + 命令详解 + 部署案例】
1. 是什么 Docker 是一个用于开发、部署和运行应用程序的开源平台,它使用 容器化技术 将应用及其依赖打包成独立的容器,确保应用在不同环境中一致运行。 2. Docker与虚拟机 2.1 Docker(容器化) 容器化是一种轻量级的虚拟化技术…...

github 提交失败,连接不上
1. 第一种情况,开了加速器,导致代理错误 删除hosts文件里相关的github代理地址 2. 有些ip不支持22端口连接,改为443连接 ssh -vT gitgithub.com // 命令执行结果 OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2 debug1: C…...

系统架构设计师(一):计算机系统基础知识
系统架构设计师(一):计算机系统基础知识 引言计算机系统概述计算机硬件处理器处理器指令集常见处理器 存储器总线总线性能指标总线分类按照总线在计算机中所处的位置划分按照连接方式分类按照功能分类 接口接口分类 计算机软件文件系统文件类…...
VMware安装Ubuntu全攻略
VMware安装Ubuntu实战分享大纲 准备工作 列出安装前的必要条件和工具,包括硬件要求、软件下载链接等。 VMware Workstation Pro/Player的安装与激活Ubuntu镜像文件下载(官方推荐版本)确保主机系统满足虚拟化技术(VT-x/AMD-V)要求创建虚拟机 详细描述在VMware中创建新虚…...

清理 pycharm 无效解释器
1. 起因, 目的: 经常使用 pycharm 来调试深度学习项目,每次新建虚拟环境,都是显示一堆不存在的名称,删也删不掉。 总觉得很烦,是个痛点。决定深入研究一下。 2. 先看效果 效果是能行,而且清爽多了。 3. …...