ToolkitX
知识库工具箱

性能优化

内存优化、慢查询、Pipeline

25min·高级

01. 内存优化——省着点用

Redis 虽快,数据全在内存,内存就是真金白银。优化关键:用小而精的数据结构(能用 Hash 别用多个 String)、设好过期时间(别让冷数据一直占着)、避免大 key(一个 key 几 MB 又占内存又拖性能)。
bash
# 看内存
INFO memory
MEMORY USAGE mykey        # 某 key 占多少
MEMORY DOCTOR             # Redis 内存诊断建议

# 看大 key(生产慎用)
redis-cli --bigkeys

# 设最大内存和淘汰策略
maxmemory 2gb
maxmemory-policy allkeys-lru
务必配置 maxmemory 和淘汰策略,不然内存满了 Redis 直接拒绝写入甚至崩溃。

02. 内存淘汰策略

内存满了要淘汰 key。几种策略: noeviction——不淘汰直接拒绝写入(默认,一般不这么用) allkeys-lru——在所有 key 里淘汰最近最少用的(缓存场景推荐) volatile-lru——只在设了过期的 key 里淘汰 allkeys-random——随机淘汰 volatile-ttl——优先淘汰剩余寿命最短的 缓存场景推荐 allkeys-lru。

03. 避免慢查询

Redis 单线程执行命令,一个慢命令让所有人排队等。要特别避免: 禁用 KEYS * 用 SCAN 大 key 的 DEL 用 UNLINK(异步删除,Redis 4.0+) SORT、SUNION 等集合操作数据量大时极慢 SMEMBERS 是 O(N),大 Set 慎用
bash
# 排查慢查询
SLOWLOG GET 10            # 最近 10 条慢查询
SLOWLOG RESET

# 配置
slowlog-log-slower-than 10000  # 超 10ms 就算慢

04. 连接池与 Pipeline

频繁建连断开开销大,务必用连接池。主流客户端都内置了。配合 Pipeline 批量发命令,吞吐提升几十倍。
javascript
// Node.js ioredis + Pipeline
const Redis = require('ioredis');
const redis = new Redis({ host: 'localhost', port: 6379 });

const pipeline = redis.pipeline();
pipeline.set('a', 1);
pipeline.set('b', 2);
pipeline.get('a');
const results = await pipeline.exec();

知识测验

1/5正确 0

Redis 缓存场景推荐哪种淘汰策略?