第 8 课:Redis 性能优化与最佳实践

8.1 性能优化

Redis 性能优化的核心目标是:

  • 提高吞吐量
  • 降低延迟
  • 减少内存占用
  • 提升系统稳定性

常见优化方案

优化项 说明
使用连接池 避免频繁创建和销毁连接
合理设置过期时间 及时清理过期数据
批量操作 减少网络往返次数
避免使用 Keys 防止阻塞 Redis
合理选择数据结构 提高性能和节省内存
开启持久化 提高数据安全性
使用集群 提高系统容量和并发能力

推荐做法

使用连接池

避免:

new Jedis("localhost",6379);

推荐:

JedisPool pool = new JedisPool(config);
Jedis jedis = pool.getResource();

批量操作

避免:

set user:1 zhangsan
set user:2 lisi
set user:3 wangwu

推荐:

mset user:1 zhangsan user:2 lisi user:3 wangwu

读取:

mget user:1 user:2 user:3

避免使用 Keys

危险:

keys *

原因:

  • O(N) 时间复杂度
  • 数据量大时会阻塞 Redis

推荐:

scan 0

合理使用数据结构

场景 推荐结构
用户信息 Hash
阅读量 String
消息队列 List
标签系统 Set
排行榜 ZSet

持久化最佳配置

同时开启:

  • RDB
  • AOF

推荐配置:

appendonly yes
appendfsync everysec

save 900 1
save 300 10
save 60 10000

使用 Redis 集群

适用于:

  • 数据量超过单机容量
  • QPS 过高
  • 需要高可用

8.2 内存优化

Redis 是内存数据库,因此内存优化十分重要。

使用 Hash 代替 String

不推荐:

set user:1001:name zhangsan
set user:1001:age 20
set user:1001:gender male

推荐:

hset user:1001 name zhangsan age 20 gender male

优点:

  • 节省内存
  • 查询方便
  • 更新灵活

设置合理过期时间

示例:

setex code 300 123456

避免:

set user:1001 data

永不过期的数据会长期占用内存。


压缩大 Value

例如:

  • JSON
  • 图片信息
  • 大文本内容

压缩方式:

  • GZIP
  • Snappy
  • LZ4

示例:

String compressData = gzip(jsonString);
redisUtil.set(key, compressData);

避免存储大 Value

建议:

数据类型 推荐大小
String < 1MB
Hash Field < 10KB
List 元素 < 10KB

避免:

set article:1 [10MB内容]

使用内存淘汰策略

配置:

# 最大内存
maxmemory 1gb

# 淘汰策略
maxmemory-policy allkeys-lru

常见淘汰策略

策略 说明
allkeys-lru 淘汰最近最少使用键(推荐)
volatile-lru 淘汰设置过期时间的键
allkeys-random 随机淘汰
volatile-random 随机淘汰带过期时间键
volatile-ttl 淘汰即将过期键
noeviction 不淘汰,直接报错

推荐:

maxmemory-policy allkeys-lru

8.3 安全配置

生产环境 Redis 必须进行安全加固。

设置密码

配置:

requirepass yourpassword

连接:

redis-cli -a yourpassword

绑定 IP

仅允许本机访问:

bind 127.0.0.1

如果需要远程连接:

bind 0.0.0.0

同时配合防火墙限制访问来源。


禁用危险命令

配置:

rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
rename-command CONFIG ""

作用:

防止误操作导致:

  • 数据清空
  • 配置泄露
  • 性能问题

使用防火墙

Linux:

ufw allow 6379/tcp

或者:

iptables -A INPUT -p tcp --dport 6379 -j DROP

建议:

仅开放给业务服务器访问。


8.4 最佳实践

键命名规范

推荐:

user:1001
product:2001
order:3001
cart:1001
article:view:100

命名规则:

业务名:对象ID[:属性]

示例:

user:1001
user:1001:token
product:2001
order:5001

不存储敏感数据

避免:

密码
银行卡号
身份证号
手机号明文

推荐:

加密后存储
脱敏后存储

定期备份

备份文件:

dump.rdb
appendonly.aof

建议:

  • 每日备份
  • 异地备份
  • OSS 备份

监控 Redis

常用命令:

info

查看:

内存使用情况
CPU占用
连接数
命中率
主从状态

慢查询分析

开启:

slowlog-log-slower-than 10000
slowlog-max-len 128

查看:

slowlog get

避免耗时操作

不要:

keys *
flushall
lrange key 0 1000000

推荐:

scan

8.5 常见问题排查

Redis 连接超时

排查:

检查服务状态

ps -ef | grep redis

测试端口

telnet ip 6379

查看配置

redis-cli ping

返回:

PONG

说明连接正常。


Redis 内存不足

查看:

info memory

重点关注:

used_memory
maxmemory

解决:

  • 增加内存
  • 设置过期时间
  • 删除无用数据
  • 开启淘汰策略

Redis 性能下降

查看:

info stats

分析:

slowlog get

检查是否存在:

keys *
大Key
慢查询
频繁持久化

数据丢失

检查:

RDB 是否开启

config get save

AOF 是否开启

config get appendonly

查看结果:

appendonly
yes

说明已开启。


本课总结

Redis 性能优化重点

  • 使用连接池
  • 批量操作
  • 合理选择数据结构
  • 避免 Keys
  • 合理设置过期时间

Redis 内存优化重点

  • Hash 替代 String
  • 控制 Value 大小
  • 设置淘汰策略

Redis 安全重点

  • 设置密码
  • 限制访问 IP
  • 禁用危险命令
  • 配置防火墙

Redis 高性能架构重点

  • 主从复制
  • 哨兵模式
  • Redis Cluster

课后练习

练习 1

配置 Redis 内存淘汰策略:

maxmemory 512mb
maxmemory-policy allkeys-lru

观察内存达到上限后的表现。


练习 2

开启慢查询日志:

slowlog-log-slower-than 10000

执行大量命令并查看:

slowlog get

练习 3

配置 Redis 安全策略:

requirepass yourpassword

rename-command FLUSHALL ""
rename-command KEYS ""

测试效果。


练习 4

使用 Redis Benchmark 测试性能:

redis-benchmark -h localhost -p 6379 -n 100000 -c 50

分析:

  • QPS
  • 平均响应时间
  • 最大响应时间

练习 5

整理一份 Redis 生产环境配置文件:

  • 持久化
  • 安全配置
  • 内存优化
  • 集群配置

形成自己的 Redis 运维手册。