当前位置: 首页 > news >正文

深度解析:Redis 性能优化全方位指南

Redis 作为当前最流行的内存数据库之一,以其高性能、低延迟和丰富的数据结构支持,被广泛应用于缓存、消息队列、实时统计等场景。然而,随着业务规模的增长,Redis 可能面临性能瓶颈,如高延迟、内存不足、吞吐量下降等问题。如何充分发挥 Redis 的性能潜力,使其在高并发、大数据量环境下依然保持稳定高效?本文将深入探讨 Redis 性能优化的关键策略,涵盖内存管理、配置调优、持久化优化、网络优化、命令优化、架构设计等多个方面,帮助开发者构建高性能的 Redis 应用。

1. Redis 性能优化的核心目标

在优化 Redis 之前,我们需要明确优化的目标:

  1. 降低延迟:减少客户端请求的响应时间。

  2. 提高吞吐量:支持更高的 QPS(每秒查询数)。

  3. 节省内存:减少内存占用,避免 OOM(内存溢出)。

  4. 增强稳定性:避免因配置不当导致的崩溃或性能骤降。

接下来,我们将从多个维度探讨如何实现这些目标。

2. 内存优化:减少 Redis 内存占用

Redis 是内存数据库,内存使用直接影响性能和成本。优化内存可以从以下几个方面入手:

2.1 选择合适的数据结构

  • 避免滥用 String 类型:存储对象时,使用 Hash 结构比多个 String 更节省内存(特别是启用 ziplist 编码时)。

  • 使用 ziplist 优化小数据存储

    hash-max-ziplist-entries 512  # Hash 元素数量 ≤512 时使用 ziplist
    hash-max-ziplist-value 64     # Hash 单个元素大小 ≤64 字节时使用 ziplist
  • 使用 HyperLogLog 替代 Set 做基数统计:HyperLogLog 仅需 12KB 即可估算上亿数据的基数。

2.2 控制 Key 和 Value 大小

  • Key 尽量简短:如用 u:1000 代替 user:1000:profile

  • 避免大 Key:单 Key 数据超过 10KB 会影响性能,超过 1MB 可能导致阻塞。

2.3 设置合理的过期策略

  • 主动清理无用数据:使用 EXPIRE 或 TTL 设置 Key 的过期时间。

  • 选择合适的淘汰策略maxmemory-policy):

    • volatile-lru:仅淘汰有过期时间的 Key。

    • allkeys-lru:所有 Key 参与淘汰(适用于缓存场景)。

3. 配置优化:调整 Redis 参数

Redis 的默认配置可能不适合高并发场景,需根据业务调整:

3.1 内存管理

maxmemory 8GB  # 限制最大内存,避免 OOM
maxmemory-policy allkeys-lru  # 内存满时淘汰策略

3.2 网络优化

tcp-backlog 511  # 高并发时增大 TCP 队列
timeout 300      # 连接空闲超时(秒)
tcp-keepalive 60 # 保持 TCP 连接活性

3.3 关闭透明大页(THP)

echo never > /sys/kernel/mm/transparent_hugepage/enabled

4. 持久化优化:平衡性能与数据安全

Redis 提供 RDB(快照)和 AOF(日志)两种持久化方式,优化策略如下:

4.1 RDB 优化

  • 调整 save 频率

    save 900 1     # 15 分钟至少 1 个 Key 变化时保存
    save 300 10    # 5 分钟至少 10 个 Key 变化时保存
  • 禁用 RDB(纯缓存场景):

    save ""

4.2 AOF 优化

  • 使用 appendfsync everysec(默认推荐):

    • always(每次写入同步,性能差但最安全)

    • no(由操作系统决定,可能丢数据)

  • 定期重写 AOF

    auto-aof-rewrite-percentage 100  # AOF 文件增长 100% 时触发重写
    auto-aof-rewrite-min-size 64mb   # AOF 文件最小 64MB 才重写

