成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot Redis自適應(yīng)配置的實(shí)現(xiàn)(Cluster Standalone Sentinel)

瀏覽:180日期:2023-03-14 16:09:58
核心代碼段

提供一個(gè)JedisConnectionFactory 根據(jù)配置來(lái)判斷 單點(diǎn) 集群 還是哨兵

@Bean @ConditionalOnMissingBean public JedisConnectionFactory jedisConnectionFactory() {JedisConnectionFactory factory = null; String[] split = node.split(',');Set<HostAndPort> nodes = new LinkedHashSet<>();for (int i = 0; i < split.length; i++) { try {String[] split1 = split[i].split(':');nodes.add(new HostAndPort(split1[0], Integer.parseInt(split1[1]))); } catch (Exception e) {throw new RuntimeException(String.format('出現(xiàn)配置錯(cuò)誤!請(qǐng)確認(rèn)node=[%s]是否正確', node)); }}//獲得默認(rèn)的連接池構(gòu)造器(怎么設(shè)計(jì)的,為什么不抽象出單獨(dú)類,供用戶使用呢) 有毒JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb =(JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();//指定jedisPoolConifig來(lái)修改默認(rèn)的連接池構(gòu)造器(真麻煩,濫用設(shè)計(jì)模式!) !!!!jpcb.poolConfig(jedisPoolConfig);//通過(guò)構(gòu)造器來(lái)構(gòu)造jedis客戶端配置JedisClientConfiguration jedisClientConfiguration = jpcb.build(); //如果是哨兵的模式if (!StringUtils.isEmpty(sentinel)) { logger.info('Redis use SentinelConfiguration'); RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration(); String[] sentinelArray = sentinel.split(','); for (String s : sentinelArray) {try { String[] split1 = s.split(':'); redisSentinelConfiguration.addSentinel(new RedisNode(split1[0], Integer.parseInt(split1[1])));} catch (Exception e) { throw new RuntimeException(String.format('出現(xiàn)配置錯(cuò)誤!請(qǐng)確認(rèn)node=[%s]是否正確', node));} } factory = new JedisConnectionFactory(redisSentinelConfiguration, jedisClientConfiguration); }//如果是單個(gè)節(jié)點(diǎn) 用Standalone模式else if (nodes.size() == 1) { logger.info('Redis use RedisStandaloneConfiguration'); for (HostAndPort n : nodes) {RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();if (!StringUtils.isEmpty(password)) { redisStandaloneConfiguration.setPassword(RedisPassword.of(password));}redisStandaloneConfiguration.setPort(n.getPort());redisStandaloneConfiguration.setHostName(n.getHost());factory = new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration); }}//集群配置信息實(shí)現(xiàn)else { logger.info('Redis use RedisStandaloneConfiguration'); RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(); nodes.forEach(n -> {redisClusterConfiguration.addClusterNode(new RedisNode(n.getHost(), n.getPort())); }); if (!StringUtils.isEmpty(password)) {redisClusterConfiguration.setPassword(RedisPassword.of(password)); } redisClusterConfiguration.setMaxRedirects(maxRedirect); factory = new JedisConnectionFactory(redisClusterConfiguration, jedisClientConfiguration);}return factory; }Configration

import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.cache.Cache;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.cache.interceptor.CacheErrorHandler;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.*;import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import org.springframework.util.StringUtils;import redis.clients.jedis.HostAndPort;import redis.clients.jedis.JedisPoolConfig; import java.util.LinkedHashSet;import java.util.Set; /** * @Author foxzzz * @Class SelfAdaptionRedisConfig * @Description 自適應(yīng)redis配置 * 適用于 單點(diǎn)[主從] 哨兵模式 集群模式 * @Date 2020/7/6 14:34 */ @Configuration@EnableCachingpublic class SelfAdaptionRedisConfig<K, V> extends CachingConfigurerSupport { private final static Logger logger = LoggerFactory.getLogger(SelfAdaptionRedisConfig.class); @Value('${spring.redis.node}') private String node; @Value('${spring.redis.timeout:0}') private int timeout; @Value('${spring.redis.password:}') private String password; @Value('${spring.redis.sentinel:}') private String sentinel; @Value('${spring.redis.jedis.pool.max-total:8}') private int maxTotal; @Value('${spring.redis.jedis.pool.max-idle:8}') private int maxIdle; @Value('${spring.redis.jedis.pool.min-idle:0}') private int minIdle; @Value('${spring.redis.jedis.pool.max-wait:-1}') private long maxWaitMillis; @Value('${spring.redis.jedis.pool.test-on-borrow:true}') private boolean testOnBorrow; @Value('${spring.redis.jedis.factory.max-redirects:5}') private int maxRedirect; @Autowired private JedisPoolConfig jedisPoolConfig; @Autowired private JedisConnectionFactory jedisConnectionFactory; @Bean @ConditionalOnMissingBean @Override public CacheManager cacheManager() {// 初始化緩存管理器,在這里我們可以緩存的整體過(guò)期時(shí)間什么的,我這里默認(rèn)沒(méi)有配置logger.info('初始化 -> [{}]', 'CacheManager RedisCacheManager Start');RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(jedisConnectionFactory);return builder.build(); } @Bean @ConditionalOnMissingBean @Override public CacheErrorHandler errorHandler() {// 異常處理,當(dāng)Redis發(fā)生異常時(shí),打印日志,但是程序正常走logger.info('初始化 -> [{}]', 'Redis CacheErrorHandler');CacheErrorHandler cacheErrorHandler = new CacheErrorHandler() { @Override public void handleCacheGetError(RuntimeException e, Cache cache, Object key) {logger.error('Redis occur handleCacheGetError:key -> [{}]', key, e); } @Override public void handleCachePutError(RuntimeException e, Cache cache, Object key, Object value) {logger.error('Redis occur handleCachePutError:key -> [{}];value -> [{}]', key, value, e); } @Override public void handleCacheEvictError(RuntimeException e, Cache cache, Object key) {logger.error('Redis occur handleCacheEvictError:key -> [{}]', key, e); } @Override public void handleCacheClearError(RuntimeException e, Cache cache) {logger.error('Redis occur handleCacheClearError:', e); }};return cacheErrorHandler; } @Bean @ConditionalOnMissingBean public JedisPoolConfig jedisPoolConfig() {JedisPoolConfig config = new JedisPoolConfig();// 獲取連接時(shí)的最大等待毫秒數(shù)(如果設(shè)置為阻塞時(shí)BlockWhenExhausted),如果超時(shí)就拋異常, 小于零:阻塞不確定的時(shí)間, 默認(rèn)-1config.setMaxWaitMillis(maxWaitMillis);//最小空閑連接數(shù), 默認(rèn)0config.setMinIdle(minIdle);// 最大空閑連接數(shù), 默認(rèn)8個(gè)config.setMaxIdle(maxIdle);// 最大連接數(shù), 默認(rèn)值8個(gè)config.setMaxTotal(maxTotal);//對(duì)拿到的connection進(jìn)行validateObject校驗(yàn)config.setTestOnBorrow(testOnBorrow);return config; } // private JedisCluster getJedisCluster() {//String[] split = node.split(',');//Set<HostAndPort> nodes = new LinkedHashSet<>();//for (int i = 0; i < split.length; i++) {// try {//String[] split1 = split[i].split(':');//nodes.add(new HostAndPort(split1[0], Integer.parseInt(split1[1]))));// } catch (Exception e) {// }//}//JedisCluster jedisCluster = null;//if (StringUtils.isEmpty(password)) {// jedisCluster = new JedisCluster(nodes, 5000, 3000, 10, jedisPoolConfig);//} else {// jedisCluster = new JedisCluster(nodes, 5000, 3000, 10, password, jedisPoolConfig);//}// } @Bean @ConditionalOnMissingBean public JedisConnectionFactory jedisConnectionFactory() {JedisConnectionFactory factory = null; String[] split = node.split(',');Set<HostAndPort> nodes = new LinkedHashSet<>();for (int i = 0; i < split.length; i++) { try {String[] split1 = split[i].split(':');nodes.add(new HostAndPort(split1[0], Integer.parseInt(split1[1]))); } catch (Exception e) {throw new RuntimeException(String.format('出現(xiàn)配置錯(cuò)誤!請(qǐng)確認(rèn)node=[%s]是否正確', node)); }}//獲得默認(rèn)的連接池構(gòu)造器(怎么設(shè)計(jì)的,為什么不抽象出單獨(dú)類,供用戶使用呢) 有毒JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb =(JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();//指定jedisPoolConifig來(lái)修改默認(rèn)的連接池構(gòu)造器(真麻煩,濫用設(shè)計(jì)模式!) !!!!jpcb.poolConfig(jedisPoolConfig);//通過(guò)構(gòu)造器來(lái)構(gòu)造jedis客戶端配置JedisClientConfiguration jedisClientConfiguration = jpcb.build(); //如果是哨兵的模式if (!StringUtils.isEmpty(sentinel)) { logger.info('Redis use SentinelConfiguration'); RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration(); String[] sentinelArray = sentinel.split(','); for (String s : sentinelArray) {try { String[] split1 = s.split(':'); redisSentinelConfiguration.addSentinel(new RedisNode(split1[0], Integer.parseInt(split1[1])));} catch (Exception e) { throw new RuntimeException(String.format('出現(xiàn)配置錯(cuò)誤!請(qǐng)確認(rèn)node=[%s]是否正確', node));} } factory = new JedisConnectionFactory(redisSentinelConfiguration, jedisClientConfiguration); }//如果是單個(gè)節(jié)點(diǎn) 用Standalone模式else if (nodes.size() == 1) { logger.info('Redis use RedisStandaloneConfiguration'); for (HostAndPort n : nodes) {RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();if (!StringUtils.isEmpty(password)) { redisStandaloneConfiguration.setPassword(RedisPassword.of(password));}redisStandaloneConfiguration.setPort(n.getPort());redisStandaloneConfiguration.setHostName(n.getHost());factory = new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration); }}//集群配置信息實(shí)現(xiàn)else { logger.info('Redis use RedisStandaloneConfiguration'); RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(); nodes.forEach(n -> {redisClusterConfiguration.addClusterNode(new RedisNode(n.getHost(), n.getPort())); }); if (!StringUtils.isEmpty(password)) {redisClusterConfiguration.setPassword(RedisPassword.of(password)); } redisClusterConfiguration.setMaxRedirects(maxRedirect); factory = new JedisConnectionFactory(redisClusterConfiguration, jedisClientConfiguration);}return factory; } @Bean @ConditionalOnMissingBean public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {//設(shè)置序列化Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// 配置redisTemplateRedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();redisTemplate.setConnectionFactory(jedisConnectionFactory);RedisSerializer stringSerializer = new StringRedisSerializer();// key序列化redisTemplate.setKeySerializer(stringSerializer);// value序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());//redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// Hash key序列化redisTemplate.setHashKeySerializer(stringSerializer);// Hash value序列化redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate; }}pom依賴

<dependencies><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>${springboot.version}</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <scope>provided</scope></dependency><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>${redis.version}</version></dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <scope>provided</scope></dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <scope>provided</scope></dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <scope>provided</scope></dependency> </dependencies>配置文件

1.yml配置

1.1支持 Cluster模式 集群

node有多個(gè)redis的地址,以逗號(hào)分隔 如果redis沒(méi)有密碼直接去掉配置就可以了 yml配置

spring: redis: node: 127.0.0.1:1001,127.0.0.1:1002,127.0.0.1:1003 password: 123456

properties配置

spring.redis.node=127.0.0.1:1001,127.0.0.1:1002,127.0.0.1:1003 spring.redis.password=123456

1.2支持 Standalone模式 單點(diǎn)

node里只有一個(gè)redis地址的時(shí)候,會(huì)自動(dòng)變成單點(diǎn)模式 yml配置

spring: redis: node: 127.0.0.1:1001 password: 123456

properties配置

spring.redis.node=127.0.0.1:1001spring.redis.password=123456

1.3支持 Sentinel模式 哨兵

當(dāng)配置上sentinel以后就變成了哨兵模式 多個(gè)哨兵可以以逗號(hào)分割 yml配置

spring: redis: node: 127.0.0.1:1001 sentinel:127.0.0.1:1002,127.0.0.1:1003 password: 123456

properties配置

spring.redis.node=127.0.0.1:1001spring.redis.sentinel:127.0.0.1:1002,127.0.0.1:1003spring.redis.password=123456

1.4覆蓋默認(rèn)配置

如果沒(méi)有配置這些信息,就會(huì)走默認(rèn)配置 也可以在properties或者yml覆蓋默認(rèn)配置

#最大連接數(shù), 默認(rèn)值8個(gè)spring.redis.jedis.pool.max-total=8#最大空閑連接數(shù), 默認(rèn)8個(gè)spring.redis.jedis.pool.max-idle=8#最小空閑連接數(shù), 默認(rèn)0spring.redis.jedis.pool.min-idle=0#獲取連接時(shí)的最大等待毫秒數(shù),如果超時(shí)就拋異常, 小于零:阻塞不確定的時(shí)間, 默認(rèn)-1spring.redis.jedis.pool.max-wait=-1#對(duì)拿到的connection進(jìn)行validateObject校驗(yàn)spring.redis.jedis.pool.test-on-borrow=true#集群時(shí)最大重定向個(gè)數(shù)默認(rèn)5spring.redis.jedis.factory.max-redirects=5使用

代碼使用

@Autowired private RedisTemplate<String, Object> redisTemplate;

到此這篇關(guān)于SpringBoot Redis自適應(yīng)配置的實(shí)現(xiàn)(Cluster Standalone Sentinel)的文章就介紹到這了,更多相關(guān)SpringBoot Redis自適應(yīng)配置內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲乱码中文字幕综合| 欧美日韩夫妻久久| 精品婷婷伊人一区三区三| 亚洲国产色一区| 国产伦精品一区二区三区视频孕妇| 国产午夜亚洲精品理论片色戒| 成人激情免费电影网址| 91精品国产福利| 激情综合网最新| 欧美乱熟臀69xxxxxx| 久久91精品久久久久久秒播| 欧美在线一区二区| 男人的j进女人的j一区| 色播五月激情综合网| 日本亚洲免费观看| 色狠狠桃花综合| 开心九九激情九九欧美日韩精美视频电影| 色屁屁一区二区| 久久国产精品99久久久久久老狼 | 91亚洲精品久久久蜜桃网站| 欧美白人最猛性xxxxx69交| 国产**成人网毛片九色| 精品日产卡一卡二卡麻豆| 9久草视频在线视频精品| 26uuu亚洲| 91视频一区二区| 国产人久久人人人人爽| 欧美日韩国产不卡在线看| 国产精品女同互慰在线看| 一区视频在线| 一区二区欧美在线观看| 国产伦精品一区| 午夜国产精品影院在线观看| 蜜桃av久久久亚洲精品| 男人的j进女人的j一区| 91麻豆精品国产无毒不卡在线观看| 成人精品视频一区二区三区| 久久九九久精品国产免费直播| 国内精品福利| 亚洲欧美日韩电影| 男女av一区三区二区色多| 视频一区免费在线观看| 欧美中文字幕一区| 岛国精品在线观看| 国产区在线观看成人精品| 亚洲经典在线| 日韩国产一区二| 欧美老年两性高潮| av午夜精品一区二区三区| 国产亚洲短视频| 国产日韩一区二区| 日本一不卡视频| 欧美一区日本一区韩国一区| 成人91在线观看| 亚洲欧美日本韩国| 欧美亚一区二区| 成人开心网精品视频| 国产精品久久777777| 久久国产精品久久久久久电车| 久久99国产精品免费| 精品国产一区二区三区av性色| 国产自产精品| 日韩国产在线一| 日韩亚洲欧美中文三级| 国产精品九九| 天涯成人国产亚洲精品一区av| 欧美一区二区久久久| 欧美日韩四区| 日韩精品电影一区亚洲| 日韩免费成人网| 日韩一级不卡| 国产在线精品免费| 国产欧美日韩视频在线观看| 亚欧成人精品| 高清成人在线观看| 亚洲欧美一区二区三区久本道91| 在线视频中文字幕一区二区| 成人动漫在线一区| 一区二区三区在线视频观看58| 色噜噜狠狠成人中文综合| 99久久国产综合精品色伊| 亚洲午夜在线观看视频在线| 日韩欧美在线一区二区三区| 亚洲精品在线免费| 国产精品99久久久久久有的能看| 国产精品久久福利| 欧美精品久久99| 1024成人| 国产成人免费在线观看| 一区二区三区在线免费视频| 欧美一卡二卡在线观看| 国产精品三上| 99精品久久免费看蜜臀剧情介绍| 亚洲第一精品在线| 精品国产免费久久| 色哟哟日韩精品| 黄色欧美日韩| 国产成人久久精品77777最新版本| 亚洲综合久久av| 久久久久久免费| 欧美视频一区二区三区在线观看| 欧美午夜电影在线观看| 麻豆高清免费国产一区| 国产精品麻豆网站| 56国语精品自产拍在线观看| 国产一级一区二区| 99久久综合狠狠综合久久| 午夜精品久久久久久久 | 久久综合国产精品| 日本精品一区二区三区四区的功能| 午夜精彩国产免费不卡不顿大片| 欧美96一区二区免费视频| 综合电影一区二区三区| 日韩精品一区二区三区在线| 色悠悠亚洲一区二区| 亚洲成人自拍视频| 成人高清伦理免费影院在线观看| 日韩va亚洲va欧美va久久| 日韩理论片中文av| 精品电影一区二区| 欧美三级电影在线观看| 国产精品久久久久久久久久妞妞 | 亚洲韩日在线| av中文字幕不卡| 久久成人免费网站| 亚洲午夜电影在线观看| 日本一区二区三区四区在线视频| 91精品国产美女浴室洗澡无遮挡| 久久综合福利| 一本久久综合| 欧美理论在线| av综合在线播放| 国内精品伊人久久久久av一坑| 亚洲午夜视频在线| 国产精品福利影院| 久久久久亚洲蜜桃| 欧美videos大乳护士334| 色欧美片视频在线观看| 国产欧美欧美| 亚洲性图久久| 午夜国产精品视频免费体验区| 成人综合婷婷国产精品久久| 精品一区二区三区不卡 | 欧美chengren| 成人精品一区二区三区四区| 国产在线一区二区综合免费视频| 香蕉久久夜色精品国产使用方法| 亚洲天堂免费在线观看视频| 国产女同性恋一区二区| 精品精品国产高清a毛片牛牛| 777奇米四色成人影色区| 91豆麻精品91久久久久久| 久久精品国产清高在天天线| 国产亚洲激情| 99精品国产99久久久久久福利| 国产一区二区在线观看免费播放| 99久久99久久精品免费观看| 成人少妇影院yyyy| 国产精品资源网站| 久久99热这里只有精品| 青青草视频一区| 丝袜美腿亚洲色图| 五月天中文字幕一区二区| 亚洲国产欧美在线人成| 亚洲中国最大av网站| 亚洲最大成人网4388xx| 一区二区三区日韩精品| 一区二区三区色| 亚洲综合色丁香婷婷六月图片| 亚洲乱码国产乱码精品精98午夜 | 99精品视频在线播放观看| 国产成a人无v码亚洲福利| 国产精品99久| 国产不卡在线一区| 高清国产一区二区| av高清久久久| 欧美精品一区二区三区在线看午夜| 欧美国产精品| 欧美特黄一区| 亚洲国产二区| 亚洲一区国产| 久热国产精品| 欧美日韩在线直播| 911精品产国品一二三产区| 欧美一级久久久| 久久综合九色综合久久久精品综合| 久久一二三国产| 欧美国产日韩a欧美在线观看| 国产精品区一区二区三区| 亚洲三级久久久| 亚洲国产婷婷综合在线精品| 丝袜亚洲精品中文字幕一区| 精品一区二区综合| 成人动漫在线一区| 欧美激情综合色综合啪啪| 亚洲精品一区二区三区av| 久久国产精品99国产| 欧美三级一区二区| 日韩免费观看2025年上映的电影| 国产网站一区二区|