Redis 是基于内存的键值数据库,其性能瓶颈通常在于内存、网络和持久化配置。
1. 内存管理
- 设置内存上限与淘汰策略
maxmemory 2gb:设置 Redis 可使用的最大内存,建议为系统物理内存的70%-80%,为系统和其他进程留出空间。
maxmemory-policy allkeys-lru:定义内存达到上限时的数据淘汰策略。allkeys-lru(所有键中最近最少使用的)适用于缓存场景;若数据不能丢失,可使用 volatile-lru(仅淘汰设定了过期时间的键)。
- 优化数据结构
- 使用 Hash(哈希)来存储对象(如用户信息),而不是为每个字段存储一个单独的 String,以减少 Key 的数量和内存元数据开销。
- 对于小型聚合数据,可通过
hash-max-ziplist-entries 等参数启用 ziplist 编码,节省内存。
2. 持久化策略
根据数据安全性和性能要求平衡 RDB 和 AOF。
- RDB (快照):生成数据快照,恢复快。
save 900 1:在900秒内至少有1个key发生变化,则触发快照。可根据数据变更频率调整 save 参数。
- AOF (追加文件):记录每个写命令,数据安全性更高。
appendonly yes:启用 AOF。
appendfsync everysec:每秒同步一次,在性能和数据安全间取得平衡。对数据安全性要求极高的场景可设置为 always,但性能会下降。
- 混合持久化 (Redis 4.0+):
aof-use-rdb-preamble yes,结合 RDB 的快速恢复和 AOF 的增量数据安全,推荐使用。
3. 内核与网络优化
- 系统内核参数
vm.overcommit_memory = 1:设置为1,允许内存超额分配,防止在生成 RDB 快照或 AOF 重写时因 fork 操作失败。
- 禁用透明大页 (Transparent Huge Pages):执行
echo never > /sys/kernel/mm/transparent_hugepage/enabled,因为 THP 可能导致 Redis 延迟增加。
- 网络与连接
maxclients 10000:根据服务器资源调整最大客户端连接数。
tcp-keepalive 300:定期检测不活跃的连接并关闭,释放资源。
4. 高可用与监控
- 慢查询日志:
slowlog-log-slower-than 10000:记录执行时间超过10毫秒的命令。
slowlog-max-len 128:慢查询日志的最大长度。
通过 SLOWLOG GET 命令查看和分析慢查询。
- 监控:使用
INFO 命令获取内存使用 (used_memory)、连接数 (connected_clients)、操作数 (instantaneous_ops_per_sec) 等关键指标。