5. 命令优化:减少慢查询

5.1 避免阻塞命令

  • 禁用 KEYS *,改用 SCAN 分批次查询。

  • 慎用 FLUSHDB/FLUSHALL(可能导致 Redis 阻塞)。

5.2 使用批量操作

  • MGET/MSET 代替多次 GET/SET

  • Pipeline 减少网络往返:

    pipe = redis.pipeline()
    pipe.set("key1", "value1")
    pipe.set("key2", "value2")
    pipe.execute()

5.3 使用 Lua 脚本

  • 减少网络交互,保证原子性:

    EVAL "return redis.call('GET', KEYS[1])" 1 mykey

6. 架构优化:提升 Redis 扩展性

6.1 读写分离

  • 主从复制:主库写,从库读,提升读吞吐量。

  • 哨兵模式(Sentinel):自动故障转移,提高可用性。

6.2 数据分片(Sharding)

  • Redis Cluster:官方集群方案,支持自动分片。

  • Twemproxy/Codis:代理层分片,兼容单机 Redis 命令。

6.3 多实例部署

  • 单机多 Redis 实例:充分利用多核 CPU(需绑定不同端口)。

7. 监控与调优:持续优化 Redis 性能

7.1 关键指标监控

  • 内存used_memorymem_fragmentation_ratio(碎片率)。

  • 命中率keyspace_hits / (keyspace_hits + keyspace_misses)

  • 延迟redis-cli --latency 或 slowlog 分析慢查询。

7.2 慢查询日志

slowlog-log-slower-than 10000  # 记录超过 10ms 的查询
slowlog-max-len 128           # 保留 128 条慢查询记录

7.3 定期维护

  • MEMORY PURGE:清理内存碎片(Redis 4.0+)。

  • BGREWRITEAOF:手动触发 AOF 重写。

8. 操作系统优化

8.1 调整内核参数

vm.overcommit_memory = 1  # 允许内存超额分配
net.core.somaxconn = 1024 # 增大 TCP 连接队列

8.2 禁用 Swap

sudo swapoff -a  # 避免 Redis 被换出到磁盘

8.3 CPU 绑定

taskset -c 0,1 redis-server  # 绑定 Redis 到 CPU 0 和 1

结论

Redis 性能优化是一个系统工程,涉及内存管理、配置调优、持久化策略、命令优化、架构设计等多个方面。本文从实战角度出发,提供了全面的优化方案,帮助开发者在高并发、大数据量场景下充分发挥 Redis 的性能潜力。建议结合监控工具(如 redis-cliINFO 命令、Prometheus + Grafana)持续观察 Redis 运行状态,并根据业务特点进行针对性调优。

相关文章:

深度解析:Redis 性能优化全方位指南

Redis 作为当前最流行的内存数据库之一,以其高性能、低延迟和丰富的数据结构支持,被广泛应用于缓存、消息队列、实时统计等场景。然而,随着业务规模的增长,Redis 可能面临性能瓶颈,如高延迟、内存不足、吞吐量下降等问…...

OpenHarmony外设驱动使用 (五),Fingerprint_auth

OpenHarmony外设驱动使用 (五) Fingerprint_auth 概述 功能简介 指纹认证是端侧设备不可或缺的功能,为设备提供用户认证能力,可应用于设备解锁、支付、应用登录等身份认证场景。用户注册指纹后,指纹认证模块就可为设…...

.NET外挂系列:2. 了解强大的 harmony 注解特性

一:背景 1. 讲故事 上一篇我们简单的聊了下harmony外挂的基本玩法,让大家宏观上感受到了外挂在 .NET高级调试 领域的威力,这一篇我们从 注解特性 这个角度继续展开。 二:harmony 注解特性 1. HarmonyPatch 解读 在harmony支持…...

【Arm】应用ArmDS移植最小FreeRTOS系统

一、文档背景 FreeRTOS(Free Real-Time Operating System)是一个开源的实时操作系统内核,广泛应用于嵌入式系统。它具有小巧、灵活、低功耗等特点,支持多任务调度、信号量、队列等实时操作系统基本功能。 将FreeRTOS移植到特定硬…...

Python----目标检测(labelimg和labelme的安装与使用,Pycharm配置教程)

一、labelimg labelimg是一款开源的图像标注工具,标签可用于分类和目标检测,它是用python写的,并使用Qt作为其图形界面,简单好用(虽然是英文版的)。其注释以 PASCAL VOC格式保存为XML文件,这是I…...

Axure跨页面交互:利用IFrame和JS实现父子页面菜单联动

在 Axure 中使用内联框架(IFrame)进行父子页面间的通信是一个非常有效的技巧,尤其是在需要实现复杂交互逻辑时。通过 JavaScript 直接操作 DOM 元素,可以突破 Axure 基础元件的限制,实现更灵活的页面联动。以下是对你描…...

百度飞桨OCR(PP-OCRv4_server_det|PP-OCRv4_server_rec_doc)文本识别-Java项目实践

什么是OCR? OCR(Optical Character Recognition,光学字符识别)是一种通过技术手段将图像或扫描件中的文字内容转换为可编辑、可搜索的文本格式(如TXT、Word、PDF等)的技术。它广泛应用于文档数字化、信息提取、自动化…...

救生衣穿戴检测数据集VOC+YOLO格式2171张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2171 标注数量(xml文件个数):2171 标注数量(txt文件个数):2171 …...

JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received.

环境: vllm 0.8.5 java 17 Qwen3-32B-FP8 问题描述: JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received. WARNING: Unsupported upgrade request. INFO: - "POST /v1/chat/completions HTTP/1.1&…...

信号量基础入门:并发控制的核心概念

问题的复杂性产生的根本原因在于,如 2.2 节所述,共享变量的访问始终是“单向信息流”。也就是说,一个进程可以分配新值或检查当前值,但这种检查不会为其他进程留下任何痕迹。结果是,当一个进程想要对共享变量的当前值作…...

物联网之使用Vertx实现HTTP/WebSocket最佳实践

小伙伴们,你们好呀,我是老寇,跟我一起学习使用Vertx实现HTTP-Server和WebSocket-Server 实现Http/WebSocket【响应式】 Vertx-Web地址 实现过程 查看源码 代码比较简单,懒得讲解啦 代码比较简单,懒得讲解啦 代码…...

【神经网络与深度学习】GAN 生成对抗训练模型在实际训练中很容易判别器收敛,生成器发散

引言部分 在深度学习领域,生成对抗网络(GAN)是一种强大的数据生成方法,它通过生成器(G)和判别器(D)之间的博弈来不断优化模型。然而,在实际训练过程中,GAN 往…...

使用 NGINX 的 `ngx_http_secure_link_module` 模块保护资源链接

一、模块简介 版本:自 NGINX 0.7.18 起引入 功能: 签名校验:对请求 URI 中的签名进行校验,保证链接未经篡改。时效控制:根据请求中携带的过期时间,判断链接是否仍在有效期。 启用方式:编译 NG…...

5月19日day30打卡

模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 一、导入官方库 …...

NW860NW894美光闪存颗粒NX770NX789

在数字化浪潮席卷全球的当下,数据存储技术的革新正以惊人的速度推动着硬件性能的边界。美光科技作为半导体存储领域的领军者,其NW860、NW894、NX770、NX789系列闪存颗粒凭借前沿架构与精密工艺,成为高性能存储解决方案的核心载体。本文将深入…...

高性能锁机制 CAS:Java 并发编程中的深度剖析

引言 在并发编程领域,i操作的非线程安全性是开发者们熟知的问题。这一现象根源在于i并非原子操作,其内部执行过程包含读取、修改和写入三个步骤,在多线程环境下极易因线程切换导致数据竞争与不一致,这与我们此前探讨的多线程常见问…...

