【高性能缓存Redis_中间件】三、redis 精通:性能优化与生产实践
一、引言
在前两篇 Redis 消息队列的文章中,我们掌握了基础使用和高级特性。本文作为系列终篇,将聚焦生产环境的性能优化与全流程实践,请各位跟随小编的步伐一起构建高可靠、高性能的消息处理系统(文章中的演示均为Centos7的背景之上)。
二、CentOS 7 环境准备
2.1 安装 Redis
在 CentOS 7 系统中执行以下命令:
# 更新系统包
sudo yum update -y
# 安装 Redis
sudo yum install epel-release -y
sudo yum install redis -y
# 启动 Redis 服务
sudo systemctl start redis
# 设置开机自启
sudo systemctl enable redis
解释:
- 先安装 epel-release 扩展源,因为默认源中 Redis 版本可能较低。
- yum update 确保系统软件包为最新版本,systemctl 管理服务生命周期,start 启动服务,enable 设置开机自动运行。
2.2 配置优化
编辑 Redis 配置文件 /etc/redis.conf:
sudo vi /etc/redis.conf
关键配置修改:
# 绑定 IP(建议绑定内网 IP,避免公网暴露)
bind 192.168.1.100
# 设置密码(生产环境必备)
requirepass your_strong_password
# 开启 AOF 持久化(优先保证数据安全)
appendonly yes
# 调整内存限制(根据实际需求,例如 4GB)
maxmemory 4gb
# 内存淘汰策略(推荐 volatile-lru,淘汰设置过期的 key)
maxmemory-policy volatile-lru
修改后重启 Redis:
sudo systemctl restart redis
三、生产者性能优化
3.1 批量发送(pipeline)
脚本示例(producer_batch.sh)
#!/bin/bash
redis-cli -a your_strong_password << EOF
MULTI
RPUSH my_queue "message1"
RPUSH my_queue "message2"
RPUSH my_queue "message3"
EXEC
EOF
解释:
- -a 参数指定 Redis 密码。
- MULTI 和 EXEC 构成 Redis 的 pipeline 操作,将多个 RPUSH 命令批量执行,减少网络往返。
执行脚本
chmod +x producer_batch.sh
./producer_batch.sh
3.2 异步发送(async 模式)
Redis 6.0 引入 async 选项,允许客户端非阻塞发送:
redis-cli -a your_strong_password --ldb << EOF
RPUSH my_queue "async_message" ASYNC
EOF
解释:
- --ldb 进入伪交互模式(避免阻塞终端)。
- ASYNC 使命令立即返回,无需等待 Redis 确认写入。
四、消费者性能优化
4.1 多线程消费(Python 脚本)
安装 Python 3 及依赖
sudo yum install python3 -y
sudo yum install python3-pip -y
sudo pip3 install redis
脚本示例(consumer_multithread.py)
import redis
import threading # 连接 Redis
r = redis.Redis(host='192.168.1.100', port=6379, password='your_strong_password') def consume(): while True: message = r.lpop('my_queue') if message: print(f"消费消息: {message.decode('utf-8')}") else: break # 启动 3 个消费线程
threads = []
for _ in range(3): t = threading.Thread(target=consume) threads.append(t) t.start() for t in threads: t.join()
解释:
- threading.Thread 创建多线程并行消费。
- lpop 从队列左侧获取消息,避免竞争。
执行脚本
python3 consumer_multithread.py
4.2 长轮询优化
通过 BLPOP 实现阻塞式读取,减少空轮询开销:
redis-cli -a your_strong_password BLPOP my_queue 0
解释:
- BLPOP 阻塞等待队列有新消息,0 表示无限等待。
五、Redis 服务器性能调优
5.1 内存优化
监控内存使用
redis-cli -a your_strong_password INFO memory
关键指标:
- used_memory:已使用内存。
- mem_fragmentation_ratio:内存碎片率(理想值接近 1)。
碎片整理
redis-cli -a your_strong_password MEMORY PURGE
解释:
- 手动触发内存碎片整理(适用于空闲时段)。
5.2 持久化策略
AOF 重写
redis-cli -a your_strong_password BGREWRITEAOF
解释:
- 异步压缩 AOF 文件,减少磁盘占用。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
解释:
- 当 AOF 文件大小增长 100% 且超过 64MB 时,自动触发重写。
六、具体生产实践案例:电商订单系统
6.1 功能分析
1、生产者:用户下单后,订单数据通过 RPUSH 存入 order_queue。
2、消费者集群:多台服务器并行消费,处理库存扣减、支付通知。
3、持久化:开启 AOF 确保订单数据不丢失。
6.2 脚本实现
订单生成脚本(generate_order.sh)
#!/bin/bash
order_data='{"order_id": "12345", "user_id": "999", "product_id": "SKU001", "quantity": 2}'
redis-cli -a your_strong_password RPUSH order_queue "$order_data"
订单处理脚本(process_order.py)
import redis
import json r = redis.Redis(host='192.168.1.100', port=6379, password='your_strong_password') def process(): while True: message = r.lpop('order_queue') if message: order = json.loads(message.decode('utf-8')) print(f"处理订单: {order['order_id']}") # 模拟库存扣减逻辑 # 实际需调用库存服务接口 else: break if __name__ == "__main__": process()
七、监控与运维
7.1 监控工具
使用 redis-cli 监控
redis-cli -a your_strong_password INFO
集成 Prometheus + Grafana
安装 exporter:
wget https://github.com/oliver006/redis_exporter/releases/download/v1.6.0/redis_exporter-v1.6.0.linux-amd64.tar.gz
tar -xvf redis_exporter-v1.6.0.linux-amd64.tar.gz
./redis_exporter --redis.addr redis://:your_strong_password@192.168.1.100:6379
配置 Grafana:导入 Redis 监控模板(ID: 763)。
7.2 故障恢复
主从切换(手动)
1、提升从库为新主库:
redis-cli -a your_strong_password SLAVEOF NO ONE
2、重新配置其他从库指向新主库:
redis-cli -a your_strong_password SLAVEOF 192.168.1.101 6379
八、总结与概括
性能核心:
- 生产者:批量发送、异步模式。
- 消费者:多线程、长轮询。
- 服务器:内存优化、合理持久化。
生产建议:
- 开启 AOF 保证数据安全,定期重写。
- 部署哨兵(Sentinel)或集群(Cluster)实现高可用。
- 监控 used_memory、ops_per_sec 等核心指标。
通过本篇文章上述的 redis 实战,读者可将 Redis 消息队列深度应用于生产环境,实现高效、稳定的系统架构。至此,Redis 消息队列系列圆满收官,后续可探索与 Kafka、RabbitMQ 的对比实践,进一步拓展技术视野。
相关文章:
【高性能缓存Redis_中间件】三、redis 精通:性能优化与生产实践
一、引言 在前两篇 Redis 消息队列的文章中,我们掌握了基础使用和高级特性。本文作为系列终篇,将聚焦生产环境的性能优化与全流程实践,请各位跟随小编的步伐一起构建高可靠、高性能的消息处理系统(文章中的演示均为Centos7的背…...
自然语言处理Hugging Face Transformers
Hugging Face Transformers 是一个基于 PyTorch 和 TensorFlow 的开源库,专注于 最先进的自然语言处理(NLP)模型,如 BERT、GPT、RoBERTa、T5 等。它提供了 预训练模型、微调工具和推理 API,广泛应用于文本分类、机器翻…...
uniapp自定义tabbar,根据角色动态显示不同tabbar,无闪动问题
🤵 作者:coderYYY 🧑 个人简介:前端程序媛,目前主攻web前端,后端辅助,其他技术知识也会偶尔分享🍀欢迎和我一起交流!🚀(评论和私信一般会回!!) 👉 个人专栏推荐:《前端项目教程以及代码》 ✨一、前言 这个需求在开发中还是很常见的,搜索了网络其他教程,…...
狂神SQL学习笔记一:初识MySQL、关系型数据库和非关系型数据库
菜鸟教程学习一半了,但是已经疲倦了,所以换一个课程学习,来提升学习质量,可能会有很多已经学习到的地方,就当是复习巩固了。 按照SQL学习课程来划分,分为45集,所以可能也会写45篇文章ÿ…...
面向MoE和推理模型时代:阿里云大数据AI产品升级发布
阿里云 2025 AI 势能大会上,阿里云智能集团副总裁、阿里云智能计算平台事业部负责人汪军华带来主题演讲《范式演进:MoE&推理模型时代的挑战与应对》,并发布大数据 AI 平台一系列重磅产品能力升级。 汪军华认为,从 Generative …...
网络安全·第三天·ICMP协议安全分析
一、ICMP功能介绍 ICMP(Internet Control Message Protocal)是一种差错和控制报文协议,不仅用于传输差错报文, 还传输控制报文,但是ICMP只是尽可能交付,提供的服务是无连接、不可靠的,并不能保…...
Hadoop大数据平台部署(Hadoop3.2.4+Hive4.0.1)
这里写自定义目录标题 1、前置要求与规划2、基础环境配置3、Hadoop 3.2.4 集群部署4、MariaDB 10.6.x 安装(仅 master 节点)5、Hive 4.0.1 部署(仅 master 节点)6、Hive 离线数据预处理7、Sqoop导出预处理结果到MySQL 1、前置要求…...
JMeter使用
1.简介 1.1 打开方式 ①点击bat,打开 ②添加JMeter系统环境变量,输⼊命令jmeter即可启动JMeter⼯具 1.2 配置 简体中文 放大字体 1.3 使用 ①添加线程组 ②创建http请求 2. 组件 2.1 线程组 控制JMeter将⽤于执⾏测试的线程数,也可以把⼀个线程理解为⼀个测…...
API:科技赋能,引领智能文字识别、身份认证与发票查验真伪变革
在数字化进程不断加速的今天,各行业对高效、精准的数据处理和身份验证方式如饥似渴。 文字识别:精准捕捉,高效便捷 文字识别产品系列宛如一把把精准的信息采集利器,其中包含证件识别接口、车牌识别接口、文档识别接口、发票识别接…...
Docker 安装 Flink 实现数据实时统计 - 华为云
概述 案例介绍 Apache Flink 是一个开源的流处理框架,具有高吞吐、低延迟、可容错等特点,可同时支持批处理和流处理,为数据处理提供了强大而灵活的解决方案,Flink 在 Docker 中的应用场景主要是为了简化集群的部署和管理&#x…...
LeetCode算法题(Go语言实现)_46
题目 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。 另有一些以数组 queries 表示的问题,其中 querie…...
AJAX与Axios基础
目录 一、AJAX 核心概念解析 1.1 AJAX 的核心概念 1.2 AJAX 工作原理 1.3 AJAX 局限性 二、axios 库介绍 2.1 Axios 核心特性 2.2 快速上手 2.3 核心配置项 2.4 错误处理标准方案 三、Axios 核心配置项 3.1 常用核心配置项 1. url 2. method 3. params 4. data …...
CodeReview工具集合
codereview 工具集合 在现代软件开发中,代码审查(Code Review) 已成为保障代码质量和团队协作效率的关键流程。一个合适的 Code Review 工具,不仅能帮助团队发现潜在问题,还能促进知识共享与规范统一。 本文整理了一些…...
LeetCode算法题(Go语言实现)_45
题目 n 座城市,从 0 到 n-1 编号,其间共有 n-1 条路线。因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)。去年,交通运输部决定重新规划路线,以改变交通拥堵的状况…...
C++23 新特性:[[assume(expression)]] 属性
文章目录 语法与基本用法作用与优化原理使用注意事项未满足假设时的行为使用场景 示例代码总结 C23 引入了一个新的属性 [[assume(expression)]],它为程序员提供了一种向编译器传递额外信息的机制,从而让编译器能够生成更高效的代码。 语法与基本用法 …...
AI IDE 提示词
好的,这就将之前的分析内容整理成一篇适合发布在 CSDN 上的博客文章。 告别代码生成混乱:AI IDE 提示词模式权威指南 作者: (你的名字/昵称) 日期: 2025年4月14日 前言 随着人工智能技术的飞速发展,AI 助手(如 GitHub Copilot…...
Framework Binder架构分解
整个 Binder 架构所涉及的总共有以下 5 个目录: 1. /framework/base/core/java/(Java) 2. /framework/base/core/jni/ (JNI) 3,/framework/native/libs/binder (Native) 4,/framework/native/cmds/servicemanager/ (Native) 5,…...
三层交换机SVI功能(交换机虚拟接口)实现各个实训室电脑网络可互通,原本是独立局域网
三层交换机 SVI功能(交换机虚拟接口) 实现VLAN路由 需求 :各实训室使用独立局域网,即每个实训有自己的IP网段, 每个实训室只有内部互相访问。 需求:为了加强各实训室学生的交流,学校要求我们…...
Spark-SQL核心编程:DataFrame、DataSet与RDD深度解析
在大数据处理领域,Spark-SQL是极为重要的工具。今天就来深入探讨Spark-SQL中DataFrame、DataSet和RDD这三个关键数据结构。 Spark-SQL的前身是Shark,它摆脱了对Hive的过度依赖,在数据兼容、性能优化和组件扩展上有显著提升。DataFrame是基于R…...
腾讯云COS直传,官方后端demo,GO语言转JAVA
腾讯云COS直传,官方后端demo,GO写的,我们台是JAVA所以转一下,已跑通。废话不多说,直接上代码: Controller类如下: import com.ruoyi.web.core.config.CosConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.Ht…...
c语言坦克对战(前言)
实现C语言中的“坦克大战”游戏逻辑,可以按照以下步骤进行: 游戏初始化 定义游戏窗口:设置游戏窗口的大小和标题。加载资源:加载坦克、子弹、敌人等图像资源。初始化游戏状态:设置初始分数、生命值、坦克位置等。 游…...
空间信息可视化——WebGIS前端实例(一)
技术栈:原生HTML 源代码:CUGLin/WebGIS: This is a project of Spatial information visualization 4 全国贫困县可视化系统 4.1 系统设计思想 党的十九大报告明确指出,要“确保到2020年我国现行标准下农村贫困人口实现脱贫,贫困县全部摘帽,解决区域…...
JVM考古现场(十九):量子封神·用鸿蒙编译器重铸天道法则
楔子:代码鸿蒙劫 "警告!警告!昆仑山服务器集群出现量子纠缠现象!"凌霄殿监控中心警报响彻云霄。全息投影中,Java线程在四维时空中编织出克莱因瓶拓扑结构,GC日志里闪烁着霍金辐射般的奇点事件。本…...
思维与算法共舞:AIGC语言模型的艺术与科学
云边有个稻草人-个人主页 热门文章_云边有个稻草人的博客-本篇文章所属专栏~ 目录 引言:AIGC与文本生成概述 一、AIGC基础:语言模型的基本原理 1. 什么是语言模型? 2. 预训练与微调 二、AIGC的应用领域:文本生成的具体应用 …...
C++之 多继承
在学校里有老师和学生,他们都是人,我么应该创建一个名为 Person 的基类和两个名为 Teacher 和Student 的子类,后两者是从前者继承来的 有一部分学生还教课挣钱(助教),也就是同时存在着两个”是一个”关系&…...
AI模型的主要分类及其详细对比,涵盖任务类型、架构、数据需求、应用场景等维度,并附上典型代表模型
以下是 AI模型的主要分类及其详细对比,涵盖任务类型、架构、数据需求、应用场景等维度,并附上典型代表模型: 一、AI模型的主要分类 1. 按任务类型分类 分类定义特点代表模型应用场景推理模型专注于逻辑推理、问题解决、因果关系分析的模型…...
TypeScript 快速入门
TypeScript 快速入门 1. 初识 TypeScript 1.1 TS 是什么? 以 JavaScript 为基础构建的语言;一个 JavaScript 的超集;可以在任何支持 JavaScript 的平台执行;TypeScript 扩展了 JavaScript 并添加了类型;TS 不能被 J…...
第一章 计算机网络和因特网
1.1 什么是因特网(Internet) 在博客这一系列文章中,我们使用一种特定的计算机网络,即公共因特网作为讨论计算机网络及其协议的主要载体。什么是因特网?可以用两种方式来回答这个问题:其一,我们能够通过因特网的具体构…...
【uni-app】axios 报错:Error: Adapter ‘http‘ is not available in the build
在 uni-app 中使用 axios 会报错:Error: Adapter ‘http‘ is not available in the build 解决方法:为 axios 添加 adapter 适配器。 import axios from axios; import settle from ../../node_modules/axios/lib/core/settle; import buildURL from …...
【路由交换方向IE认证】BGP选路原则之Weight属性
文章目录 一、路由器BGP路由的处理过程控制平面和转发平面选路工具 二、BGP的选路顺序选路的前提选路顺序 三、Wight属性选路原则规则9与规则11的潜移默化使用Weight值进行选路直接更改Weight值进行选路配合使用route-map进行选路 四、BGP邻居建立配置 一、路由器BGP路由的处理…...
思科模拟器的单臂路由,交换机,路由器,路由器只要两个端口的话,连接三台电脑该怎么办,划分VLAN,dotlq协议
单臂路由 1. 需求:让三台电脑互通 2. 在二层交换机划分vlan,并加入; 3. 将连接二层交换机和路由器的端口f0/4改为trunk模式 4. 路由器:进入连接路由器的f0/0端口将端口开启 5. 进入每个vlan设dotlq协议并设网络IP(…...
计算机视觉与深度学习 | 基于Matlab的钢筋计数
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 基于Matlab的钢筋计数 1、引言2、方法设计2.1 整体流程2.2 关键技术2…...
Pytorch深度学习框架60天进阶学习计划 - 第41天:生成对抗网络进阶(三)
Pytorch深度学习框架60天进阶学习计划 - 第41天:生成对抗网络进阶(三) 7. 实现条件WGAN-GP # 训练条件WGAN-GP def train_conditional_wgan_gp():# 用于记录损失d_losses []g_losses []# 用于记录生成样本的多样性(通过类别分…...
MySQL 用 limit 影响性能的优化方案
一.使用索引覆盖扫描 如果我们只需要查询部分字段,而不是所有字段,我们可以尝试使用索引覆盖扫描,也就是让查询所需的所有字段都在索引中,这样就不需要再访问数据页,减少了随机 I/O 操作。 例如,如果我们…...
粉末冶金齿轮学习笔记分享
有一段小段时间没有更新了,不知道小伙们有没有忘记我。最近总听到粉末冶金齿轮这个概念,花点时间来学习一下,总结一篇笔记分享给大家。废话不多说,直接开始: “粉末冶金”是一种制造工艺,包括在高压下压实…...
数据结构第五版【李春葆】
数据结构教程上机实验指导第5版(李春葆主编).pdf 数据结构教程(第5版)(李春葆).pdf 数据结构教程(第五版)课后习题参考答案(李春葆).pdf 数据结构教…...
深入解析区块链技术:原理、应用与未来展望
1 区块链技术原理 1.1 基本概念 区块链本质上是一个分布式账本,它由一系列按照时间顺序排列的数据块组成,每个数据块包含了一定时间内的交易信息。这些数据块通过密码学技术相互链接,形成一个不可篡改的链条。其核心特点包括去中心化、不可篡…...
SAX解析XML:Java程序员的“刑侦破案式“数据处理
各位XML侦探们!今天我们要化身代码界的福尔摩斯,学习用SAX解析XML——这种一边读文件一边破译线索的技术,就像在凶案现场逐帧查看监控录像,内存占用比你的咖啡杯还小!(DOM解析?那叫把整个监控室…...
Spring - 13 ( 11000 字 Spring 入门级教程 )
一: Spring AOP 备注:之前学习 Spring 学到 AOP 就去梳理之前学习的知识点了,后面因为各种原因导致 Spring AOP 的博客一直搁置。。。。。。下面开始正式的讲解。 学习完 Spring 的统一功能后,我们就进入了 Spring AOP 的学习。…...
SQL 解析 with as dual sysdate level
目录 sql的运行顺序 with as EXTRACT 编辑 dual sysdate level 编辑 编辑 Oracle中的日期存储 核心部分 拆解字符串并计算最小值 关联子查询 NVL 函数 REGEXP_SUBSTR() sql的运行顺序 <select id"getTrendList" parameterType"java.util.H…...
苍穹外卖day03
店铺状态接口 引入Redis,因为像存储店铺状态这种只有一个字段(没必要存储在数据库),且登录后台就要被访问的数据(加快查询速度,减少数据库压力) 使用步骤:导入相关maven依赖、配置…...
精品整理 | 云安全知识证书 (CCSK) v5 备考学习资源汇总
云安全知识证书 (CCSK) v5 备考学习资源,包含课件、视频、习题及CSA学习指南,共12章。 1.云计算的概念和架构 2.云治理 3.风险、审计与合规 4.组织管理 5.身份和访问管理 6.云安全监控 7.云基础设施和网络安全 8.云工作负载安全 9.云数据安全 10.云应用…...
编程思想——FP、OOP、FRP、AOP、IOC、DI、MVC、DTO、DAO
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
使用SSH开通Linux服务器账号
文章目录 1. 通过SSH连接到服务器2. 创建账号3. 将用户设置为管理员(可选)4. 设置SSH登录权限(可选)(1)切换到该用户目录(2)创建.ssh目录并设置适当的权限 1. 通过SSH连接到服务器 …...
【C++】内存分配与释放、内存碎片、内存泄漏、栈溢出
C内存分配方式 内存分配方式区别 特性 静态分配 栈分配 堆分配 分配时机 编译期 函数调用时 运行期(new) 释放方式 自动释放 函数结束自动释放 手动delete释放 内存区域 静态存储区 栈 堆(自由存储区) 大小灵活性…...
论文:Generalized Category Discovery with Large Language Models in the Loop
论文下载地址:Generalized Category Discovery with Large Language Models in the Loop - ACL Anthology 1、研究背景 尽管现代机器学习系统在许多任务上取得了优异的性能,绝大多数都遵循封闭世界的设置,假设训练和测试数据来自同一组预定义…...
k8s亲和力和非亲和力
在 Kubernetes 中,亲和力(Affinity)和非亲和力(Anti-Affinity)是用于控制 Pod 调度策略的机制,它们可以帮助优化资源利用率、提高应用性能和可用性。以下是亲和力和非亲和力的详细解释: 亲和力…...
Redis几个基本的全局指令
目录 1.set和get 2.keys 3.exists 4.del 5.expire 6.ttl 7.type 我们都知道Redis存的内容都是键值对,key是String,value有很多类型,像string(字符串),hash(哈希),…...
Flutter中如何判断一个计算任务是否耗时?
在 Flutter 里,判断一个计算任务是否耗时可从以下几个角度着手: 1. 任务复杂度分析 数学运算复杂度:依据算法的时间复杂度来初步判断。例如,简单的加法、乘法运算时间复杂度为 O ( 1 ) O(1) O(1),这类任务通常不耗时…...
LeetCode面试热题150中6-11题学习笔记(用Java语言描述)
Day 02 6、轮转数组 需求:给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 方法一 核心思想 使用额外的数组来将每个元素放至正确的位置。用 n 表示数组的长度,遍历原数组,将原数组下标…...