springboot整合redis叢集
阿新 • • 發佈:2018-12-05
1.新增redis啟動器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置檔案 application.properties
#redis叢集配置 # Redis伺服器連線密碼(預設為空) spring.redis.password= # 連線池最大連線數(使用負值表示沒有限制) spring.redis.pool.max-active=300 # 連線池最大阻塞等待時間(使用負值表示沒有限制) spring.redis.pool.max-wait=1000 # 連線池中的最大空閒連線 spring.redis.pool.max-idle=300 # 連線池中的最小空閒連線 spring.redis.pool.min-idle=100 # 連線超時時間(毫秒) spring.redis.timeout=0 spring.redis.commandTimeout=5000 # redis.cluster spring.redis.cluster.nodes=192.168.240.128:7000,192.168.240.128:7001,192.168.240.128:7002,192.168.240.128:7003,192.168.240.128:7004,192.168.240.128:7005,192.168.240.128:7006,192.168.240.128:7007,192.168.240.128:7008
3.redis叢集配置類
package com.plat.springboot.config; 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.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 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.cache.interceptor.KeyGenerator; 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.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.xml.sax.ErrorHandler; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPoolConfig; import java.lang.reflect.Method; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; @Configuration @ConditionalOnClass({JedisCluster.class}) @EnableCaching public class redisConfig extends CachingConfigurerSupport{ private final Logger logger = LoggerFactory.getLogger(redisConfig.class); @Value("${spring.redis.cluster.nodes}") private String clusterNodes; @Value("${spring.redis.timeout}") private int timeout; @Value("${spring.redis.pool.max-idle}") private int maxIdle; @Value("${spring.redis.pool.max-wait}") private long maxWaitMillis; @Value("${spring.redis.commandTimeout}") private int commandTimeout; @Bean public JedisCluster getJedisCluster(){ String[] cNodes = clusterNodes.split(","); Set<HostAndPort> nodes = new HashSet<>(); //分割出叢集節點 for (String node: cNodes) { String[] hp = node.split(":"); nodes.add(new HostAndPort(hp[0],Integer.parseInt(hp[1]))); } JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); //建立叢集物件 return new JedisCluster(nodes,commandTimeout,jedisPoolConfig); } /** * 設定資料存入redis 的序列化方式 *</br>redisTemplate序列化預設使用的jdkSerializeable,儲存二進位制位元組碼,導致key會出現亂碼,所以自定義 *序列化類 * * @paramredisConnectionFactory */ @Bean public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){ RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); 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); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } /** * 註解@Cache key生成規則 */ @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; }; /** * 註解@Cache的管理器,設定過期時間的單位是秒 * * @Description: * @param redisTemplate * @return */ @Bean public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); Map<String, Long> expires = new HashMap<String, Long>(); expires.put("users", 6000L); expires.put("city", 600L); cacheManager.setExpires(expires); cacheManager.setDefaultExpiration(600); // 設定key-value超時時間 return cacheManager; } /** *配置當redis掛掉或者出現問題時,程式繼續向下執行操作資料庫查詢 */ @Bean @Override public CacheErrorHandler errorHandler() { CacheErrorHandler cacheErrorHandler = new CacheErrorHandler() { @Override public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) { RedisErrorException(exception, key); } @Override public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) { RedisErrorException(exception, key); } @Override public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) { RedisErrorException(exception, key); } @Override public void handleCacheClearError(RuntimeException exception, Cache cache) { RedisErrorException(exception, null); } }; return cacheErrorHandler; } protected void RedisErrorException(Exception exception,Object key){ logger.error("redis異常:key=[{}]", key, exception); } }
4.redis註解開發