leetcode 每日一题 1931. 用三种不同颜色为网格涂色

题目 1931. 用三种不同颜色为网格涂色 思路 先获取列表,上下左右的所有情况。解决一维的问题 然后所有一维的问题暴力循环。已知一个一维的解,可以对应其他一维解的列表(用于记忆化搜索) 然后使用递归,进行累加 代…...

解决Windows磁盘管理中因夹卷导致的无法分区问题

解决Windows磁盘管理中因夹卷导致的无法分区问题 在现代计算机管理中,磁盘分区是一个常见且重要的操作。无论是为了优化存储空间,还是为了实现多系统安装,合理的磁盘分区都是必不可少的。然而,许多用户在使用Windows磁盘管理工具…...

龙虎榜——20250519

上证指数缩量收十字星,个股涨多跌少,这周反弹的概率比较大。 深证指数缩量调整,临近反弹,个股表现更好。 2025年5月19日龙虎榜行业方向分析 化工(新能源材料国产替代) • 代表个股:红宝丽、…...

Python在自动驾驶数据清洗中的应用

Python在自动驾驶数据清洗中的应用 在自动驾驶领域,数据是算法的燃料。高质量的数据意味着更精准的模型,更稳定的驾驶体验。然而,原始数据通常充满噪声、缺失值、不一致格式,甚至有异常点,这些都会严重影响自动驾驶系统的可靠性。因此,数据清洗是一道绕不开的关卡。 一…...

腾讯云Mysql实现远程链接

1.SQL语句:CREATE USER remote_user% IDENTIFIED BY YourPassword; GRANT ALL PRIVILEGES ON *.* TO remote_user%; FLUSH PRIVILEGES; 2.设置入站规则 3.设置安全组 4.效果...

大模型(2)——提示工程(Prompt Engineering)

文章目录 一、提示工程的核心概念为什么需要提示工程? 二、提示设计的基本原则三、实用提示工程技巧1. 角色设定法2. 示例引导法(Few-Shot Learning)3. 分阶段提问4. 负面约束5. 温度(Temperature)控制 四、不同任务类…...

深入Java G1 GC调优:如何解决高延迟与吞吐量瓶颈

引言 Java的垃圾回收(GC)机制是JVM性能的核心,但即使是最先进的G1(Garbage-First)收集器,在复杂场景下仍可能引发长时间停顿(Stop-The-World, STW)​或吞吐量骤降。许多开发者虽然熟…...

DAPO:用于指令微调的直接偏好优化解读

一、背景与动机:从RLHF到DPO,再到DAPO 大型语言模型(LLM)经过海量无监督预训练后,往往需要对齐人类偏好或遵循指令的微调,使模型的回答更符合人类期望。这一过程通常通过人类反馈强化学习(RLHF)来实现。例如OpenAI的ChatGPT就使用了RLHF:先让人工标注对模型输出进行偏…...

vue2、vue3项目打包生成txt文件-自动记录打包日期:git版本、当前分支、提交人姓名、提交日期、提交描述等信息 和 前端项目的版本号json文件

vue2 打包生成text文件 和 前端项目的版本号json文件 项目打包生成txt文件-自动记录git版本、当前分支、提交人姓名、提交日期、提交描述等信息生成版本号json文件-自动记录当前版本号、打包时间等信息新建branch-version-webpack-plugin.js文件 // 同步子进程 const execSyn…...

iOS解码实现

