Redis性能优化(五大核心模块)
体系总览
Redis性能优化的核心目标是降低访问延迟、提升吞吐量、保障服务稳定性、最大化资源利用率,本体系围绕用户指定的5大核心模块,构建「执行效率优化-资源利用率优化-问题诊断闭环」的完整优化链路,各模块定位如下:
| 优化模块 | 核心优化方向 | 解决的核心痛点 |
|---|---|---|
| Pipeline | 网络IO优化 | 逐条命令的RTT开销过高,吞吐量受限 |
| 批量操作命令 | 命令执行效率优化 | 单线程内核调度开销大,同类型操作原子性批量处理 |
| Lua脚本 | 原子性+可编程性+网络IO复合优化 | 多命令竞态条件、复杂逻辑多轮网络往返、跨操作原子性保障 |
| 内存优化 | 内存资源利用率+访问效率底层优化 | 内存溢出、swap、缓存淘汰频繁、大key阻塞、内存碎片 |
| 慢日志分析 | 性能诊断与优化闭环 | 瓶颈根因定位、优化效果验证、风险提前预警 |
一、Pipeline 管道机制
1.1 核心原理
Redis基于C/S架构的请求-响应模型,默认单条命令执行需经历「客户端发送-服务端执行-客户端接收」完整1次RTT(网络往返时间),单线程模型下大量小命令的RTT开销会成为性能瓶颈。
Pipeline通过客户端批量打包命令、一次性发送至服务端、服务端批量执行后一次性返回结果的机制,将N次RTT缩减为1次,同时减少TCP拥塞控制、Nagle算法带来的网络开销,底层依赖IO多路复用实现批量读写。
核心特性:非原子性、客户端实现、命令顺序执行、无事务回滚保证。
1.2 适用场景
- 大量非事务性的读写命令批量执行(如批量写入缓存、批量查询多key)
- 无强原子性要求、跨命令类型的批量操作
- 单Redis节点/集群同槽位的批量操作,跨节点不可用
- 中小规模批量处理,单批次无超大key
1.3 性能收益
- 1000条逐条命令可将RTT次数从1000次降至1次,吞吐量提升10~100倍
- 大幅降低客户端与服务端的系统调用开销,减少TCP报文数量
- 高延迟网络环境(如跨机房)下,优化效果呈指数级提升
1.4 避坑红线
- 禁止打包过量命令:单批次命令数过多会导致客户端/服务端缓冲区溢出,触发Redis
client-output-buffer-limit限制 - 无原子性保证:中途命令执行失败不会回滚,后续命令仍会继续执行,不可用于强一致性场景
- 集群模式限制:Pipeline内所有key必须通过hashtag保证落在同一hash槽,否则会执行失败
- 避免主线程阻塞:大Pipeline会长时间占用服务端单线程,导致其他请求饥饿,出现延迟毛刺
1.5 最佳实践
- 单批次命令数控制在100~1000条,单批次数据量严格控制在1MB以内
- 集群模式下使用
{固定前缀}hashtag强制key落在同一槽位,例如{user}:1001、{user}:1002 - 完善异常处理:单独校验每条命令的返回结果,设计失败重试机制,避免单条命令失败导致全批次异常
- 配置客户端超时时间,避免大Pipeline导致的客户端阻塞超时
- 同类型操作优先使用原生批量命令,仅跨命令类型场景使用Pipeline
二、批量操作命令
2.1 核心原理
Redis原生批量命令是服务端原子执行的单条命令,可在一次内核调度中完成多key/多field的读写操作,仅需1次RTT,无多命令的上下文切换开销,比Pipeline更轻量,且具备原生原子性。
核心特性:服务端原子性、单RTT开销、内核调度成本极低、命令原生支持、同数据类型操作适配。
2.2 核心分类与常用API
| 数据类型 | 核心批量命令 | 适用场景 |
|---|---|---|
| String | MSET、MGET、MSETNX | 多字符串key的批量读写、原子性批量写入(仅全key不存在时成功) |
| Hash | HMGET、HMSET、HGETALL、HMSETNX | 哈希表多字段的批量读写,小对象聚合存储 |
| Set | SADD、SREM、SMISMEMBER | 集合多元素的批量增删、批量存在性判断 |
| ZSet | ZADD、ZREM、ZMSCORE | 有序集合多元素的批量增删、批量分值查询 |
| 通用 | DEL、UNLINK、EXISTS | 多key的批量删除、批量存在性判断 |
2.3 与Pipeline的核心差异
| 对比维度 | 原生批量命令 | Pipeline |
|---|---|---|
| 原子性 | 服务端原生原子执行,全程不被打断 | 非原子性,命令执行期间可被其他请求打断 |
| 执行位置 | 单条命令服务端解析执行,内核开销极低 | 多条命令客户端打包,服务端逐条解析执行 |
| 跨命令支持 | 仅支持同一条命令的批量操作,不可跨命令 | 支持跨不同命令类型的批量打包,灵活度高 |
| 集群兼容性 | 同槽位限制,跨槽位直接报错 | 同槽位限制,跨槽位可执行但结果异常 |
| 错误处理 | 单条命令整体失败,无部分成功场景 | 单条命令失败不影响其他命令,需单独处理 |
| 性能上限 | 服务端开销最低,性能上限最高 | 额外的命令解析开销,性能略低于批量命令 |
2.4 适用场景
- 同数据类型的多key/多field批量读写,有原子性要求的场景
- 中小规模批量数据处理,单批次无超大key/超大集合
- 简单批量操作,无需复杂条件判断与业务逻辑
- 对服务端CPU开销敏感的高并发场景
2.5 性能收益
- 比逐条命令吞吐量提升10~100倍,服务端CPU开销降低60%以上
- 比Pipeline有更低的内核调度开销,单批次操作延迟降低20%~30%
- 原子性特性避免了分布式锁的额外开销,解决多命令竞态问题
2.6 避坑红线
- 禁止大key全量批量操作:如
HGETALL百万field的哈希表、SMEMBERS千万元素的集合,会直接阻塞单线程 - 集群跨槽位限制:批量命令的所有key必须在同一hash槽,否则触发
CROSSSLOT报错 - 批量删除风险:
DEL批量删除超大key集合会导致主线程阻塞,必须用UNLINK异步删除替代 MSETNX原子性陷阱:仅当所有key都不存在时才会写入成功,不可用于部分key可写入的场景
2.7 最佳实践
- 优先使用原生批量命令替代多条单命令,同类型操作优先批量命令而非Pipeline
- 集群模式下通过hashtag保证key落在同一槽位,避免跨槽位执行失败
- 大集合批量操作拆分:用
HSCAN/SSCAN/ZSCAN替代HGETALL/SMEMBERS,分批遍历避免阻塞 - 批量删除固定使用
UNLINK替代DEL,通过异步内存释放规避主线程阻塞 - 控制单批次操作的数据量,单命令处理的key/field数量控制在1000以内,单批次数据量不超过1MB
三、Lua脚本
3.1 核心原理
Redis内置Lua 5.1解释器,支持将业务逻辑封装为脚本,整体提交至服务端、单线程原子执行(脚本执行期间不响应其他任何命令),同时支持预编译缓存与脚本复用。
既通过单批次提交减少了RTT开销,又解决了Pipeline/批量命令的原子性缺陷,还可将条件判断、聚合计算等逻辑下沉至服务端,减少无效数据传输。
核心特性:全局原子性、服务端可编程性、脚本预编译复用、低网络开销、主从一致性保障。
3.2 核心API与用法
| 命令 | 核心用法 | 生产适配场景 |
|---|---|---|
| EVAL | EVAL "脚本内容" key个数 key1 key2... arg1 arg2... |
测试环境、低频执行的短脚本 |
| EVALSHA | EVALSHA 脚本SHA1值 key个数 key1 key2... arg1 arg2... |
生产环境核心场景,预编译脚本减少网络传输 |
| SCRIPT LOAD | SCRIPT LOAD "脚本内容" |
预加载脚本至服务端缓存,生成SHA1值,配合EVALSHA使用 |
| SCRIPT KILL | SCRIPT KILL |
终止正在执行的超时Lua脚本,仅适用于未执行写入操作的脚本 |
| SCRIPT FLUSH | SCRIPT FLUSH |
清空服务端脚本缓存,仅用于运维场景 |
3.3 核心优势与适用场景
- 强原子性业务场景:如库存扣减+状态更新、分布式锁续期、金额转账等,彻底解决多命令竞态条件,无需额外分布式锁开销
- 多步条件判断场景:如「先查询数据→业务逻辑判断→再写入/更新」,逻辑全量在服务端完成,避免多轮网络往返
- 跨数据结构批量操作:同时操作String/Hash/Set/ZSet等多种数据结构,保证全流程原子性
- 简单聚合计算场景:批量key的过滤、统计、排序,服务端完成计算后仅返回结果,大幅减少无效数据传输
- 高频重复操作场景:通过预编译脚本复用,减少重复的命令解析与网络传输开销
3.4 性能收益
- 比逐条命令吞吐量提升50~100倍,复杂逻辑场景下网络开销降低90%以上
- 比Pipeline新增原子性保障,比批量命令新增可编程性,兼顾性能与业务灵活性
- 预编译脚本复用场景下,服务端命令解析开销降低80%以上
3.5 避坑红线(生产最高优先级)
- 绝对禁止长耗时脚本:Redis单线程模型下,脚本执行会阻塞所有其他请求,单脚本执行时间必须严格控制在1ms以内,严禁循环遍历超大key、全量扫描操作
- 主从一致性风险:禁止在脚本中使用随机函数(
math.random)、时间函数、无KEYS参数的硬编码key,会导致主从节点数据不一致 - 集群规范限制:脚本操作的所有key必须通过
KEYS数组传入,且全部落在同一hash槽,否则集群模式下无法路由,执行报错 - 大脚本禁止:单脚本大小控制在5KB以内,避免过大的网络传输、编译与缓存开销
- 异常回滚陷阱:脚本执行中途失败,不会回滚已执行的写入命令,必须提前做好参数校验与异常处理
- 死锁风险:禁止在脚本中执行阻塞命令,脚本超时后仅可通过
SCRIPT KILL终止,已执行写入的脚本只能通过重启实例解决
3.6 最佳实践
- 生产环境必须使用EVALSHA替代EVAL,预加载脚本至服务端,减少网络传输与编译开销
- 严格控制脚本执行逻辑:仅保留必要的Redis操作与条件判断,复杂业务逻辑放回客户端执行,禁止循环、嵌套、全量遍历操作
- 严格遵循Redis规范:所有操作的key必须通过
KEYS参数传入,业务参数通过ARGV传入,禁止硬编码key - 超时管控:配置合理的
lua-time-limit(默认5s,生产建议设为500ms),配合监控告警及时发现异常脚本 - 批量操作管控:单脚本处理的key数量控制在100~1000条,拆分超大批量操作,避免脚本阻塞主线程
- 幂等性设计:保证脚本可重复执行不影响数据一致性,适配主从切换、重试等场景
- 禁止在脚本中执行
KEYS *、HGETALL、FLUSHALL等高危慢命令,从根源规避阻塞风险
四、内存优化
Redis是内存数据库,内存是决定其性能上限的核心资源,内存不足会直接导致swap、OOM、缓存频繁淘汰、主线程阻塞等致命问题,是所有性能优化的基础。
4.1 Redis内存模型
Redis内存占用核心公式:总内存占用 = 键值对象内存 + 缓冲区内存 + 内存碎片 + 进程自身内存
- 核心优化项:键值对象内存(占比80%以上)、内存碎片、缓冲区内存
- 核心监控指标:
used_memory(Redis申请的内存)、used_memory_rss(操作系统实际分配的内存)、mem_fragmentation_ratio(内存碎片率,=rss/used_memory)
4.2 核心优化方向一:键值对象内存优化(核心)
4.2.1 数据结构选型与编码优化
Redis每种数据类型都有底层压缩编码,压缩编码内存占用比常规编码低50%~90%,且读写性能更优,优化核心是尽可能触发并保持压缩编码。
| 数据类型 | 压缩编码 | 触发条件(默认) | 优化手段 |
|---|---|---|---|
| String | int、embstr | int:整数值;embstr:≤44字节的字符串 | 优先用整数存储;小字符串用embstr编码;单String值控制在10KB以内,超大对象拆分 |
| Hash | ziplist | 元素≤512个 && 单value≤64字节 | 小对象优先用Hash替代多个String;合理调整hash-max-ziplist-entries/value阈值;避免单Hash元素过多 |
| Set | intset | 全整数元素 && 元素≤512个 | 纯整数集合优先使用;调整set-max-intset-entries阈值,避免转为hashtable |
| ZSet | ziplist | 元素≤128个 && 单value≤64字节 | 小有序集合保持ziplist编码;调整zset-max-ziplist-entries/value阈值 |
| List | quicklist | 节点ziplist大小默认8KB | 调整list-max-ziplist-size控制节点大小;开启list-compress-depth压缩首尾节点外的冷数据 |
核心优化技巧:小对象聚合。将多个独立的String小key(如
user:1001:name、user:1001:age)聚合为一个Hash对象,可节省大量key的元数据内存开销,百万级key场景下可节省30%以上内存。
4.2.2 键值对精简优化
- 键名极致精简:缩短key前缀与名称,如
user:info:1001简化为u:i:1001,百万级key场景下,key名每缩短1字节可节省MB级内存 - 字段名精简:Hash/JSON的field名简化,避免冗余字段与长字段名
- 序列化优化:value序列化优先使用Protocol Buffers、MessagePack等二进制序列化方案,比JSON体积减少30%以上,禁止使用Java序列化等臃肿方案
- 数值类型优化:时间戳、状态码等数值统一用整数存储,避免字符串格式浪费内存
4.2.3 生命周期与淘汰优化
- 强制过期策略:所有key必须设置合理的过期时间,避免无效冷数据长期占用内存
- 过期时间打散:避免大量key同时过期,导致Redis集中淘汰阻塞主线程,过期时间增加随机偏移量
- 共享对象复用:Redis默认共享0~9999的整数对象,尽量使用整数value,复用共享对象减少内存开销
4.3 核心优化方向二:内存碎片优化
4.3.1 碎片形成原因与风险
频繁的键值增删改会导致内存页出现大量不连续的空闲块,无法被有效利用,出现「used_memory低,但used_memory_rss持续上涨」的现象。
- 健康阈值:
mem_fragmentation_ratio1~1.5为正常,超过1.5说明碎片严重,超过2必须紧急处理 - 核心风险:内存利用率骤降,最终导致系统OOM,即使Redis实际数据量远低于maxmemory
4.3.2 优化手段
- 自动碎片整理(Redis4.0+推荐):开启
config set activedefrag yes,配合核心参数实现低峰期自动整理,避免主线程阻塞active-defrag-ignore-bytes:碎片达到该值才启动整理,默认100MBactive-defrag-threshold-lower:碎片率超过该值启动整理,默认10%active-defrag-cycle-min/max:CPU占用率上下限,平衡整理速度与阻塞风险
- 手动碎片整理:低峰期执行
MEMORY PURGE命令手动整理碎片;Redis4.0以下版本需通过主从切换后重启实例解决 - 碎片生成规避:避免频繁的小key增删改,优先使用批量操作;控制value大小,减少大量小value导致的内存碎片化
4.4 核心优化方向三:缓冲区与额外内存优化
- 客户端缓冲区优化
- 普通客户端:限制
maxclients避免大量连接占用内存;设置client-output-buffer-limit normal 0 0 0,避免慢客户端占用大量输出缓冲 - 从库复制客户端:设置
client-output-buffer-limit slave 256mb 64mb 60,避免主从全量同步时缓冲区溢出 - Pub/Sub客户端:设置
client-output-buffer-limit pubsub 32mb 8mb 60,避免消息堆积占用大量内存
- 普通客户端:限制
- 复制积压缓冲区:写频繁的实例将
repl-backlog-size从默认1MB调大至10~100MB,避免频繁全量同步,同时避免设置过大浪费内存 - AOF缓冲区:采用
appendfsync everysec刷盘策略,平衡性能与数据安全;避免AOF重写期间缓冲区占用过多内存
4.5 核心优化方向四:OOM与淘汰策略优化
- 合理设置maxmemory:预留30%以上的内存给操作系统、缓冲区、内存碎片,禁止将maxmemory设为机器内存的100%;单实例内存建议控制在10GB以内,最大不超过20GB
- 最优淘汰策略选型
- 热点数据缓存:优先
allkeys-lru,淘汰最近最少使用的key,性能最优 - 有固定过期时间的key:
volatile-lru,仅淘汰设置了过期时间的key - 时序数据/访问频次不均场景:Redis4.0+优先
allkeys-lfu/volatile-lfu,淘汰最不经常使用的key - 生产环境禁止使用noeviction,会导致写入直接报错
- 热点数据缓存:优先
- 彻底规避swap:关闭Linux swap分区,或设置
vm.swappiness=0,禁止Redis内存换出到磁盘,否则性能会暴跌3个数量级以上 - 冷热数据分离:热数据保留在Redis,冷数据定时迁移至磁盘数据库,避免Redis内存被冷数据无效占用
4.6 避坑红线与最佳实践
- 红线1:禁止存储大key,单key大小超过10KB会导致内存开销暴增、读写阻塞,生产建议单key控制在1KB以内
- 红线2:禁止无过期时间的key,导致内存持续增长最终OOM
- 红线3:禁止忽略内存碎片,碎片率超过1.5不处理会导致RSS内存持续上涨,触发系统OOM
- 最佳实践1:定期执行
MEMORY USAGE巡检大key,通过SCAN遍历清理无效过期key - 最佳实践2:开启内存碎片自动整理,设置合理的执行周期与CPU阈值,低峰期执行避免阻塞
- 最佳实践3:集群模式下通过数据分片控制单实例内存大小,避免单实例内存过大导致的fork耗时过长、主从同步异常等问题
五、慢日志分析
慢日志分析是Redis性能优化的诊断入口与闭环验证工具,可精准定位Redis内核执行阶段的慢命令,从根源上找到性能瓶颈,避免盲目优化。
5.1 核心原理
Redis单线程执行命令,会将命令内核执行阶段耗时超过阈值的命令记录到环形慢日志队列中,不包含网络IO、排队等待时间,可精准定位到慢命令本身,是Redis内核级的性能诊断工具。
5.2 核心配置与操作
5.2.1 关键配置参数
| 参数 | 含义 | 单位 | 生产推荐配置 |
|---|---|---|---|
| slowlog-log-slower-than | 慢日志阈值,执行耗时超过该值会被记录 | 微秒(μs) | 1000(1ms),敏感业务500;设为0记录所有命令,负数关闭慢日志 |
| slowlog-max-len | 慢日志环形队列最大长度,超过会覆盖最早日志 | 条数 | 1024,默认128易导致慢日志被覆盖 |
配置方式:临时生效用
CONFIG SET,永久生效写入redis.conf配置文件
5.2.2 核心操作命令
SLOWLOG GET [n]:获取最近n条慢日志,默认返回10条SLOWLOG LEN:获取当前慢日志队列中的日志条数SLOWLOG RESET:清空所有慢日志,用于优化前后效果对比SLOWLOG GET返回字段解析(每条日志6个核心字段):- 慢日志唯一ID
- 命令执行的Unix时间戳
- 命令执行耗时(微秒)
- 执行的完整命令与参数
- 客户端IP与端口
- 客户端名称(通过
CLIENT SETNAME设置)
5.3 系统性分析方法与优化闭环
第一步:慢日志采集与汇总
- 采集方式:定期通过
SLOWLOG GET全量采集,或通过Redis Insight、Prometheus+Grafana、云厂商Redis监控实现实时采集 - 汇总维度:按命令类型、耗时TOP N、执行客户端、执行时间峰值四个维度汇总,重点关注:
- 高频出现的慢命令(占比超过50%的核心瓶颈)
- 耗时超过10ms的低频高阻塞命令(雪崩前兆)
- 业务高峰期集中出现的慢命令
- 特定客户端/业务线的慢命令集中爆发
第二步:慢命令分类与根因定位+优化方案
| 慢命令分类 | 典型命令 | 核心根因 | 针对性优化方案 |
|---|---|---|---|
| 全量遍历类(最高频) | KEYS *、HGETALL、SMEMBERS、LRANGE 0 -1、ZRANGE 0 -1 |
全量遍历超大key/超大集合,单线程长时间阻塞 | 1. 用SCAN/HSCAN/SSCAN分批遍历替代全量命令;2. 拆分大key大集合;3. 业务代码禁止使用KEYS * |
| 不合理批量操作类 | 超大key集合MGET/MSET、超大批量DEL、超大元素数SADD/ZADD |
单命令处理数据量过大,主线程长时间阻塞 | 1. 拆分批量命令,单批次控制在100~1000条;2. 用UNLINK替代DEL;3. 单命令数据量控制在1MB以内 |
| 高开销复杂计算类 | SORT、SUNION/SINTER/SDIFF、ZUNIONSTORE/ZINTERSTORE |
大集合的交并差集、排序运算,时间复杂度O(N)以上 | 1. 提前预计算结果写入Redis,避免实时计算;2. 拆分大集合;3. 复杂运算迁移至客户端执行 |
| Lua脚本慢执行类 | 耗时超1ms的Lua脚本 | 脚本内循环、全量遍历大key、逻辑过于复杂、执行数据量过大 | 1. 精简脚本逻辑,拆分长脚本;2. 严格控制执行时间在1ms以内;3. 禁止脚本内执行全量遍历操作 |
| 内存相关阻塞类 | FLUSHDB/FLUSHALL、BGSAVE、BGREWRITEAOF、集中过期/内存淘汰 |
同步删除阻塞、fork耗时过长、集中过期key淘汰、频繁内存淘汰 | 1. Redis4.0+用FLUSHDB ASYNC异步删除;2. 优化持久化策略,避免高峰期fork;3. 打散过期时间;4. 优化内存淘汰策略 |
| 编码转换阻塞类 | Hash/Set/ZSet写入耗时飙升 | 数据量超过编码阈值,触发ziplist→hashtable/skiplist全量转换 | 1. 合理设置编码阈值;2. 避免单集合元素过多;3. 提前预分配集合空间 |
第三步:优化落地与效果验证
- 针对根因制定优化方案,明确落地优先级与时间节点
- 优化落地前执行
SLOWLOG RESET清空慢日志,设置统一的监控基线 - 持续监控优化后的慢日志数量、平均耗时、最大耗时变化,同时对比Redis核心性能指标(延迟、吞吐量、CPU使用率、内存使用率)
- 未达预期的优化项重新分析根因,形成「采集-分析-优化-验证」的完整闭环
5.4 避坑红线与最佳实践
- 红线1:禁止关闭慢日志,生产环境必须开启,阈值不建议超过10ms
- 红线2:禁止忽略低频高耗时命令,单次几百ms的阻塞命令会导致业务超时、雪崩
- 红线3:禁止只看命令内容,忽略执行时间与客户端,无法定位到具体业务线与峰值场景
- 最佳实践1:生产环境统一配置
slowlog-log-slower-than=1000、slowlog-max-len=1024,兼顾性能与诊断能力 - 最佳实践2:搭建慢日志实时监控告警,慢日志条数突增、单命令耗时超10ms立即触发告警
- 最佳实践3:给不同业务线的客户端设置
CLIENT SETNAME,快速定位慢命令对应的业务代码 - 最佳实践4:结合
INFO stats、INFO commandstats命令,辅助分析命令执行频率与平均耗时,与慢日志形成互补 - 最佳实践5:定期(每周)执行全量慢日志分析,汇总TOP慢命令,推动业务侧持续优化
六、五大模块协同体系与选型决策树
6.1 选型优先级决策树
- 同数据类型、单操作的批量读写,无复杂逻辑:优先原生批量命令,性能最高、原子性保障、内核开销最低
- 跨命令类型的批量读写,无强原子性要求,单节点/同槽位:使用Pipeline,最大化减少RTT开销,灵活度高
- 多命令强原子性要求,有简单条件判断/跨数据结构操作,同槽位:使用Lua脚本,兼顾原子性、批量性与可编程性
- 所有场景的基础优化:内存优化,从根源降低单命令执行耗时,提升整体性能上限
- 所有优化的前提与闭环:慢日志分析,先定位瓶颈根因,再针对性优化,禁止盲目优化
6.2 典型协同场景示例
- 批量用户信息写入,强原子性要求:Lua脚本封装HMSET批量操作,原子执行+减少RTT,同时通过Hash结构优化内存占用
- 百万级小key批量写入,无原子性要求:拆分批次,每批次通过Pipeline打包MSET命令,控制单批次大小,兼顾吞吐量与阻塞风险
- 热点商品库存扣减,先查后写强一致性:Lua脚本实现原子操作,避免竞态条件,同时通过慢日志监控脚本执行耗时,保障不阻塞主线程
- 慢日志发现HGETALL慢命令:先通过内存优化拆分大Hash,用HSCAN替代HGETALL,配合Pipeline分批查询,最终通过慢日志验证优化效果
6.3 性能优化核心原则
- 先诊断后优化:慢日志先行,不做无根因的盲目优化
- 最小化阻塞:Redis单线程是核心约束,所有优化都必须规避主线程长时间阻塞
- 减少网络往返:Pipeline、批量命令、Lua脚本的核心都是降低RTT开销
- 内存为王:内存优化是所有性能优化的基础,内存不足会导致所有优化失效
- 平衡取舍:在性能、原子性、业务复杂度、稳定性之间做合理平衡,不追求极致性能而引入业务风险
- 可观测性闭环:所有优化必须有监控验证,形成诊断-优化-验证的完整闭环