线上发现 Redis 机器爆了,如何优化?

线上 Redis 机器爆了,如何优化?

当 Redis 机器出现爆满(CPU 100%、内存溢出、请求超时等情况),需要迅速排查问题并采取优化措施。可以从 排查 Redis 负载、优化数据结构、降级限流、扩展集群 等方面入手。

一、问题排查

先查看 Redis 运行状态

使用 info 命令,检查 Redis 关键指标:

复制代码
redis-cli info

重点关注:

检查 Redis CPU 负载

css 复制代码
top -p $(pgrep redis)

CPU 100%:

• 可能是**大 key 处理、阻塞操作(如 keys )、Lua 脚本执行时间长*。

内存占满:

• 检查 maxmemory 是否配置正确,是否发生了数据驱逐。

查看 Redis 慢查询

arduino 复制代码
redis-cli slowlog get 10

• 如果 SLOWLOG 发现某些命令执行时间过长,可能是:

大 Key 读写(get/set 超大对象)。

LRANGE、HGETALL 这类大范围查询。

事务(MULTI/EXEC)执行时间过长

二、优化方案

优化大 Key

如何检查大 Key

css 复制代码
redis-cli --bigkeys

单个 Key 过大(如 List、Hash 过长)

• 拆分 Key,减少单个 Key 存储量。

• 对 List 类型,尽量使用 LPUSH + LTRIM 控制长度。

如何删除大 Key(避免阻塞)

bash 复制代码
UNLINK big_key  # 非阻塞删除
  1. 限流降级

(1)限制 QPS,避免 Redis 过载

• 使用 令牌桶算法,限制高并发请求:

lua 复制代码
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local current = tonumber(redis.call('incr', key))
if current > limit then
    return 0
else
    redis.call('expire', key, 1)
    return 1
end

如果返回 0,表示超出 QPS 限制,前端可降级。

(2)缓存降级

减少 Redis 依赖

热点 Key 设置本地缓存,减少 Redis 访问:

ini 复制代码
from cachetools import TTLCache
local_cache = TTLCache(maxsize=10000, ttl=60)  # 60s 过期

改用 CDN/数据库兜底:如果 Redis 爆了,可以查询数据库,但要加限流。

增加 Redis 集群

(1)主从复制(读写分离)

读请求分流到从库

xml 复制代码
slaveof <master-ip> <port>

• 业务端用 READONLY 访问从库,减少主库压力。

(2)分片(Redis Cluster)

如果单机存储压力大,可使用 Cluster

css 复制代码
redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 --cluster-replicas 1

哈希槽分片,自动扩展,避免单点 Redis 爆掉。

内存优化

(1)调整数据淘汰策略

• 检查 maxmemory-policy:

arduino 复制代码
config get maxmemory-policy

推荐策略:

LRU(最近最少使用) :allkeys-lru

LFU(最近最少频率使用) :allkeys-lfu

TTL 到期清理:volatile-ttl

(2)压缩数据

减少 Redis 内存占用

JSON 改为 MessagePack,减少数据量:

kotlin 复制代码
import msgpack
data = {"user_id": 123, "name": "Alice"}
packed = msgpack.packb(data)
redis.set("user:123", packed)

Hash 存储小对象(避免 String 过多):

sql 复制代码
HSET user:123 name "Alice" age 25
  1. 避免阻塞操作

避免使用 KEYS * 查询

• 替代方案:用 SCAN 分页查询。

Lua 脚本优化

• 避免长时间执行脚本,改用小批量执行。

三、总结

如果 Redis 爆了,先降级流量 ,再优化存储结构 ,最终通过分片扩展解决长期负载问题。

相关推荐
回家路上绕了弯几秒前
CPU 打满 + 频繁 Full GC:从紧急止血到根因根治的实战指南
后端·cpu
豆苗学前端2 分钟前
JavaScript原型对象、构造函数、继承与类详解
前端·javascript·后端
oak隔壁找我4 分钟前
公司级 Maven Parent POM 设计指南
java·后端
Determined_man5 分钟前
注解
后端
11来了9 分钟前
04-Agent 武器库-集成百炼MCP(Spring AI Alibaba)
后端
TeamDev9 分钟前
使用 Shadcn UI 构建 C# 桌面应用
前端·后端·.net
uhakadotcom14 分钟前
如何从阿里云的sls日志中清洗出有价值的信息?
后端·面试·github
李昊哲小课17 分钟前
spring 中 HttpStatus 与 ResponseEntity
spring boot·后端·spring·http·spring cloud·restful
间彧38 分钟前
Java 堆、栈、方法区详解与项目实战
后端
间彧41 分钟前
Java内存区域详解与项目实战
后端