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 缓存场景推荐哪种淘汰策略?