SpringBoot邂逅Redis集群:从单间到豪华别墅的搬迁指南!

各位被单机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 # 超时设长点,网络不好时别急着分手

避坑指南

  1. 地址别带redis://前缀!(和单机配置反着来)
  2. 所有节点必须使用相同密码!(别学某些渣男区别对待)
  3. 记得开放所有节点的防火墙端口!(包括总线端口:通常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?(然后发现时区问题让人头秃)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五行星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值