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_password
lettuce:
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_password
timeout: 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;
}
}