前言
在高并发场景下,Redis 的性能表现直接影响系统整体响应速度。然而,不当的配置、低效的命令使用或资源瓶颈都可能导致性能下降。本文将从内存优化、命令执行效率、慢查询分析到全方位监控体系构建,结合 Java 代码示例,提供系统性的 Redis 性能调优方案。
一、内存优化技巧
1. 内存分配策略调优
# redis.conf关键配置
maxmemory 4gb # 限制最大内存使用
maxmemory-policy allkeys-lru # 内存不足时按LRU淘汰
maxmemory-samples 5 # LRU采样数(提高准确性)
2. 数据结构优化
(1)压缩列表应用
// 配置hash-max-ziplist-entries和hash-max-ziplist-value
// 当哈希元素少于512且值小于64字节时使用压缩列表
redis-cli config set hash-max-ziplist-entries 512
redis-cli config set hash-max-ziplist-value 64
// Java代码示例
Jedis jedis = new Jedis("localhost");
Map<String, String> userInfo = new HashMap<>();
userInfo.put("name", "Alice");
userInfo.put("age", "30");
userInfo.put("city", "Beijing");
jedis.hmset("user:1001", userInfo); // 使用压缩列表存储
(2)整数集合优化
// 当集合元素全为整数且少于512个时使用整数集合
redis-cli config set set-max-intset-entries 512
// 纯整数集合
jedis.sadd("numbers", "1", "2", "3"); // 使用intset编码
3. 内存碎片处理
# 自动碎片整理配置
activedefrag yes
active-defrag-threshold-lower 10 # 碎片率超过10%开始整理
active-defrag-threshold-upper 100 # 碎片率超过100%强制整理
active-defrag-cycle-min 25 # 最小整理CPU使用率
active-defrag-cycle-max 75 # 最大整理CPU使用率
二、命令执行效率优化
1. 批量操作实践
(1)Pipeline 批量处理
// 未使用Pipeline的逐条操作(1000次网络往返)
for (int i = 0; i < 1000; i++) {
jedis.set("key:" + i, "value:" + i);
}
// 使用Pipeline优化(1次网络往返)
Pipeline pipeline = jedis.pipelined();
for (int i = 0; i < 1000; i++) {
pipeline.set("key:" + i, "value:" + i);
}
pipeline.sync();
(2)Lua 脚本原子化操作
// 原子化的先检查后操作(Check-and-Set)
String script =
"if redis.call('get', KEYS[1]) == ARGV[1] then " +
" return redis.call('set', KEYS[1], ARGV[2]) " +
"else " +
" return 0 " +
"end";
List<String> keys = Collections.singletonList("counter");
List<String> args = Arrays.asList("100", "200");
jedis.eval(script, keys, args);
2. 避免大 Key 操作
(1)大 Key 检测工具
// 扫描大Key的Java实现
public void findBigKeys(Jedis jedis) {
ScanParams params = new ScanParams().count(1000);
String cursor = ScanParams.SCAN_POINTER_START;
do {
ScanResult<String> result = jedis.scan(cursor, params);
List<String