首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring Boot 整合 JedisCluster 實現 Redis Cluster 緩存操作完整教程

     編輯:Java 綜合教學

Spring Boot 整合 JedisCluster 實現 Redis Cluster 緩存操作完整教程

適用場景

  • Redis 2.x → 客戶端分片;
  • Redis 3.x+ Cluster 模式 → JedisCluster(智能路由、自動重定向、故障轉移)。

項目結構

com.xxx.firstboot
├── common.MyConstants          // 緩存前綴常量
├── domain.User                 // 實體
├── redis
│   ├── RedisProperties         // @ConfigurationProperties 綁定配置
│   ├── JedisClusterConfig      // @Configuration + @Bean 暴露單例 JedisCluster
│   └── MyRedisTemplate         // 封裝 set/get/del/expire 等業務方法
├── service.UserService
├── web.UserController          // REST 測試端點
└── Application                 // 啟動類

核心配置

application.properties

redis.cache.clusterNodes=localhost:8080,localhost:8081  # 多節點逗號分隔
redis.cache.commandTimeout=5000        # 毫秒
redis.cache.expireSeconds=120          # 默認過期時間

RedisProperties.java

@Component
@ConfigurationProperties(prefix = "redis.cache")
public class RedisProperties {
    private int expireSeconds;
    private String clusterNodes;
    private int commandTimeout;
    // getter/setter
}

JedisClusterConfig.java —— 單例核心

@Configuration
public class JedisClusterConfig {
    @Autowired RedisProperties props;

    @Bean
    public JedisCluster jedisCluster() {
        Set<HostAndPort> nodes = new HashSet<>();
        for (String hp : props.getClusterNodes().split(",")) {
            String[] p = hp.split(":");
            nodes.add(new HostAndPort(p[0].trim(), Integer.parseInt(p[1].trim())));
        }
        return new JedisCluster(nodes, props.getCommandTimeout());
        // 生產建議補全 JedisPoolConfig:maxTotal, maxIdle, minIdle, maxWaitMillis 等
    }
}

關鍵點:@Bean 方法返回單例,可直接 @Autowired 注入其他組件;若用 @Component 類級別則每次調用產生新實例。

MyRedisTemplate.java —— 業務封裝

@Component
public class MyRedisTemplate {
    @Autowired JedisCluster jedisCluster;
    @Autowired RedisProperties props;
    private static final String SPLIT = ":";

    public void set(String prefix, String key, String val) {
        jedisCluster.set(prefix + SPLIT + key, val);
    }
    public void setWithExpireTime(String prefix, String key, String val) {
        jedisCluster.setex(prefix + SPLIT + key, props.getExpireSeconds(), val);
    }
    public String get(String prefix, String key) {
        return jedisCluster.get(prefix + SPLIT + key);
    }
    public void delete(String prefix, String key) {
        jedisCluster.del(prefix + SPLIT + key);
    }
    // List/Set/ZSet/Hash 操作同理調用 jedisCluster 對應 API
}

緩存 Key 設計規範

public class MyConstants {
    public static final String USER_FORWARD_CACHE_PREFIX = "myboot:user";
}
  • 業務前綴 + 冒號 + 業務鍵,防止 Key 衝突;
  • 便於 redis-cli --scan --pattern "myboot:user:*" 批量運維。

Controller 測試

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired UserService userService;
    @Autowired MyRedisTemplate redis;

    @GetMapping("/testJedisCluster")
    public User test(@RequestParam String username) {
        String val = redis.get(MyConstants.USER_FORWARD_CACHE_PREFIX, username);
        if (StringUtils.isBlank(val)) {
            redis.set(MyConstants.USER_FORWARD_CACHE_PREFIX, username, JSON.toJSONString(userService.getUser()));
            return null; // 首次預熱
        }
        return JSON.parseObject(val, User.class);
    }
}

驗證方式

  1. 瀏覽器 localhost:8080/user/testJedisCluster?username=xxx 兩次,第二次應命中緩存;
  2. 或用 Redis Desktop Manager 直觀查看 Key/Value/TTL。

生產環境補充建議

  • 完善 JedisPoolConfig:連接池大小、閒置驗證、獲取超時;
  • 啟用 readFromReplicas 讀寫分離;
  • Key 設計加上版本號/租戶 ID,支持多環境隔離;
  • 監控:慢查詢、命中率、內存碎片率、集群節點健康度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved