SpringBoot實戰之16 整合redis哨兵
阿新 • • 發佈:2019-01-28
前言
本篇介紹springboot整合哨兵模式
開始
建專案
新建springboot-redis-sentinel專案
新增maven依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId >
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId >
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.hsy.java</groupId>
<artifactId >java-util</artifactId>
</dependency>
配置檔案
新建redis.properties redis配置檔案
#Matser的ip地址
redis.host=172.16.191.102
#埠號
redis.port=6379
#如果有密碼
redis.password=123456
# 資料庫索引
redis.database=0
#客戶端超時時間單位是毫秒 預設是2000
redis.timeout=10000
#最大空閒數
redis.pool.maxIdle=300
#連線池的最大資料庫連線數。設為0表示無限制,如果是jedis 2.4以後用redis.maxTotal
#redis.pool.maxActive=600
#控制一個pool可分配多少個jedis例項,用來替換上面的redis.maxActive,如果是jedis 2.4以後用該屬性
redis.pool.maxTotal=1000
#最大建立連線等待時間。如果超過此時間將接到異常。設為-1表示無限制。
redis.pool.maxWaitMillis=1000
#連線的最小空閒時間 預設1800000毫秒(30分鐘)
redis.pool.minEvictableIdleTimeMillis=300000
#每次釋放連線的最大數目,預設3
redis.pool.numTestsPerEvictionRun=1024
#逐出掃描的時間間隔(毫秒) 如果為負數,則不執行逐出執行緒, 預設-1
redis.pool.timeBetweenEvictionRunsMillis=30000
#是否在從池中取出連線前進行檢驗,如果檢驗失敗,則從池中去除連線並嘗試取出另一個
redis.pool.testOnBorrow=true
#在空閒時檢查有效性, 預設false
redis.pool.testWhileIdle=true
#redis叢集配置
# spring.redis.spool.cluster.nodes=192.168.177.128:7001,192.168.177.128:7002,192.168.177.128:7003,192.168.177.128:7004,192.168.177.128:7005,192.168.177.128:7006
# spring.redis.pool.cluster.max-redirects=3
#哨兵模式
redis.sentinel.master.name=mymaster
redis.sentinel.host1=172.16.191.102
redis.sentinel.port1=26379
redis.sentinel.host2=172.16.191.102
redis.sentinel.port2=26380
redis.sentinel.host3=172.16.191.102
redis.sentinel.port3=26381
新建application.yml
spring:
redis:
sentinel:
master: mymaster
nodes: 172.16.191.102:26379,172.16.191.102:26380,172.16.191.102:26381
server:
port: 10003
redis配置及序列化方式
@Configuration
@PropertySource("classpath:config/redis.properties")
public class RedisConfig2 {
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private Integer port;
@Value("${redis.password}")
private String password;
@Value("${redis.database}")
private Integer database;
@Value("${redis.timeout}")
private Integer timeout;
@Value("${redis.pool.maxIdle}")
private Integer maxIdle;
@Value("${redis.pool.maxTotal}")
private Integer maxTotal;
@Value("${redis.pool.maxWaitMillis}")
private Integer maxWaitMillis;
@Value("${redis.pool.minEvictableIdleTimeMillis}")
private Integer minEvictableIdleTimeMillis;
@Value("${redis.pool.numTestsPerEvictionRun}")
private Integer numTestsPerEvictionRun;
@Value("${redis.pool.timeBetweenEvictionRunsMillis}")
private long timeBetweenEvictionRunsMillis;
@Value("${redis.pool.testOnBorrow}")
private boolean testOnBorrow;
@Value("${redis.pool.testWhileIdle}")
private boolean testWhileIdle;
/**
* JedisPoolConfig 連線池
* @return
*/
@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大空閒數
jedisPoolConfig.setMaxIdle(maxIdle);
// 連線池的最大資料庫連線數
jedisPoolConfig.setMaxTotal(maxTotal);
// 最大建立連線等待時間
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
// 逐出連線的最小空閒時間 預設1800000毫秒(30分鐘)
jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
// 每次逐出檢查時 逐出的最大數目 如果為負數就是 : 1/abs(n), 預設3
jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
// 逐出掃描的時間間隔(毫秒) 如果為負數,則不執行逐出執行緒, 預設-1
jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
// 是否在從池中取出連線前進行檢驗,如果檢驗失敗,則從池中去除連線並嘗試取出另一個
jedisPoolConfig.setTestOnBorrow(testOnBorrow);
// 在空閒時檢查有效性, 預設false
jedisPoolConfig.setTestWhileIdle(testWhileIdle);
return jedisPoolConfig;
}
/**
* 單機版配置
* @Title: JedisConnectionFactory
* @param @param jedisPoolConfig
* @param @return
* @return JedisConnectionFactory
* @autor lpl
* @date 2018年2月24日
* @throws
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig){
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
jedisConnectionFactory.setUsePool(true);
//連線池
jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
//IP地址
jedisConnectionFactory.setHostName(host);
//埠號
jedisConnectionFactory.setPort(port);
//如果Redis設定有密碼
jedisConnectionFactory.setPassword(password);
// 設定資料庫索引號
jedisConnectionFactory.setDatabase(database);
//客戶端超時時間單位是毫秒
jedisConnectionFactory.setTimeout(timeout);
return jedisConnectionFactory;
}
/**
* 例項化 RedisTemplate 物件
*
* @return
*/
@Bean
public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
/**
* 設定資料存入 redis 的序列化方式,並開啟事務
*
* @param redisTemplate
* @param factory
*/
private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
//如果不配置Serializer,那麼儲存的時候預設使用String,如果用User型別儲存,那麼會提示錯誤User can't cast to String!
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// GenericJackson2JsonRedisSerializer序列化方式
//redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
//redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// Jackson2JsonRedisSerializer序列化方式
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//set value serializer
redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);
// 開啟事務
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.setConnectionFactory(factory);
redisTemplate.afterPropertiesSet();
}
}
增刪改查
編寫crud檔案,由於我封裝了redis得增刪改查,此處僅需要簡單的繼承即可
@Repository(value = "redisRepository")
public class RedisRepository extends AbstractSpringRedisCacheEnhance {
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
RedisTemplate<String, Object> redisTemplate;
@Override
public StringRedisTemplate getStringRedisTemplate() {
return null;
}
@Override
public RedisTemplate<String, Object> getRedisTemplate() {
return redisTemplate;
}
}
至此,springboot整合redis哨兵模式已經完成。
總結
springboot整合redis哨兵,我也沒有找到更全面的資料,上述整合方式也是我摸索而出,
反正效果已經有了,至於其理論仍需要後續研究更新此部落格。