SpringBoot实战之16 整合redis哨兵

迈不过友情╰ 2022-05-18 04:15 299阅读 0赞

前言

对springboot整合redis感兴趣的可以参考此篇博客 SpringBoot实战之13 整合redis

对spring整合redis感兴趣的参考这里 spring实战3 spring整合单例redis

spring整合哨兵参考这里 spring实战4 spring整合redis哨兵

本篇介绍springboot整合哨兵模式

开始

建项目

新建springboot-redis-sentinel项目

添加maven依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-data-redis</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-test</artifactId>
  12. </dependency>
  13. <dependency>
  14. <groupId>redis.clients</groupId>
  15. <artifactId>jedis</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>com.fasterxml.jackson.core</groupId>
  19. <artifactId>jackson-databind</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>com.hsy.java</groupId>
  23. <artifactId>java-util</artifactId>
  24. </dependency>

配置文件

新建redis.properties redis配置文件

  1. #Matser的ip地址
  2. redis.host=172.16.191.102
  3. #端口号
  4. redis.port=6379
  5. #如果有密码
  6. redis.password=123456
  7. # 数据库索引
  8. redis.database=0
  9. #客户端超时时间单位是毫秒 默认是2000
  10. redis.timeout=10000
  11. #最大空闲数
  12. redis.pool.maxIdle=300
  13. #连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
  14. #redis.pool.maxActive=600
  15. #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
  16. redis.pool.maxTotal=1000
  17. #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
  18. redis.pool.maxWaitMillis=1000
  19. #连接的最小空闲时间 默认1800000毫秒(30分钟)
  20. redis.pool.minEvictableIdleTimeMillis=300000
  21. #每次释放连接的最大数目,默认3
  22. redis.pool.numTestsPerEvictionRun=1024
  23. #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
  24. redis.pool.timeBetweenEvictionRunsMillis=30000
  25. #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
  26. redis.pool.testOnBorrow=true
  27. #在空闲时检查有效性, 默认false
  28. redis.pool.testWhileIdle=true
  29. #redis集群配置
  30. # spring.redis.spool.cluster.nodes=192.168.177.128:7001,192.168.177.128:7002,192.168.177.128:7003,192.168.177.128:7004,192.168.177.128:7005,192.168.177.128:7006
  31. # spring.redis.pool.cluster.max-redirects=3
  32. #哨兵模式
  33. redis.sentinel.master.name=mymaster
  34. redis.sentinel.host1=172.16.191.102
  35. redis.sentinel.port1=26379
  36. redis.sentinel.host2=172.16.191.102
  37. redis.sentinel.port2=26380
  38. redis.sentinel.host3=172.16.191.102
  39. redis.sentinel.port3=26381

新建application.yml

  1. spring:
  2. redis:
  3. sentinel:
  4. master: mymaster
  5. nodes: 172.16.191.102:26379,172.16.191.102:26380,172.16.191.102:26381
  6. server:
  7. port: 10003

