各位被单机Redis折磨的筒子们!今天我们要把SpringBoot的小破单车升级成Redis集群的宇宙飞船!别担心,这比教爸妈用智能手机简单多了(可能吧)~ 🚀
第一幕:集群版婚书(yml配置)
spring:
redis:
cluster:
nodes: # 集群节点地址(建议写3主3从)
- 192.168.1.101:7001
- 192.168.1.102:7002
- 192.168.1.103:7003
max-redirects: 3 # 最大跳转次数,别设成666!
password: 你的密码不是password吧?
lettuce:
pool:
max-active: 16 # 连接池要够大,别像食堂窗口那么少
max-idle: 8
min-idle: 2
timeout: 3000ms # 超时设长点,网络不好时别急着分手
避坑指南:
- 地址别带
redis://
前缀!(和单机配置反着来) - 所有节点必须使用相同密码!(别学某些渣男区别对待)
- 记得开放所有节点的防火墙端口!(包括总线端口:通常6379+10000)
第二幕:集群の花式操作
自动注入の神兵利器:
@Autowired
private RedisTemplate<String, Object> redisTemplate; // 还是熟悉的配方
// 存数据像往火锅里下菜一样简单
redisTemplate.opsForValue().set("重庆火锅", "九宫格");
// 取数据比捞火锅里的毛肚还快
Object hotpot = redisTemplate.opsForValue().get("重庆火锅");
高级操作の禁忌之舞:
// 集群模式下慎用!会报MOVED错误!
Set<String> keys = redisTemplate.keys("*");
// 正确姿势:用SCAN命令(虽然像海底捞一样费劲)
Cursor<byte[]> cursor = redisTemplate.scan(ScanOptions.scanOptions().match("*").build());
while (cursor.hasNext()) {
// 处理每个键
}
第三幕:保命配置の玄学
1. 序列化の整容手术:
@Configuration
public class RedisClusterConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 使用JSON序列化(别再用JDK的二进制密文了!)
template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
2. 故障转移の金钟罩:
spring:
redis:
lettuce:
cluster:
refresh:
adaptive: true # 开启拓扑刷新
period: 2000ms # 每2秒检查一次节点健康
3. 连接池の防崩指南:
lettuce:
pool:
test-while-idle: true # 定期体检连接
time-between-eviction-runs: 30000ms # 每30秒踢掉不健康的连接
第四幕:翻车现场の真人秀
惨案1:跨槽位操作
// 试图用多个key操作不同槽位 → 直接报错!
redisTemplate.opsForValue().multiSet(Map.of(
"北京烤鸭", "全聚德", // 可能分配到不同节点
"上海生煎", "小杨生煎"
));
// 正确姿势:使用hash tag强制同槽位
redisTemplate.opsForValue().set("{food}.北京烤鸭", "全聚德");
redisTemplate.opsForValue().set("{food}.上海生煎", "小杨生煎");
惨案2:事务の量子纠缠
redisTemplate.execute(new SessionCallback<>() {
// 集群模式下事务只能在一个节点操作!
// 需要所有key在同一个槽位,否则表演失败
});
惨案3:缓存注解の神秘失效
@Cacheable(value = "users", key = "#userId")
// 需要确保所有缓存操作都符合集群规范
// 建议给cacheName加hash tag:@Cacheable(value = "{users}")
终极大招:集群健康の把脉术
1. 命令行诊断:
redis-cli -c -h 集群节点IP -p 端口 cluster nodes
# 查看节点状态,确保所有节点都是connected
2. 监控接入:
management:
endpoints:
web:
exposure:
include: health,redis
endpoint:
health:
show-details: always
访问/actuator/health
查看集群状态:
{
"status": "UP",
"components": {
"redis": {
"status": "UP",
"details": {
"clusterSize": 6,
"slotsCovered": 16384 // 必须覆盖所有槽位!
}
}
}
}
最后送上集群の宇宙真理:
生产环境至少3主3从!
(别试图用两个节点组集群,就像不能两人斗地主!)
现在你已获得"SpringBoot+Redis集群架构师"认证!要不要挑战用集群实现全球分布式Session?(然后发现时区问题让人头秃)