跳绳鸭
67.76M · 2026-02-04
Redis作为当今最流行的内存数据库之一,以其高性能、低延迟和丰富的数据结构著称。然而,随着业务规模的扩大和数据量的增长,许多开发者发现Redis的性能并不总是如预期般理想。实际上,Redis的性能优化是一门需要深入理解的学问。本文将揭示5个经过验证的关键技巧,帮助你将Redis的性能提升50%甚至更多。无论你是刚接触Redis的新手,还是希望进一步提升技能的中高级开发者,这些技巧都将成为你技术工具箱中的重要武器。
Redis提供了丰富的数据结构(String、Hash、List、Set、Sorted Set等),每种结构都有其特定的时间复杂度特性。选错数据结构可能导致操作复杂度从O(1)飙升到O(N)。
SET user:1000 '{"name":"John","age":30,"city":"NY"}'
HSET user:1000 name John age 30 city NY
对于特定场景:
单个命令的执行时间可能只需要0.1ms,但网络RTT通常在10-100ms量级。不使用Pipeline相当于把高速公路变成了乡间小路。
# 普通方式 (N次网络往返)
for i in range(100):
r.get(f'key:{i}')
# Pipeline方式 (1次网络往返)
with r.pipeline() as pipe:
for i in range(100):
pipe.get(f'key:{i}')
results = pipe.execute()
Redis使用jemalloc内存分配器,其特点是会产生内存碎片。info memory命令中mem_fragmentation_ratio > 1.5就需要关注。
字符串优化
Hash的ziplist编码
# redis.conf配置示例
hash-max-ziplist-entries 512 # field数量阈值
hash-max-ziplist-value 64 # value大小阈值(字节)
共享对象池
过期键管理
L1缓存访问延迟约0.5ns,而主存访问延迟约100ns。编写CPU缓存友好的代码可以带来显著性能提升。
热点数据分离
数据结构布局优化
// Redis源码中的改进示例(sds结构体)
struct __attribute__ ((__packed__)) sdshdr32 {
uint32_t len; /* used */
uint32_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* SDS_TYPE_8/16/32/64 */
char buf[];
};
# Linux下绑定CPU核心和内存节点
taskset -c 0 redis-server /path/to/redis.conf
numactl --cpunodebind=0 --membind=0 redis-server ...
cluster-node-timeout 15000 # Gossip通信超时时间
cluster-slave-validity-factor 10 # slave数据有效性因子
cluster-migration-barrier 1 # master最小slave数
cluster-replica-no-failover no # slave是否参与故障转移
| RDB | AOF | |
|---|---|---|
| 恢复速度 | 快 | 慢 |
| 体积 | 小 | 大 |
| 安全性 | 可能丢失几分钟数据 | 最多丢失一秒数据 |
| 写入开销 | 高(全量) | 低(增量) |
save "" #禁用RDB触发条件
appendonly yes #开启AOF
aof-use-rdb-preamble yes #混合持久化模式
aofrewrite-incremental-fsync yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size