redis配置及序列化方式

  1. @Configuration
  2. @PropertySource("classpath:config/redis.properties")
  3. public class RedisConfig2 {
  4. @Value("${redis.host}")
  5. private String host;
  6. @Value("${redis.port}")
  7. private Integer port;
  8. @Value("${redis.password}")
  9. private String password;
  10. @Value("${redis.database}")
  11. private Integer database;
  12. @Value("${redis.timeout}")
  13. private Integer timeout;
  14. @Value("${redis.pool.maxIdle}")
  15. private Integer maxIdle;
  16. @Value("${redis.pool.maxTotal}")
  17. private Integer maxTotal;
  18. @Value("${redis.pool.maxWaitMillis}")
  19. private Integer maxWaitMillis;
  20. @Value("${redis.pool.minEvictableIdleTimeMillis}")
  21. private Integer minEvictableIdleTimeMillis;
  22. @Value("${redis.pool.numTestsPerEvictionRun}")
  23. private Integer numTestsPerEvictionRun;
  24. @Value("${redis.pool.timeBetweenEvictionRunsMillis}")
  25. private long timeBetweenEvictionRunsMillis;
  26. @Value("${redis.pool.testOnBorrow}")
  27. private boolean testOnBorrow;
  28. @Value("${redis.pool.testWhileIdle}")
  29. private boolean testWhileIdle;
  30. /** * JedisPoolConfig 连接池 * @return */
  31. @Bean
  32. public JedisPoolConfig jedisPoolConfig() {
  33. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  34. // 最大空闲数
  35. jedisPoolConfig.setMaxIdle(maxIdle);
  36. // 连接池的最大数据库连接数
  37. jedisPoolConfig.setMaxTotal(maxTotal);
  38. // 最大建立连接等待时间
  39. jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
  40. // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
  41. jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
  42. // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
  43. jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
  44. // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
  45. jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
  46. // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
  47. jedisPoolConfig.setTestOnBorrow(testOnBorrow);
  48. // 在空闲时检查有效性, 默认false
  49. jedisPoolConfig.setTestWhileIdle(testWhileIdle);
  50. return jedisPoolConfig;
  51. }
  52. /** * 单机版配置 * @Title: JedisConnectionFactory * @param @param jedisPoolConfig * @param @return * @return JedisConnectionFactory * @autor lpl * @date 2018年2月24日 * @throws */
  53. @Bean
  54. public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig){
  55. JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
  56. jedisConnectionFactory.setUsePool(true);
  57. //连接池
  58. jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
  59. //IP地址
  60. jedisConnectionFactory.setHostName(host);
  61. //端口号
  62. jedisConnectionFactory.setPort(port);
  63. //如果Redis设置有密码
  64. jedisConnectionFactory.setPassword(password);
  65. // 设置数据库索引号
  66. jedisConnectionFactory.setDatabase(database);
  67. //客户端超时时间单位是毫秒
  68. jedisConnectionFactory.setTimeout(timeout);
  69. return jedisConnectionFactory;
  70. }
  71. /** * 实例化 RedisTemplate 对象 * * @return */
  72. @Bean
  73. public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
  74. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  75. initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
  76. return redisTemplate;
  77. }
  78. /** * 设置数据存入 redis 的序列化方式,并开启事务 * * @param redisTemplate * @param factory */
  79. private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
  80. //如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!
  81. redisTemplate.setKeySerializer(new StringRedisSerializer());
  82. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  83. // GenericJackson2JsonRedisSerializer序列化方式
  84. //redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
  85. //redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
  86. // Jackson2JsonRedisSerializer序列化方式
  87. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  88. ObjectMapper objectMapper = new ObjectMapper();
  89. objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  90. objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  91. jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
  92. //set value serializer
  93. redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);
  94. // 开启事务
  95. redisTemplate.setEnableTransactionSupport(true);
  96. redisTemplate.setConnectionFactory(factory);
  97. redisTemplate.afterPropertiesSet();
  98. }
  99. }

增删改查

编写crud文件,由于我封装了redis得增删改查,此处仅需要简单的继承即可

  1. @Repository(value = "redisRepository")
  2. public class RedisRepository extends AbstractSpringRedisCacheEnhance {
  3. @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
  4. @Autowired
  5. RedisTemplate<String, Object> redisTemplate;
  6. @Override
  7. public StringRedisTemplate getStringRedisTemplate() {
  8. return null;
  9. }
  10. @Override
  11. public RedisTemplate<String, Object> getRedisTemplate() {
  12. return redisTemplate;
  13. }
  14. }

至此,springboot集成redis哨兵模式已经完成。

总结

springboot集成redis哨兵,我也没有找到更全面的资料,上述整合方式也是我摸索而出,

反正效果已经有了,至于其理论仍需要后续研究更新此博客。

源码

springboot-redis-sentinel

发表评论

表情:
评论列表 (有 0 条评论,299人围观)

还没有评论,来说两句吧...

相关阅读