Spring boot 配置 Redis哨兵模式

- 日理万妓 2022-05-08 14:56 1466阅读 0赞

Spring官方提供了Redis哨兵的配置,这篇文章主要指导读者手动配置Redis哨兵模式
ps: 参考我的文章<<Spring boot 配置 Redis集群模式>>可将该配置改成按资源文件加载

以下是我搜集并整理出来的一个configuration,不足之处或错误请大家提出并指正

  1. package cn.xt.config;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.data.redis.connection.RedisNode;
  8. import org.springframework.data.redis.connection.RedisSentinelConfiguration;
  9. import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
  10. import org.springframework.data.redis.core.RedisTemplate;
  11. import org.springframework.util.StringUtils;
  12. import javax.naming.Context;
  13. import javax.naming.InitialContext;
  14. import java.util.HashSet;
  15. import java.util.Set;
  16. /**
  17. * Redis 配置集群
  18. */
  19. @Configuration
  20. public class RedisConfig {
  21. private final Logger logger = LoggerFactory.getLogger(RedisConfig.class);
  22. @Value("${redis.jndi-name}")
  23. private String redisJndiName;
  24. /**
  25. * 创建连接工厂
  26. * @return
  27. */
  28. @Bean
  29. public JedisConnectionFactory createConnectionFactory() {
  30. JedisConnectionFactory jedisConnectionFactory = null;
  31. // 哨兵模式
  32. RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
  33. try {
  34. // 加载JNDI配置(因为有些敏感信息运维是不希望IT直接看到的)
  35. Context context = new InitialContext();
  36. RedisConfigBean redisConfigBean = (RedisConfigBean)context.lookup(redisJndiName);
  37. // 设置哨兵Master
  38. redisSentinelConfiguration.setMaster(redisConfigBean.getMasterName());
  39. // 获取到所有节点
  40. Set<String> serviceRedisNodes = redisConfigBean.getSentinelNodes();
  41. // 转换成Redis点节
  42. Set<RedisNode> sentinelNodes = new HashSet<>();
  43. for(String node : serviceRedisNodes) {
  44. String[] ipAndPort = StringUtils.split(node, ":");
  45. String ip = ipAndPort[0];
  46. Integer port = Integer.parseInt(ipAndPort[1]);
  47. sentinelNodes.add(new RedisNode(ip, port));
  48. }
  49. redisSentinelConfiguration.setSentinels(sentinelNodes);
  50. // 创建连接工厂
  51. jedisConnectionFactory = new JedisConnectionFactory(redisSentinelConfiguration, redisConfigBean.getMasterPoolConfig());
  52. jedisConnectionFactory.setDatabase(redisConfigBean.getDatabase());
  53. jedisConnectionFactory.setPassword(redisConfigBean.getPassword());
  54. } catch (Exception e) {
  55. logger.error("创建Redis连接工厂错误:{}", e);
  56. }
  57. return jedisConnectionFactory;
  58. }
  59. /**
  60. * 注册RedisTemplate
  61. * @param factory 连接工厂
  62. * @return
  63. */
  64. @Bean
  65. public RedisTemplate registerRedisTemplate(JedisConnectionFactory factory) {
  66. RedisTemplate redisTemplate = new RedisTemplate();
  67. redisTemplate.setConnectionFactory(factory);
  68. return redisTemplate;
  69. }
  70. }
  71. package cn.xt.config;
  72. import redis.clients.jedis.JedisPoolConfig;
  73. import java.util.Set;
  74. /**
  75. * Redis配置(若为规范项目,该类包名请配置到项目的DTO中)
  76. */
  77. public class RedisConfigBean {
  78. private String masterName;
  79. private Set<String> sentinelNodes;
  80. private JedisPoolConfig masterPoolConfig;
  81. private Integer database;
  82. private String password;
  83. public String getMasterName() {
  84. return masterName;
  85. }
  86. public void setMasterName(String masterName) {
  87. this.masterName = masterName;
  88. }
  89. public Set<String> getSentinelNodes() {
  90. return sentinelNodes;
  91. }
  92. public void setSentinelNodes(Set<String> sentinelNodes) {
  93. this.sentinelNodes = sentinelNodes;
  94. }
  95. public JedisPoolConfig getMasterPoolConfig() {
  96. return masterPoolConfig;
  97. }
  98. public void setMasterPoolConfig(JedisPoolConfig masterPoolConfig) {
  99. this.masterPoolConfig = masterPoolConfig;
  100. }
  101. public Integer getDatabase() {
  102. return database;
  103. }
  104. public void setDatabase(Integer database) {
  105. this.database = database;
  106. }
  107. public String getPassword() {
  108. return password;
  109. }
  110. public void setPassword(String password) {
  111. this.password = password;
  112. }
  113. }

发表评论

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

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

相关阅读

    相关 Redis哨兵模式

    Redis哨兵模式 1、介绍哨兵模式 首先,哨兵模式是一种监控机制,并不是redis独有的。 哨兵模式是一种特殊的模式,首先redis提供了哨兵的命令,哨兵是一个独立

    相关 Redis哨兵模式

    (自动选举主机的模式) 概述 主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这

    相关 Redis 哨兵模式

    在 [Redis如何实现主从复制][Redis] 这篇文章中已经介绍了我们如何搭建一个小的 Redis 集群,从而实现主从复制。但是有一个缺点,master 宕机之后,其余的