栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot同时单机和集群配置兼容,一般人我不说哦

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot同时单机和集群配置兼容,一般人我不说哦

前言

web开发数据大多都是存储在数据库中,但是随着数据增多会导致我们的接口很慢。这个时候我们会引入redis来缓存不会经常变动的数据达到数据响应快的效果

单机

在spring中引入redis我们配置redis的链接工厂等信息,到了SpringBoot中我们只需要在配置类中简单的配置redisTemplate的序列化问题和缓存工厂等。

@Bean
@Primary
public RedisTemplate redisTemplate() throws CommonException {
   RedisTemplate template = new RedisTemplate();
   template.setConnectionFactory(getRedisConnectionFactory());
   // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
   Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
   ObjectMapper mapper = new ObjectMapper();
   mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
   mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
   mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
   mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
   serializer.setObjectMapper(mapper);
   // shiro默认使用jdk,所以这个序列化采用默认jdk,方便shirosession的 处理
   template.setValueSerializer(serializer);
   // 使用StringRedisSerializer来序列化和反序列化redis的key值
   template.setKeySerializer(serializer);
   //template.setValueSerializer(serializer);
   template.setHashKeySerializer(serializer);
   template.setHashValueSerializer(serializer);
   template.afterPropertiesSet();
   return template;
}
​
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
   StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
   stringRedisTemplate.setConnectionFactory(factory);
   return stringRedisTemplate;
}
集群

但是随着项目的深入问题还是会出现。单机的最大问题就是如果redis服务因为意外情况发生宕机,那么我们的程序也会被牵连,这造成我们服务直接不可用。

基于这种情况redis集群应运而生。集群好处就是我们不需要担心服务宕机,应为每个节点都是单独服务部署。其中一台宕机其它的会重新进行选举和数据容灾操作。对于我们使用者而言不需要担心宕机的问题了。

还有就是数据,在redis集群中存在主节点和从节点。主节点负责写入数据,从节点负责同步数据。集群内部的数据同步让我们避免了数据丢失的情况。

在单机配置中,能够发现我们在配置RedisTemplate的时候需要RedisConnectionFactory工厂。关于这个工厂没有再上面配置,主要原因是在集群中我们需要改造他。所以就放在集群章节一起配置了。

关于工厂的配置我们主要是配置JedisConnectionFactory 。 点源码我们能够看到一个方法

public JedisConnectionFactory(RedisClusterConfiguration clusterConfig) {
    this((RedisClusterConfiguration)clusterConfig, (JedisClientConfiguration)(new JedisConnectionFactory.MutableJedisClientConfiguration()));
}

所以集群配置我们只需要构造RedisClusterConfiguration对象就可以。 如果是单机我们就使用无参构造

@Bean
public JedisConnectionFactory getRedisConnectionFactory() throws CommonException {
   JedisConnectionFactory connectionFactory = null;
   if (connectionFactory == null && redisProperties != null && redisProperties.getHost() != null) {
      // 单机
      connectionFactory = new JedisConnectionFactory();
   }
   if (connectionFactory == null && redisProperties != null && redisProperties.getCluster().getNodes() != null) {
      // 集群
      connectionFactory = new JedisConnectionFactory(getClusterConfig());
   }
   if (null == connectionFactory) {
      throw new CommonException("无法初始化redis连接池");
   }
   try {
      connectionFactory.setUsePool(true);
      JedisPoolConfig config = getJedisPoolConfig();
      connectionFactory.setPoolConfig(config);
      connectionFactory.setHostName(redisProperties.getHost());
      connectionFactory.setPort(redisProperties.getPort());
      connectionFactory.setDatabase(redisProperties.getDatabase());
      connectionFactory.setPassword(redisProperties.getPassword());
   } catch (Exception e) {
      logger.error("redis connection factory init failed");
   }
   return connectionFactory;
}
总结

redis集群大大提高我们项目的可用性,高可用性。有时间我们在了解下集群内部数据同步原理和选举机制吧

作者:本该努力的年龄千万别放弃
链接:https://juejin.cn/post/7018476112464314405
来源:稀土掘金

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/322103.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号