【高性能缓存Redis_中间件】三、redis 精通:性能优化与生产实践

news2025/4/17 17:50:12

一、引言​

在前两篇 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 的对比实践,进一步拓展技术视野。

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

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

相关文章

jupyter notebook 无法启动- markupsafe导致

一、运行jupyter notebook和Spyder报错&#xff1a;(已安装了Anaconda&#xff0c;以前可打开) 1.背景&#xff1a;为了部署机器学习模型&#xff0c;按教程直接安装了flask 和markupsafe&#xff0c;导致jupyter notebook&#xff0c;Spyder 打不开。 pip install flas…

CTF web入门之命令执行 完整版

web29 文件名过滤 由于flag被过滤,需要进行文件名绕过,有以下几种方法: 1.通配符绕过 fla?.* 2.反斜杠绕过 fl\ag.php 3.双引号绕过 fl’‘ag’.php 还有特殊变量$1、内联执行等 此外 读取文件利用cat函数,输出利用system、passthru 、echo echo `nl flag.php`; ec…

Java 开发工具:从 Eclipse 到 IntelliJ IDEA 的进化之路

Java 开发工具&#xff1a;从 Eclipse 到 IntelliJ IDEA 的进化之路 在 Java 开发的历史长河中&#xff0c;开发工具的演变不仅改变了程序员的编码方式&#xff0c;也深刻影响了整个行业的开发效率和代码质量。从 Eclipse 到 IntelliJ IDEA&#xff0c;这不仅是工具的更替&…

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绘图

红宝书第四十三讲&#xff1a;基于资料的数据可视化工具简单介绍&#xff1a;D3.js 与 Canvas绘图12 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、D3.js&#xff1a;数据驱动文档的王者 1 核心特性&#x…

深入理解 Vue 的数据代理机制

何为数据代理&#xff1f; 通过一个对象代理对另一个对象中的属性的操作&#xff08;读/写&#xff09;&#xff0c;就是数据代理。 要搞懂Vue数据代理这个概念&#xff0c;那我们就要从Object.defineProperty()入手 Object.defineProperty()是Vue中比较底层的一个方法&…

Java excel导入/导出导致内存溢出问题,以及解决方案

excel导入/导出导致内存溢出问题&#xff0c;以及解决方案 1、内存溢出问题导入功能重新修正&#xff0c;采用SAX的流式解析数据。并结合业务流程。导出功能&#xff1a;由于精细化了业务流程&#xff0c;导致比较代码比较冗杂&#xff0c;就只放出最简单的案例。 1、内存溢出问…

10 个最新 CSS 功能已在所有主流浏览器中得到支持

前言 CSS 不断发展&#xff0c;新功能使我们的工作更快、更简洁、更强大。得益于最新的浏览器改进&#xff08;Baseline 2024&#xff09;&#xff0c;许多新功能现在可在所有主要引擎上使用。以下是您可以立即开始使用的10 CSS新功能。 1. Scrollbar-Gutter 和 Scrollbar-Co…

思科模拟器的单臂路由,交换机,路由器,路由器只要两个端口的话,连接三台电脑该怎么办,划分VLAN,dotlq协议

单臂路由 1. 需求&#xff1a;让三台电脑互通 2. 在二层交换机划分vlan&#xff0c;并加入&#xff1b; 3. 将连接二层交换机和路由器的端口f0/4改为trunk模式 4. 路由器&#xff1a;进入连接路由器的f0/0端口将端口开启 5. 进入每个vlan设dotlq协议并设网络IP&#xff08…

14 nginx 的 dns 缓存的流程

前言 这个是 2020年11月 记录的这个关于 nginx 的 dns 缓存的问题 docker 环境下面 前端A连到后端B 前端B连到后端A 最近从草稿箱发布这个问题的时候, 重新看了一下 发现该问题的记录中仅仅是 定位到了 nginx 这边的 dns 缓存的问题, 但是 并没有到细节, 没有到 具体的 n种…