import Foundation import VideoToolboxclass KFVideoDecoderInputPacket {var sampleBuffer: CMSampleBuffer? }class KFVideoDecoder {// MARK: - 常量private let kDecoderRetrySessionMaxCount 5private let kDecoderDecodeFrameFailedMaxCount 20// MARK: - 回调var pi…...

Windows中PDF TXT Excel Word PPT等Office文件在预览窗格无法预览的终级解决方法大全

Windows中PDF TXT Excel Word PPT等Office文件在预览窗格无法预览的终级解决方法大全 参考链接: https://zhuanlan.zhihu.com/p/454259765...

在Excel中使用函数公式时,常见错误对应不同的典型问题

在Excel中使用函数公式时,常见错误对应不同的典型问题 1. #DIV/0!(除以零错误)2. #N/A(值不可用)3. #NAME?(名称错误)4. #NULL!(空交集错误)5. #NUM!(数值错…...

Excel

1.快捷键 CtrlE 快速填充 CtrlQ 快速分析 CtrlEnter 原位填充 Tab 横向移动到下一个单元格 Enter 移动到下一行起始位置对应单元格 Shift 返回上一个单元格 0空格分数 显示分数 1.if if(condition,true,false)if(A1>10,"true","fa…...

Rust 学习笔记:错误处理

Rust 学习笔记:错误处理 Rust 学习笔记:错误处理不可恢复的错误带有结果的可恢复错误匹配不同的错误出现错误时 panic 的快捷方式:unwrap 和 expect传播错误传播错误的快捷方式:? 操作符哪里可以使用 ? 操作符 panic or not pan…...

【Linux】系统指令与开发全栈(vim、ssh、gcc)

【Linux】系统指令与开发全栈(vim、ssh、gcc) 一、Linux 系统指令大全 1、文件与目录管理 基础操作 指令参数说明典型用例注意事项cd~ 家目录,- 返回上级,.. 上级目录cd ~/Documents 进入文档目录无目录权限时会报错ls-l 详情&am…...

用 CodeBuddy 搭建「MiniGoal 小目标打卡器」:一次流畅的 UniApp 开发体验

我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 在日常生活中,我们总是希望能够坚持一些小习惯,比如每天锻炼十分钟、读一页书、早睡十分…...

前端(vue)学习笔记(CLASS 6):路由进阶

1、路由的封装抽离 将之前写在main.js文件中的路由配置与规则抽离出来,放置在router/index.js文件中,再将其导入回main.js文件中,即可实现路由的封装抽离 例如 //index.js import { createMemoryHistory, createRouter } from vue-routerim…...

ubuntu 安装 Redis新版Redis 7.x

以下是在Ubuntu系统中安装Redis的详细指南, 一、官方APT源安装 sudo apt install redis-server -y 默认安装最新APT源版本(Ubuntu 22.04通常为Redis 6.x) 服务自动启动,配置文件路径:/etc/redis/redis.conf验证安装 …...

Httphelper: Http请求webapi小记

文章目录 1、HttpHelper.cs Framework4.812、HttpHelper.cs NET83、JsonHelper.cs Framework4.814、JsonHelper.cs NET85、uniapp request.js 访问WEBAPI 每次查找、测试都比较费事,记录一下把 1、HttpHelper.cs Framework4.81 using System; using System.IO; usi…...

【Linux】进程控制(进程创建、进程终止、进程等待、进程替换)

目录 一、进程创建 1、fork函数 2、页表权限 二、进程终止 1、main函数返回值(退出码) 2、常见错误码及其对应的错误描述: 将错误退出码转化为错误描述的方法: 3、进程退出的三种场景 4、由上我们可以知道: 5…...

java+selenium专题->启动浏览器下篇

1.简介 上一篇文章,我们已经在搭建的java项目环境中实践了,今天就在基于maven项目的环境中演示一下。 2.eclipse中新建maven项目 1.依次点击eclipse的file - new - other ,如下图所示: 2.在搜索框输入关键字“maven”&#xff…...

sqlserver 循环删除1000行

在SQL Server中,如果你想循环删除1000行数据,有几种方法可以实现,但值得注意的是,频繁使用循环删除操作可能会对数据库性能造成影响,尤其是在处理大量数据时。下面介绍几种方法,并讨论它们的优缺点。 方法…...

亚信电子与联发科技携手打造AIoT新未来

[台湾新竹讯, 2025年5月19日] 智能物联网(AIoT)融合人工智能与物联网技术,通过边缘AI的实时数据分析及设备智能联网能力,加速智能物联网创新应用的蓬勃发展。为满足AIoT产业对多网络端口的应用需求,全球半导体公司【联…...

【成品设计】基于STM32的人体健康监测系统

《基于STM32的人体健康监测系统》 Ps:有4个版本。 V1硬件设计: 主控:STM32F103C8T6:作为系统主控芯片。 血氧心率传感器:用于采集当前心率、血氧值。 温湿度传感器:用于采集当前环境温湿度。 有源低电平触发蜂鸣器&…...

【MySQL进阶】了解linux操作系统下mysql的配置文件和常用选项

前言 🌟🌟本期讲解关于linux下mysql配置选项的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么…...

LeetCode 219.存在重复元素 II

目录 题目: 题目描述: 题目链接: 思路: 核心思路: 思路详解: 代码: C代码: Java代码: 题目: 题目描述: 题目链接: 219. 存…...

解释:神经网络

在过去的10年里,表现最好的artificial-intelligence系统——比如智能手机上的语音识别器或谷歌最新的自动翻译——都是由一种叫做“深度学习”的技术产生的 深度学习实际上是一种被称为神经网络的人工智能方法的新名称,这种方法已经流行了70多年。1944年…...

Java 泛型详解

在 Java 的类型系统中,泛型(Generics) 是一个非常重要的特性。它让我们能够编写更通用、更安全的代码,尤其是在处理集合类(如 List、Map 等)时,泛型的使用可以大大减少类型转换的麻烦&#xff0…...

React集成百度【JSAPI Three】教程(001):快速入门

文章目录 1、快速入门1.1 创建react项目1.2 安装与配置1.3 静态资源配置1.4 配置百度地图AK1.5 第一个DEMO1、快速入门 JSAPI Three版本是一套基于Three.js的三维数字孪生版本地图服务引擎,一套引擎即可支持2D、2.5D、3D全能力的地理投影与数据源加载,帮助开发者轻松搞定平面…...

WPF中资源(Resource)与嵌入的资源(Embedded Resource)的区别及使用场景详解

🌟 开发WPF项目时图片、SVG、配置文件等到底该设置为哪种资源?如何正确读取、跨程序集访问?一篇文章全解答。 在使用 WPF 进行项目开发时,很多开发者在设置文件“生成操作(Build Action)”时,常常会在“资源(Resource)”和“嵌入的资源(Embedded Resource)”之间感…...

如何在 Windows 11 或 10 上安装 Fliqlo 时钟屏保

了解如何在 Windows 11 或 10 上安装 Fliqlo,为您的 PC 或笔记本电脑屏幕添加一个翻转时钟屏保以显示时间。 Fliqlo 是一款适用于 Windows 和 macOS 平台的免费时钟屏保。它也适用于移动设备,但仅限于 iPhone 和 iPad。Fliqlo 的主要功能是在用户不活动时在 PC 或笔记本电脑…...

【STM32】ST-Link V2.1制作

一、下载烧写工具及程序 下载器制作(ST-Link V2.1) 链接: 提取码:6666https://pan.baidu.com/s/1n0RYNDEw5mBT_CsTFoqrIg?pwd6666 二、安装STM32 CubeProgrammer 双击安装包,点击Next 继续点击Next 选择安装路径,再…...

day30python打卡

知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 一、导入官方库 我们复盘下学习py…...

AI大语言模型评测体系演进与未来展望

随着人工智能技术的飞速发展,大语言模型(LLMs)已成为自然语言处理领域的核心研究方向。2025年最新行业报告显示,当前主流模型的评测体系已从单一任务评估转向多维度、全链路的能力剖析。例如,《全球首个大语言模型意识水平”识商”白盒DIKWP测评报告》通过数据、信息、知识…...