运维与集成
→ 返回 Redis
分布式避坑清单
| 类别 | 坑 | 建议 |
|---|---|---|
| 复制 | 从库读旧 | 关键读主;监控 lag |
| 哨兵 | 脑裂双写 | min-replicas;自动发现主 |
| 集群 | 热 key | 拆分、本地缓存 |
| 集群 | 大 key | 拆分、UNLINK、禁 KEYS |
| 锁 | 过期误释放 | 看门狗 + 短临界区 |
| 缓存 | 穿透/击穿/雪崩 | 见 缓存与一致性 |
| 事务 | 跨 slot | 哈希标签 |
| 运维 | 误删 | ACL、禁用危险命令 |
| 内存 | 无 maxmemory | 必须限制 + 淘汰 |
| 网络 | 重试风暴 | 退避、熔断 |
与 CAP
| 部署 | 倾向 |
|---|---|
| 单机 | CP 倾向,持久化决定 A |
| 主从异步 | AP,有复制延迟 |
| Sentinel failover | 可能丢最后写入 |
| Cluster | 分区时部分 slot 不可用 |
缓存层通常 最终一致;资金/库存靠 DB + 锁 + 幂等。
性能与运维
连接池
spring.data.redis.lettuce.pool:
max-active: 16
max-idle: 8
min-idle: 2
max-wait: 1000ms避免连接过多;Pipeline 减 RTT。
慢查询与大 key
SLOWLOG GET 10
redis-cli --bigkeys
redis-cli --hotkeys
MEMORY USAGE key禁用 KEYS *;用 SCAN。
序列化
String key + JSON value;避免 Java 默认序列化。
ACL(6.0+)
ACL SETUSER app on >password ~cache:* +@read +@write -@dangerousSpring Boot 集成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
</dependency>spring:
data:
redis:
host: localhost
port: 6379
lettuce:
pool:
max-active: 16
cluster:
nodes: host1:7000,host2:7001
max-redirects: 3// Cache-Aside
public User getUser(Long id) {
String key = "user:" + id;
User cached = (User) redisTemplate.opsForValue().get(key);
if (cached != null) return cached;
User dbUser = userMapper.selectById(id);
if (dbUser != null) {
redisTemplate.opsForValue().set(key, dbUser, Duration.ofMinutes(30));
} else {
redisTemplate.opsForValue().set(key, "", Duration.ofMinutes(5));
}
return dbUser;
}