【高性能缓存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的背…...
jupyter notebook 无法启动- markupsafe导致
一、运行jupyter notebook和Spyder报错:(已安装了Anaconda,以前可打开) 1.背景:为了部署机器学习模型,按教程直接安装了flask 和markupsafe,导致jupyter notebook,Spyder 打不开。 pip install flas…...
Kotlin作用域函数
在 Kotlin 中,.apply 是一个 作用域函数(Scope Function),它允许你在一个对象的上下文中执行代码块,并返回该对象本身。它的设计目的是为了 对象初始化 或 链式调用 时保持代码的简洁性和可读性。 // 不使用 apply va…...
设计模式:工厂方法模式 - 高扩展性与低耦合的设计之道
一、为什么需要工厂方法模式? 在软件开发中,对象创建与使用耦合会影响系统的灵活性和扩展性。以通知系统(支持邮件通知、短信通知和推送通知)为例 :直接实例化。 Notification email new EmailNotification(); Noti…...
CTF web入门之命令执行 完整版
web29 文件名过滤 由于flag被过滤,需要进行文件名绕过,有以下几种方法: 1.通配符绕过 fla?.* 2.反斜杠绕过 fl\ag.php 3.双引号绕过 fl’‘ag’.php 还有特殊变量$1、内联执行等 此外 读取文件利用cat函数,输出利用system、passthru 、echo echo `nl flag.php`; ec…...
自然语言处理spaCy
spaCy 是一个流行的开源 自然语言处理(NLP) 库,专注于 高效、易用和工业化应用。它由 Explosion AI 开发,广泛应用于文本处理、信息提取、机器翻译等领域。 zh_core_web_sm 是 spaCy 提供的一个小型中文预训练语言模型࿰…...
在spark中,窄依赖算子map和filter会组合为一个stage,这种情况下,map和filter是在一个task内进行的吗?
在 Spark 中,当 map 和 filter 这类窄依赖(Narrow Dependency)的算子连续应用时,它们会被合并到同一个 Stage 中,并且在同一个 Task 内按顺序执行。这种优化称为 流水线(Pipeline)执行ÿ…...
MySQL切换PolarDB-X方案
一、DTS 增量同步完成后的流量切换策略 1. 切换期间的数据写入处理 • 场景:DTS 增量同步完成(Lag0)后,业务流量切换到 PolarDB-X 的瞬间可能产生 2-3 秒延迟,导致部分订单仍写入 MySQL。 • 解决方案: ◦…...
Java 开发工具:从 Eclipse 到 IntelliJ IDEA 的进化之路
Java 开发工具:从 Eclipse 到 IntelliJ IDEA 的进化之路 在 Java 开发的历史长河中,开发工具的演变不仅改变了程序员的编码方式,也深刻影响了整个行业的开发效率和代码质量。从 Eclipse 到 IntelliJ IDEA,这不仅是工具的更替&…...
GPT - 2 文本生成任务全流程
数据集下载 数据预处理 import json import pandas as pdall_data []with open("part-00018.jsonl",encoding"utf-8") as f:for line in f.readlines():data json.loads(line)all_data.append(data["text"])batch_size 10000for i in ran…...
红宝书第四十三讲:基于资料的数据可视化工具简单介绍:D3.js 与 Canvas绘图
红宝书第四十三讲:基于资料的数据可视化工具简单介绍:D3.js 与 Canvas绘图12 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、D3.js:数据驱动文档的王者 1 核心特性&#x…...
UI基础(1)
quit和close的区别: driver.close():关闭当前正在使用的窗口。 1、如果你的当前浏览器窗口只有一个情况下,它就会关闭窗口并且关闭浏览器 2、如果你的当前浏览器窗口有多个的情况下,它就会关闭driver驱动焦点所在的窗口 driver.quit():真正关闭浏览器(把所有的窗口都关闭…...
深入理解 Vue 的数据代理机制
何为数据代理? 通过一个对象代理对另一个对象中的属性的操作(读/写),就是数据代理。 要搞懂Vue数据代理这个概念,那我们就要从Object.defineProperty()入手 Object.defineProperty()是Vue中比较底层的一个方法&…...
封装,继承,多态(续)
在Java中,最基础的三原则无疑是封装,继承,多态 对于这三类,最基本同样最重要,我们是会经常遇到的,在编程中,会使用,但在考试中还有一定的不理解。 对于这点,我在这里进…...
Java excel导入/导出导致内存溢出问题,以及解决方案
excel导入/导出导致内存溢出问题,以及解决方案 1、内存溢出问题导入功能重新修正,采用SAX的流式解析数据。并结合业务流程。导出功能:由于精细化了业务流程,导致比较代码比较冗杂,就只放出最简单的案例。 1、内存溢出问…...
10 个最新 CSS 功能已在所有主流浏览器中得到支持
前言 CSS 不断发展,新功能使我们的工作更快、更简洁、更强大。得益于最新的浏览器改进(Baseline 2024),许多新功能现在可在所有主要引擎上使用。以下是您可以立即开始使用的10 CSS新功能。 1. Scrollbar-Gutter 和 Scrollbar-Co…...
思科模拟器的单臂路由,交换机,路由器,路由器只要两个端口的话,连接三台电脑该怎么办,划分VLAN,dotlq协议
单臂路由 1. 需求:让三台电脑互通 2. 在二层交换机划分vlan,并加入; 3. 将连接二层交换机和路由器的端口f0/4改为trunk模式 4. 路由器:进入连接路由器的f0/0端口将端口开启 5. 进入每个vlan设dotlq协议并设网络IP(…...
14 nginx 的 dns 缓存的流程
前言 这个是 2020年11月 记录的这个关于 nginx 的 dns 缓存的问题 docker 环境下面 前端A连到后端B 前端B连到后端A 最近从草稿箱发布这个问题的时候, 重新看了一下 发现该问题的记录中仅仅是 定位到了 nginx 这边的 dns 缓存的问题, 但是 并没有到细节, 没有到 具体的 n种…...
实战教程:使用JetBrians Rider快速部署与调试PS5和Xbox上的UE项目
面向主机游戏开发者的重大新闻!在2024.3版本中,JetBrains Rider 增加了对 PlayStation5 和 Xbox 游戏主机的支持,您可以直接在您喜欢的游戏主机上构建、部署和调试 Unreal Engine 和自定义游戏引擎。 JetBrains Rider现在支持主机游戏开发&am…...
大型语言模型中中医知识的多模态基准数据集
下载链接: https://github.com/pariskang/ZhongJing-OMNI https://github.com/pariskang/ZhongJing-OMNI 下载链接 https://github.com/pariskang/ZhongJing-OMNI.git 链接失效反馈 资源简介: ZhongJing-OMNI是第一个用于评估大型语言模型中中医知…...
专题十五:动态路由——BGP
一、BGP的基本概念 BGP(Border Gateway Protocol,边界网关协议)是一种用于在不同自治系统(AS)之间交换路由信息的外部网关协议(EGP)。通过TCP179端口建立连接。目前采用BGP4版本,IP…...
Linux命令-vim编辑
用vi或vim命令进入vim编辑器。 基础: u 撤销上一次操作。x剪切当前光标所在处的字符。yy复制当前行。dd剪切当前行。p粘贴剪贴板内容到光标下方。i切换到输入模式,在光标当前位置开始输入文本。:wq保存并退出Vim 编辑器。:q!不保存强制退出Vim 编辑器。 拓展: w光…...
hive数仓要点总结
1.OLTP和OLAP区别 OLTP(On-Line Transaction Processing)即联机事务处理,也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用…...
一款安全好用的企业即时通讯平台,支持统一门户
在数字化转型的浪潮中,企业面临着信息孤岛、系统分散、协作低效等诸多挑战。BeeWorks作为一款专为企业打造的数字化底座平台,凭借其强大的企业内部应用集成能力和单点登录功能,正在成为企业数字化转型的有力推手。 数字化底座平台࿱…...
git安装(windows)
通过网盘分享的文件:资料(1) 链接: https://pan.baidu.com/s/1MAenYzcQ436MlKbIYQidoQ 提取码: evu6 点击next 可修改安装路径 默认就行 一般从命令行调用,所以不用创建。 用vscode,所以这么选择。...
微信小程序实战案例 - 餐馆点餐系统 阶段1 - 菜单浏览
阶段 1 – 菜单浏览(超详细版) 目标:完成「首页=菜品卡片列表」 打好 UI 地基会从 云数据库 拉取 categories / dishes 并渲染打 Git Tag v1.0‑menu 1. 技术/知识点速览 知识点关键词说明云数据库db.collection().where().…...
Dashboard的安装和基本使用
1.Dashboard简介: Dashboard是Kubernetes的Web图形用户界面(GUI),它为用户提供了一个直观的方式来管理和监控Kubernetes集群。 2.实验基础和前置条件: 本实验以Kubernetes集群环境搭建与初始化-CSDN博客为基础和前置…...
英语单词 list 11
前言 这一个 list 是一些简单的单词。感觉这个浏览单词的方法比较低效,所以准备每天最多看一个 list ,真要提升英语水平,感觉还是得直接做阅读理解题。就像我们接触中文阅读材料一样,当然光知道这个表面意思还不够,还…...
JAVA基础 - 高效管理线程隔离数据结构ThreadLocalMap
欢迎光临小站:致橡树 ThreadLocalMap 是 ThreadLocal 的核心底层数据结构,负责在每个线程中存储与 ThreadLocal 实例绑定的数据。它的设计目标是高效管理线程隔离数据,同时尽量减少内存泄漏风险。以下是其核心实现细节。 数据结构与设计目标…...
DeepSeek 接入 Word 完整教程
一、前期准备 1.1 注册并获取 API 密钥 访问 DeepSeek 平台: 打开浏览器,访问 DeepSeek 官方网站(或您使用的相应平台)。注册并登录您的账户。 创建 API 密钥: 在用户控制面板中,找到“API Keys”或“API…...
