spring boot 微服务 redis集群配置
1.redis 有三种集群模式 主从模式 哨兵模式(Sentinel) Cluster模式引入redis依赖
<dependency> <groupId> org.springframework.boot</groupId> <artifactId> spring- boot- starter- data- redis</artifactId> </dependency> <dependency> <groupId> io.lettuce.core</groupId> <artifactId> lettuce- core</artifactId> </dependency>
2.主从模式配置 一般实现redis的读写分离 yaml配置如下
spring: redis: host: 127.0 .0 .1 port: 6379 password: your_passwordlettuce: pool: max- active: 8 max- wait: - 1 max- idle: 8 min- idle: 0 shutdown- timeout: 100 ms
2.1 在代码配置redis读写分离
@Configuration public class RedisConfig { @Value ( "${spring.redis.host}" ) private String redisHost; @Value ( "${spring.redis.port}" ) private int redisPort; @Value ( "${spring.redis.password}" ) private String redisPassword; @Bean public RedisConnectionFactory masterRedisConnectionFactory ( ) { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration ( redisHost, redisPort) ; config. setPassword ( RedisPassword . of ( redisPassword) ) ; return new LettuceConnectionFactory ( config) ; } @Bean public RedisConnectionFactory slaveRedisConnectionFactory ( ) { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration ( "127.0.0.2" , 6380 ) ; config. setPassword ( RedisPassword . of ( redisPassword) ) ; return new LettuceConnectionFactory ( config) ; } @Bean public RedisTemplate < String , Object > masterRedisTemplate ( RedisConnectionFactory masterRedisConnectionFactory) { RedisTemplate < String , Object > template = new RedisTemplate < > ( ) ; template. setConnectionFactory ( masterRedisConnectionFactory) ; template. setKeySerializer ( new StringRedisSerializer ( ) ) ; template. setValueSerializer ( new GenericJackson2JsonRedisSerializer ( ) ) ; return template; } @Bean public RedisTemplate < String , Object > slaveRedisTemplate ( RedisConnectionFactory slaveRedisConnectionFactory) { RedisTemplate < String , Object > template = new RedisTemplate < > ( ) ; template. setConnectionFactory ( slaveRedisConnectionFactory) ; template. setKeySerializer ( new StringRedisSerializer ( ) ) ; template. setValueSerializer ( new GenericJackson2JsonRedisSerializer ( ) ) ; return template; } }
3. 哨兵模式(Sentinel)yaml配置
spring: redis: cluster: nodes: 127.0 .0 .1 : 7000 , 127.0 .0 .1 : 7001 , 127.0 .0 .1 : 7002 password: your_redis_passwordtimeout: 5000 ms
3.1 在代码中配置
import org. springframework. context. annotation. Bean ; import org. springframework. context. annotation. Configuration ; import org. springframework. data. redis. connection. RedisClusterConfiguration ; import org. springframework. data. redis. connection. lettuce. LettuceConnectionFactory ; import org. springframework. data. redis. core. RedisTemplate ; import org. springframework. data. redis. serializer. GenericJackson2JsonRedisSerializer ; import org. springframework. data. redis. serializer. StringRedisSerializer ; @Configuration public class RedisConfig { @Bean public RedisClusterConfiguration redisClusterConfiguration ( ) { RedisClusterConfiguration configuration = new RedisClusterConfiguration ( ) ; configuration. setClusterNodes ( Arrays . asList ( "127.0.0.1:7000" , "127.0.0.1:7001" , "127.0.0.1:7002" ) ) ; configuration. setPassword ( "your_redis_password" ) ; return configuration; } @Bean public LettuceConnectionFactory lettuceConnectionFactory ( RedisClusterConfiguration redisClusterConfiguration) { return new LettuceConnectionFactory ( redisClusterConfiguration) ; } @Bean public RedisTemplate < String , Object > redisTemplate ( LettuceConnectionFactory lettuceConnectionFactory) { RedisTemplate < String , Object > template = new RedisTemplate < > ( ) ; template. setConnectionFactory ( lettuceConnectionFactory) ; template. setKeySerializer ( new StringRedisSerializer ( ) ) ; template. setValueSerializer ( new GenericJackson2JsonRedisSerializer ( ) ) ; template. setHashKeySerializer ( new StringRedisSerializer ( ) ) ; template. setHashValueSerializer ( new GenericJackson2JsonRedisSerializer ( ) ) ; return template; } }
4. Cluster模式 yaml 配置如下
spring : redis : cluster : nodes : 127.0.0.1: 7000 , 127.0.0.2: 7001 , 127.0.0.3: 7002 , 127.0.0.4: 7003 , 127.0.0.5: 7004 , 127.0.0.6: 7005 database : 0 password : your_password
4.1代码配置如下
import org. springframework. context. annotation. Bean ; import org. springframework. context. annotation. Configuration ; import org. springframework. data. redis. connection. RedisClusterConfiguration ; import org. springframework. data. redis. connection. lettuce. LettuceConnectionFactory ; import org. springframework. data. redis. core. RedisTemplate ; import org. springframework. data. redis. serializer. GenericJackson2JsonRedisSerializer ; import org. springframework. data. redis. serializer. StringRedisSerializer ; @Configuration public class RedisConfig { @Bean public RedisClusterConfiguration redisClusterConfiguration ( ) { RedisClusterConfiguration configuration = new RedisClusterConfiguration ( ) ; configuration. setClusterNodes ( Arrays . asList ( "127.0.0.1:7000" , "127.0.0.1:7001" , "127.0.0.1:7002" ) ) ; configuration. setPassword ( "your_redis_password" ) ; return configuration; } @Bean public LettuceConnectionFactory lettuceConnectionFactory ( RedisClusterConfiguration redisClusterConfiguration) { return new LettuceConnectionFactory ( redisClusterConfiguration) ; } @Bean public RedisTemplate < String , Object > redisTemplate ( LettuceConnectionFactory lettuceConnectionFactory) { RedisTemplate < String , Object > template = new RedisTemplate < > ( ) ; template. setConnectionFactory ( lettuceConnectionFactory) ; template. setKeySerializer ( new StringRedisSerializer ( ) ) ; template. setValueSerializer ( new GenericJackson2JsonRedisSerializer ( ) ) ; template. setHashKeySerializer ( new StringRedisSerializer ( ) ) ; template. setHashValueSerializer ( new GenericJackson2JsonRedisSerializer ( ) ) ; return template; } }
5.如果需要修改redis的键值对 序列化 如下配置
import com. alibaba. fastjson2. JSON ;
import com. alibaba. fastjson2. JSONReader ;
import com. alibaba. fastjson2. JSONWriter ;
import org. springframework. data. redis. serializer. RedisSerializer ;
import org. springframework. data. redis. serializer. SerializationException ; import java. nio. charset. Charset ;
public class FastJson2JsonRedisSerializer < T > implements RedisSerializer < T > { public static final Charset DEFAULT_CHARSET = Charset . forName ( "UTF-8" ) ; private Class < T > clazz; public FastJson2JsonRedisSerializer ( Class < T > clazz) { super ( ) ; this . clazz = clazz; } @Override public byte [ ] serialize ( T t) throws SerializationException { if ( t == null ) { return new byte [ 0 ] ; } return JSON . toJSONString ( t, JSONWriter. Feature. WriteClassName ) . getBytes ( DEFAULT_CHARSET ) ; } @Override public T deserialize ( byte [ ] bytes) throws SerializationException { if ( bytes == null || bytes. length <= 0 ) { return null ; } String str = new String ( bytes, DEFAULT_CHARSET ) ; return JSON . parseObject ( str, clazz, JSONReader. Feature. SupportAutoType ) ; }
} @Configuration
@EnableCaching
@AutoConfigureBefore ( RedisAutoConfiguration . class )
public class RedisConfig extends CachingConfigurerSupport { @Bean @SuppressWarnings ( value = { "unchecked" , "rawtypes" } ) public RedisTemplate < Object , Object > redisTemplate ( RedisConnectionFactory connectionFactory) { RedisTemplate < Object , Object > template = new RedisTemplate < > ( ) ; template. setConnectionFactory ( connectionFactory) ; FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer ( Object . class ) ; template. setKeySerializer ( new StringRedisSerializer ( ) ) ; template. setValueSerializer ( serializer) ; template. setHashKeySerializer ( new StringRedisSerializer ( ) ) ; template. setHashValueSerializer ( ( new StringRedisSerializer ( ) ) ) ; template. afterPropertiesSet ( ) ; return template; }
}