11. 性能优化
11.1 Pipeline —— 批量发送
🚀 比喻:普通模式就像「一个快递一个快递地寄」,Pipeline 就像「攒一堆快递一起寄」,减少网络往返次数。
bash
# 普通模式:10000 次 GET = 10000 次网络往返
# Pipeline 模式:10000 次 GET = 1 次网络往返
# redis-cli 中使用 Pipeline
# 先准备命令文件 commands.txt:
SET key1 val1
SET key2 val2
SET key3 val3
GET key1
GET key2
GET key3
# 批量执行
cat commands.txt | redis-cli --pipe
# Python 示例(redis-py)
pipe = redis_client.pipeline(transaction=False)
for i in range(10000):
pipe.set(f"key:{i}", f"value:{i}")
results = pipe.execute() # 一次性发送所有命令bash
All data transferred. Waiting for the last reply...
Last reply sent from server.
errors: 0, replies: 6💡 提示: Pipeline 不是原子操作,但比逐条命令快 5-10 倍。适合批量导入、批量查询等场景。
11.2 慢查询日志
bash
# 配置慢查询阈值
CONFIG SET slowlog-log-slower-than 10000 # 超过 10ms 记录
CONFIG SET slowlog-max-len 128 # 最多保存 128 条
# 查看慢查询日志
SLOWLOG GET 10
# 查看慢查询条数
SLOWLOG LEN
# 清空慢查询日志
SLOWLOG RESETbash
OK
OK
1) 1) (integer) 125
2) (integer) 1704067200
3) (integer) 15234
4) 1) "KEYS"
2) "*"
5) "192.168.1.50:54321"
6) ""
2) 1) (integer) 124
2) (integer) 1704067150
3) (integer) 52100
4) 1) "SORT"
2) "mylist"
3) "LIMIT"
4) "0"
5) "10000"
5) "192.168.1.50:54322"
6) ""
(integer) 126
OK11.3 大 Key 检测
大 Key 是 Redis 性能的隐形杀手!一个包含 100 万元素的 List,删除时会阻塞服务器数百毫秒。
bash
# 方法一:redis-cli 大 Key 扫描(生产安全,不会阻塞)
redis-cli --bigkeys
# 方法二:MEMORY USAGE 查看单个 key 的内存占用
MEMORY USAGE user:1001
# 方法三:使用 SCAN + TYPE + 子命令检测
# 扫描并检查每个 key 的大小
redis-cli --memkeys
# 方法四:查看单个 key 的编码和元素数
OBJECT ENCODING user:1001
OBJECT HELPbash
# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type.
[00.00%] Biggest string found so far 'user:1001:name' with 5 bytes
[45.00%] Biggest hash found so far 'cache:product_all' with 50000 fields
[100.00%] Biggest list found so far 'queue:tasks' with 998765 items
-------- summary -------
Sampled 157432 keys in the keyspace!
Total key length in bytes is 4722960 (avg len 30.00)
Biggest string found 'session:token_xyz' has 524288 bytes
Biggest hash found 'cache:product_all' has 50000 fields
Biggest list found 'queue:tasks' has 998765 items
Biggest set found 'users:online' has 125000 members
Biggest zset found 'leaderboard:game1' has 200000 members
(integer) 80
"ziplist"bash
# 安全删除大 Key(异步删除,不阻塞主线程)
UNLINK big_key_name
# 或者用 UNLINK 批量删除
UNLINK key1 key2 key3
# 配置惰性删除的阈值
CONFIG SET lazyfree-lazy-expire yes
CONFIG SET lazyfree-lazy-server-del yes⚠️ 注意: 永远不要在生产环境使用KEYS *!它会扫描所有键并阻塞服务器。请用SCAN代替。