首页>>后端>>SpringBoot->springboot同时单机和集群配置兼容详解

springboot同时单机和集群配置兼容详解

时间:2023-11-29 本站 点击:0

前言

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

单机

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

@Bean@PrimarypublicRedisTemplate<Object,Object>redisTemplate()throwsCommonException{RedisTemplatetemplate=newRedisTemplate();template.setConnectionFactory(getRedisConnectionFactory());//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)Jackson2JsonRedisSerializerserializer=newJackson2JsonRedisSerializer(Object.class);ObjectMappermapper=newObjectMapper();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();returntemplate;}@BeanpublicStringRedisTemplatestringRedisTemplate(RedisConnectionFactoryfactory){StringRedisTemplatestringRedisTemplate=newStringRedisTemplate();stringRedisTemplate.setConnectionFactory(factory);returnstringRedisTemplate;}

集群

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

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

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

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

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

publicJedisConnectionFactory(RedisClusterConfigurationclusterConfig){this((RedisClusterConfiguration)clusterConfig,(JedisClientConfiguration)(newJedisConnectionFactory.MutableJedisClientConfiguration()));}

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

@BeanpublicJedisConnectionFactorygetRedisConnectionFactory()throwsCommonException{JedisConnectionFactoryconnectionFactory=null;if(connectionFactory==null&&redisProperties!=null&&redisProperties.getHost()!=null){//单机connectionFactory=newJedisConnectionFactory();}if(connectionFactory==null&&redisProperties!=null&&redisProperties.getCluster().getNodes()!=null){//集群connectionFactory=newJedisConnectionFactory(getClusterConfig());}if(null==connectionFactory){thrownewCommonException("无法初始化redis连接池");}try{connectionFactory.setUsePool(true);JedisPoolConfigconfig=getJedisPoolConfig();connectionFactory.setPoolConfig(config);connectionFactory.setHostName(redisProperties.getHost());connectionFactory.setPort(redisProperties.getPort());connectionFactory.setDatabase(redisProperties.getDatabase());connectionFactory.setPassword(redisProperties.getPassword());}catch(Exceptione){logger.error("redisconnectionfactoryinitfailed");}returnconnectionFactory;}

总结

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/SpringBoot/386.html