<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringBoot下集成Redis Cluster集群實踐

          共 6066字,需瀏覽 13分鐘

           ·

          2023-08-30 12:18

          這里介紹SpringBoot下如何連接Redis Cluster集群進行訪問操作?
          abstract.png

          POM

          這里Redis Cluster集群為3主3從的架構模式,其中Redis版本為7.0。SpringBoot及其相關依賴的版本如下所示。Spring Boot 2.X版本開始,其使用的Redis客戶端由Jedis變?yōu)長ettuce。Lettuce提供了對Redis Cluster集群中MOVED、ASK重定向的支持

          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.7.6</version>
              <relativePath/> <!-- lookup parent from repository -->
          </parent>

          <properties>
              <java.version>8</java.version>
          </properties>

          <dependencies>

              <!-- Redis -->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-data-redis</artifactId>
              </dependency>

              <!--集成redis組件所需的common-pool2-->
              <dependency>
                  <groupId>org.apache.commons</groupId>
                  <artifactId>commons-pool2</artifactId>
              </dependency>

              ...
              
          </dependencies>

          配置文件

          SpringBoot下application.properties配置文件中關于Redis的配置如下所示。由于Lettuce客戶端默認不開啟集群拓撲刷新功能。故連接Redis集群時,我們需要開啟Lettuce客戶端對集群拓撲的刷新功能。以便在集群節(jié)點進行主從切換后,Lettuce客戶端可以感知到集群節(jié)點的變化。具體地,Lettuce提供了三種刷新集群拓撲的方式:

          • 通過主動調(diào)用 RedisClusterClient.reloadPartitions 方式進行手動刷新
          • 后臺定時刷新
          • 后臺自適應刷新(基于鏈接斷開、MOVED/ASK重定向)

          在SpringBoot2.3.x后,可直接通過spring.redis.lettuce.cluster.refresh.adaptive、spring.redis.lettuce.cluster.refresh.period 配置項開啟自適應刷新、定時刷新功能

          # Redis 集群信息配置

          # Redis 數(shù)據(jù)庫索引
          spring.redis.database=0
          # Redis 服務器連接密碼
          spring.redis.password=52996
          # 連接超時時間, Unit: 毫秒
          spring.redis.timeout=1000
          # 集群所有(主、從)節(jié)點地址信息
          spring.redis.cluster.nodes=120.120.120.11:6379,120.120.120.12:6379,120.120.120.13:6379,120.120.120.14:6379,120.120.120.15:6379,120.120.120.16:6379
          # 重定向的最大次數(shù)
          spring.redis.cluster.max-redirects=3

          # Redis客戶端Lettuce配置

          # 使能集群拓撲自適應刷新,默認值:false
          spring.redis.lettuce.cluster.refresh.adaptive=true
          # 集群拓撲定時刷新周期,Unit:毫秒
          spring.redis.lettuce.cluster.refresh.period=30000

          # 連接池最大連接數(shù)(使用負值表示沒有限制) 默認 8
          spring.redis.lettuce.pool.max-active=-1
          # 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1
          spring.redis.lettuce.pool.max-wait=-1
          # 連接池中的最大空閑連接 默認 8
          spring.redis.lettuce.pool.max-idle=8
          # 連接池中的最小空閑連接 默認 0
          spring.redis.lettuce.pool.min-idle=0

          配置類

          SpringBoot中Redis配置類如下所示

          @Slf4j
          @Configuration
          public class RedisConfig extends CachingConfigurerSupport{
              // Redis 配置類
              // 自定義的RedisTemplate的Bean名稱必須為 redisTemplate。當方法名不為 redisTemplate時,可通過name顯示指定bean名稱,@Bean(name="redisTemplate")
              @Bean(name = "redisTemplate")
              public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
                  RedisTemplate<String, String> template = new RedisTemplate<>();
                  template.setConnectionFactory(redisConnectionFactory);
                  // 設置String Key序列化
                  template.setKeySerializer( getKeySerializer() );
                  template.setValueSerializer( getValueSerializer() );
                  // 設置Hash Key序列化
                  template.setHashKeySerializer( getKeySerializer() );
                  template.setHashValueSerializer( getValueSerializer() );
                  log.info("自定義RedisTemplate配置完成 ... ");
                  return template;
              }

              // key 采用String序列化
              private RedisSerializer<String> getKeySerializer() {
                  return new StringRedisSerializer();
              }

              // value 采用Json序列化
              private RedisSerializer<Object> getValueSerializer() {
                  return new GenericJackson2JsonRedisSerializer();
              }
          }

          使用

          這里我們直接通過Controller來驗證

          @RestController
          @RequestMapping("test")
          public class TestController {

              @Autowired
              private RedisTemplate redisTemplate;

              @GetMapping("/setRedisData")
              public void setRedisData(@RequestParam String key, @RequestParam Object value) {
                  redisTemplate.opsForValue().set(key, value);
              }

              @GetMapping("/getRedisData")
              public String getRedisData(@RequestParam String key) {
                  Object value = redisTemplate.opsForValue().get(key);
                  return key + " --->>> " + value;
              }
          }

          測試結果如下,符合預期

          figure 1.jpg

          瀏覽 141
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人操人人看人人 | 豆花免费跳转入口官网 | 优希麻琴无码一区二区三区 | а 中文在线天堂精品 | 大香蕉精品电影 |