springBoot 整合 Redis哨兵/讀寫分離/Lettuce


pom.xml

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- 提供Redis連接池 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

 

配置文件

server:
  port: 9001
spring:
  redis:
#    host: 172.16.180.23 
#    port: 6379
#    database: 0
#    password: ''
    timeout: 6000
    ###################以下為redis哨兵增加的配置###########################
    sentinel:
      nodes: 172.16.180.23:26379,172.16.180.23:26380,172.16.180.23:26381
      master: mymaster
    ###################以下為lettuce連接池增加的配置###########################
    lettuce:
      pool:
        max-active:  100 # 連接池最大連接數(使用負值表示沒有限制)
        max-idle: 100 # 連接池中的最大空閑連接
        min-idle: 50 # 連接池中的最小空閑連接
        max-wait: 6000 # 連接池最大阻塞等待時間(使用負值表示沒有限制
RedisTemplate配置


@Configuration
@Slf4j
public class RedisConfiguration {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory factory) {
        //創建Json序列化對象
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);

        //解決查詢緩存轉換異常的問題
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        // 將默認序列化改為Jackson2JsonRedisSerializer序列化
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setKeySerializer(jackson2JsonRedisSerializer);// key序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);// value序列化
        template.setHashKeySerializer(jackson2JsonRedisSerializer);// Hash key序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化
        template.setConnectionFactory(factory);
        template.afterPropertiesSet();
        return template;
    }

}
Redis哨兵配置
@Configuration
@ConfigurationProperties(prefix = "spring.redis.sentinel")
public class RedisSentinelConfig {
    @Value("spring.redis.timeout.sentinel.nodes")
    private Set<String> nodes;
    @Value("spring.redis.timeout.sentinel.master")
    private String master;

    @Value("${spring.redis.timeout}")
    private long timeout;
    //@Value("${spring.redis.password}")
    //private String password;
    @Value("${spring.redis.lettuce.pool.max-idle}")
    private int maxIdle;
    @Value("${spring.redis.lettuce.pool.min-idle}")
    private int minIdle;
    @Value("${spring.redis.lettuce.pool.max-wait}")
    private long maxWait;
    @Value("${spring.redis.lettuce.pool.max-active}")
    private int maxActive;


    @Bean
    public RedisConnectionFactory lettuceConnectionFactory() {
        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration(master, nodes);
        NamedNode master = redisSentinelConfiguration.getMaster();
        String name = master.getName();
        //redisSentinelConfiguration.setPassword(RedisPassword.of(password.toCharArray()));
        GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
        genericObjectPoolConfig.setMaxIdle(maxIdle);
        genericObjectPoolConfig.setMinIdle(minIdle);
        genericObjectPoolConfig.setMaxTotal(maxActive);
        genericObjectPoolConfig.setMaxWaitMillis(maxWait);
        //readFrom(ReadFrom.REPLICA) 可設置,設置了就形成讀寫分離,讀會讀取從節點,但是因為有復制過程,要能容忍短時間的臟數據,適合對數據要求不太及時的
        LettucePoolingClientConfiguration lettuceClientConfiguration = LettucePoolingClientConfiguration.builder()
                .poolConfig(genericObjectPoolConfig).readFrom(ReadFrom.REPLICA)
                .build();


        return new LettuceConnectionFactory(redisSentinelConfiguration, lettuceClientConfiguration);
    }


    public void setNodes(Set<String> nodes) {
        this.nodes = nodes;
    }

    public void setMaster(String master) {
        this.master = master;
    }

}
RedisService
@Service
public class RedisSentinelService {

    @Autowired
    @Resource(name = "stringRedisTemplate")
    private RedisTemplate redisTemplate;

    public void redisM1(){
        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set("s1","測試redis聯通");
    }
}
RediSentinelController
@RestController
@RequestMapping("/rediSentinel")
public class RediSentinelController {

    @Autowired
    private RedisSentinelService redisSentinelService;

    @GetMapping("redisSentinelM1")
    public void redisSentinelM1() {
        redisSentinelService.redisM1();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM