日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

提供一個(gè)JedisConnectionFactory 根據(jù)配置來判斷 單點(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ò)誤!請確認(rèn)node=[%s]是否正確', node)); }}//獲得默認(rèn)的連接池構(gòu)造器(怎么設(shè)計(jì)的,為什么不抽象出單獨(dú)類,供用戶使用呢) 有毒JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb =(JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();//指定jedisPoolConifig來修改默認(rèn)的連接池構(gòu)造器(真麻煩,濫用設(shè)計(jì)模式!) !!!!jpcb.poolConfig(jedisPoolConfig);//通過構(gòu)造器來構(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ò)誤!請確認(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() {// 初始化緩存管理器,在這里我們可以緩存的整體過期時(shí)間什么的,我這里默認(rèn)沒有配置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);//對拿到的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ò)誤!請確認(rèn)node=[%s]是否正確', node)); }}//獲得默認(rèn)的連接池構(gòu)造器(怎么設(shè)計(jì)的,為什么不抽象出單獨(dú)類,供用戶使用呢) 有毒JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb =(JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();//指定jedisPoolConifig來修改默認(rèn)的連接池構(gòu)造器(真麻煩,濫用設(shè)計(jì)模式!) !!!!jpcb.poolConfig(jedisPoolConfig);//通過構(gòu)造器來構(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ò)誤!請確認(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的地址,以逗號分隔 如果redis沒有密碼直接去掉配置就可以了 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í)候,會自動變成單點(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è)哨兵可以以逗號分割 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)配置

如果沒有配置這些信息,就會走默認(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#對拿到的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)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
石原莉奈在线亚洲二区| 中文字幕av一区二区三区人| 一区在线免费观看| 亚洲第一精品影视| 深夜视频一区二区| 你懂的网址国产 欧美| 四虎精品一区二区免费| 日韩制服丝袜先锋影音| 尤物tv在线精品| 自由日本语亚洲人高潮| 99视频精品全国免费| 日韩国产一区二区三区| 国产suv精品一区二区四区视频| 日韩在线电影| 国产日韩欧美三级| 精品国产日韩欧美精品国产欧美日韩一区二区三区| 亚洲精品麻豆| 国产精品资源| 国产成人久久精品麻豆二区| 成人精品久久| 国产99久久| 亚洲一区网站| 91精品国产自产观看在线| 久久电影一区| 日韩和欧美的一区| 嫩草伊人久久精品少妇av杨幂| 精品国产亚洲一区二区三区大结局| 国产成人精品一区二区三区免费 | 日本成人在线不卡视频| 日本午夜精品一区二区三区电影 | 在线一区av| 成人午夜精品| 日本精品久久| 亚洲电影有码| 亚洲精品国产日韩| 精品国产免费人成网站| 水野朝阳av一区二区三区| 色婷婷成人网| 日本精品在线中文字幕| 一区二区三区网站| 国产盗摄——sm在线视频| 爽好久久久欧美精品| 精品一区二区三区免费看| 99热精品在线| 亚洲播播91| 久久国内精品自在自线400部| 国产日产高清欧美一区二区三区 | 精品国产三区在线| 免费精品视频在线| 99久久www免费| 麻豆精品在线观看| 亚洲精品无吗| av不卡免费看| 激情综合网站| 日本午夜大片a在线观看| 91午夜精品| 不卡中文一二三区| 国产精品99一区二区三| 日韩一区二区三区在线看| 久久高清国产| 99在线精品免费视频九九视| 精品捆绑调教一区二区三区| 精品国产麻豆| 久久精品国内一区二区三区| 日本99精品| 久久国产视频网| 国产精品免费精品自在线观看| 亚洲精品一二三**| 亚洲精品成a人ⅴ香蕉片| 免费中文字幕日韩欧美| 亚洲一区二区动漫| 久久精选视频| 麻豆精品蜜桃| 国产精品毛片在线看| 国产一区成人| 亚洲欧洲美洲国产香蕉| 日韩国产欧美视频| 久久精品国产亚洲一区二区三区| 国产激情久久| 日韩深夜视频| 午夜在线视频一区二区区别| 亚洲综合小说| 美腿丝袜亚洲一区| 国产一区二区三区视频在线| 亚洲精品中文字幕乱码| 日韩一区精品视频| 中文字幕免费精品| 国产精品亚洲综合久久| 国产欧美一区二区三区精品酒店| 日韩中文在线播放| 美国三级日本三级久久99 | 亚洲中字黄色| 日韩毛片网站| 国产福利91精品一区二区| 91亚洲国产成人久久精品| 四虎884aa成人精品最新| 99视频一区| 亚洲精品福利电影| 国产激情欧美| 狠狠色综合网| 国产亚洲精aa在线看| 精精国产xxxx视频在线播放| 中文在线日韩| 国产亚洲一区二区手机在线观看 | 美女国产精品| 久久99青青| 亚洲少妇诱惑| 国产精品久久久久久久免费观看| 国产一区导航| 国产一区二区三区黄网站| 亚洲综合精品| 国产精品日韩精品中文字幕| 中文在线一区| 捆绑调教日本一区二区三区| 视频在线观看91| 日韩精品欧美| 国产日韩欧美三区| 欧美日韩精品一本二本三本| 视频在线不卡免费观看| 99在线观看免费视频精品观看| 国产黄色精品| 欧美私人啪啪vps| 亚洲丝袜啪啪| 伊人成人在线视频| 久久久一二三| 国产91精品对白在线播放| 中文av在线全新| 日本美女一区| 麻豆网站免费在线观看| 久久精品亚洲| 国产精品自拍区| 国产精品天堂蜜av在线播放| 亚洲精品系列| 日韩中文欧美在线| 亚洲黄色影院| 久久婷婷久久| 日韩精品一页| 另类综合日韩欧美亚洲| 国产精品毛片在线| 欧美日韩色图| 亚洲啊v在线| 日韩黄色大片网站| 偷拍精品精品一区二区三区| 国产+成+人+亚洲欧洲在线| 久久99性xxx老妇胖精品| 日本久久精品| 久久九九精品| 久久国产福利| 91精品国产自产观看在线| 亚洲一区欧美| 成人自拍av| 亚洲激情另类| 亚洲色图综合| 国产欧美亚洲精品a| 精品理论电影在线| 午夜宅男久久久| 麻豆一区二区三| 欧美成人基地| 蜜臀av在线播放一区二区三区| 91亚洲精品在看在线观看高清| 国产亚洲久久| 亚洲精品在线观看91| 日韩久久一区| 成人久久久久| 免费观看在线色综合| 久久99精品久久久久久园产越南| 国产高潮在线| 日韩精品视频网站| 日韩免费小视频| 91成人在线| 欧美日韩国产在线一区| 精品免费在线| 日韩欧乱色一区二区三区在线| 精品国产精品久久一区免费式| 欧美日韩精品免费观看视频完整| 欧美片第1页综合| 合欧美一区二区三区| 久久精品国产亚洲一区二区三区| 国产精品日本| av日韩中文| 国产日韩亚洲| 在线免费观看亚洲| 日韩精品1区| 久久精品毛片| 国产精品久久久久久模特| 男人天堂欧美日韩| 久久一级电影| 日韩中文在线电影| 成人免费一区| 久久久久伊人| 日韩不卡在线观看日韩不卡视频| 尤物精品在线| 欧美日韩国产欧| 精品日韩毛片| 91亚洲国产| 欧美成人a交片免费看| 久久久久久婷| 亚洲精品在线影院| 国内精品美女在线观看| 日韩av免费大片|