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.1port: 6379password: your_passwordlettuce:pool:max-active: 8max-wait: -1max-idle: 8min-idle: 0shutdown-timeout: 100ms
2.1 在代码配置redis读写分离
@Configurationpublic class RedisConfig {@Value("${spring.redis.host}")private String redisHost;@Value("${spring.redis.port}")private int redisPort;@Value("${spring.redis.password}")private String redisPassword;@Beanpublic RedisConnectionFactory masterRedisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(redisHost, redisPort);config.setPassword(RedisPassword.of(redisPassword));return new LettuceConnectionFactory(config);}@Beanpublic RedisConnectionFactory slaveRedisConnectionFactory() {RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("127.0.0.2", 6380);config.setPassword(RedisPassword.of(redisPassword));return new LettuceConnectionFactory(config);}@Beanpublic 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;}@Beanpublic 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:7002password: your_redis_passwordtimeout: 5000ms
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;@Configurationpublic class RedisConfig {@Beanpublic 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;}@Beanpublic LettuceConnectionFactory lettuceConnectionFactory(RedisClusterConfiguration redisClusterConfiguration) {return new LettuceConnectionFactory(redisClusterConfiguration);}@Beanpublic 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:7005database: 0password: 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;@Configurationpublic class RedisConfig {@Beanpublic 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;}@Beanpublic LettuceConnectionFactory lettuceConnectionFactory(RedisClusterConfiguration redisClusterConfiguration) {return new LettuceConnectionFactory(redisClusterConfiguration);}@Beanpublic 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;}@Overridepublic byte[] serialize(T t) throws SerializationException {if (t == null) {return new byte[0];}return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);}@Overridepublic 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;}
}