实战教程:使用JetBrians Rider快速部署与调试PS5和Xbox上的UE项目

面向主机游戏开发者的重大新闻&#xff01;在2024.3版本中&#xff0c;JetBrains Rider 增加了对 PlayStation5 和 Xbox 游戏主机的支持&#xff0c;您可以直接在您喜欢的游戏主机上构建、部署和调试 Unreal Engine 和自定义游戏引擎。 JetBrains Rider现在支持主机游戏开发&am…

专题十五:动态路由——BGP

一、BGP的基本概念 BGP&#xff08;Border Gateway Protocol&#xff0c;边界网关协议&#xff09;是一种用于在不同自治系统&#xff08;AS&#xff09;之间交换路由信息的外部网关协议&#xff08;EGP&#xff09;。通过TCP179端口建立连接。目前采用BGP4版本&#xff0c;IP…

hive数仓要点总结

1.OLTP和OLAP区别 OLTP&#xff08;On-Line Transaction Processing&#xff09;即联机事务处理&#xff0c;也称为面向交易的处理过程&#xff0c;其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理&#xff0c;并在很短的时间内给出处理结果&#xff0c;是对用…

git安装(windows)

通过网盘分享的文件&#xff1a;资料(1) 链接: https://pan.baidu.com/s/1MAenYzcQ436MlKbIYQidoQ 提取码: evu6 点击next 可修改安装路径 默认就行 一般从命令行调用&#xff0c;所以不用创建。 用vscode&#xff0c;所以这么选择。

微信小程序实战案例 - 餐馆点餐系统 阶段1 - 菜单浏览

阶段 1 – 菜单浏览&#xff08;超详细版&#xff09; 目标&#xff1a;完成「首页&#xff1d;菜品卡片列表」 打好 UI 地基会从 云数据库 拉取 categories / dishes 并渲染打 Git Tag v1.0‑menu 1. 技术/知识点速览 知识点关键词说明云数据库db.collection().where().…

Dashboard的安装和基本使用

1.Dashboard简介&#xff1a; Dashboard是Kubernetes的Web图形用户界面&#xff08;GUI&#xff09;&#xff0c;它为用户提供了一个直观的方式来管理和监控Kubernetes集群。 2.实验基础和前置条件&#xff1a; 本实验以Kubernetes集群环境搭建与初始化-CSDN博客为基础和前置…

英语单词 list 11

前言 这一个 list 是一些简单的单词。感觉这个浏览单词的方法比较低效&#xff0c;所以准备每天最多看一个 list &#xff0c;真要提升英语水平&#xff0c;感觉还是得直接做阅读理解题。就像我们接触中文阅读材料一样&#xff0c;当然光知道这个表面意思还不够&#xff0c;还…

通义灵码助力Neo4J开发:快速上手与智能编码技巧

在 Web 应用开发中&#xff0c;Neo4J 作为一种图数据库&#xff0c;用于存储节点及节点间的关系。当图结构复杂化时&#xff0c;关系型数据库的查找效率会显著降低&#xff0c;甚至无法有效查找&#xff0c;这时 Neo4J 的优势便凸显出来。然而&#xff0c;由于其独特的应用场景…

高性能文件上传服务

高性能文件上传服务 —— 您业务升级的不二选择 在当今互联网数据量激增、文件体积日益庞大的背景下&#xff0c;高效、稳定的文件上传方案显得尤为重要。我们的文件分块上传服务端采用业界领先的 Rust HTTP 框架 Hyperlane 开发&#xff0c;凭借其轻量级、低延时和高并发的特…

Java Lambda 表达式详解:发展史、语法、使用场景及代码示例

Java Lambda 表达式详解&#xff1a;发展史、语法、使用场景及代码示例 1. Lambda 表达式的发展史 背景与动机 JDK 7 前&#xff1a;Java的匿名内部类虽强大&#xff0c;但代码冗余&#xff08;如事件监听器、集合遍历&#xff09;。JDK 8&#xff08;2014&#xff09;&#…