一、环境准备
在能运行redis单例的情况下,复制一份redis目录
二、修改配置文件redis.conf:
port 6382
daemonize yes
requirepass root123
#绑定当前机器 IP
bind 172.22.169.168
#
##数据文件存放位置
dir /root/redis-cluster/redis6382/data
#
##pid 6382和port要对应
pidfile /root/redis-cluster/redis6382/data/redis_6382.pid
#
##启动集群模式
cluster-enabled yes
##6382和port要对应
cluster-config-file nodes6382.conf
cluster-node-timeout 15000
appendonly yes
本机内网ip可用:ip a s
来查看
看你想在这个服务器起几个实例,我是启动三个实例,只需要修改对应的端口即可。
redis集群必须要有6个节点,就是最基本的一主一丛模式需要有三份,即6个实例!
三、集群创建
看你一台机器要启动几个实例,我是三台服务器,每台机器启动三个实例,创造一主二从的集群配置,我是有设置密码为root123。结尾需要添加-a root123,也可以放到前面
./src/redis-cli --cluster create --cluster repliace 47.119.159.55:6382 47.119.159.55:6383 47.119.159.55:6384 120.77.46.185:6382 120.77.46.185:6383 120.77.46.185:6384 112.74.170.92:6382 112.74.170.92:6383 112.74.170.92:6384 -a root123
这里有个大坑,Waiting for the cluster to join 一直在等待。原因是我们只放行了阿里云安全组对应的6382,6383,6384端口,我们还没有放行集群通信端口,需要加上10000,即是16382,16383,16384也要放行!!!
创建成功后,查看主从关系,master为主,slave为从。
随便登录进某个节点, 记得要加 -c 表示集群操作,如果不加-c ,则无法添加值。
./src/redis-cli -h 47.119.159.55 -p 6382 -a root123 -c
如果还是不行,估计是linux防火墙没关闭。我是直接永久关闭了
systemctl disable firewalld.service 永久关闭防火墙
systemctl stop firewalld.service 暂时关闭防火墙 重启后恢复
slave后面的编码为master的id。接着set 值测试,这就表明搭建成功了!
四、java连接
1.我是用的springboot,自带的lettuce连接
spring
redis:
# 集群配置
password: root123
timeout: 15000
database: 0
cluster:
nodes:
- 120.77.46.185:6382
- 120.77.46.185:6383
- 120.77.46.185:6384
- 47.119.159.55:6382
- 47.119.159.55:6383
- 47.119.159.55:6384
- 112.74.170.92:6382
- 112.74.170.92:6383
- 112.74.170.92:6384
max-redirects: 3 # 获取失败 最大重定向次数
lettuce:
pool:
max-active: 1000 #连接池最大连接数(使用负值表示没有限制)
max-idle: 100 # 连接池中的最大空闲连接
min-idle: 50 # 连接池中的最小空闲连接
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
2.config配置,我这跟单例用的配置是一模一样的
@Slf4j
@Configuration
@EnableCaching // 开启缓存支持(无此注解,可能无法读取redis配置文件)
public class RedisConfig {
@Autowired
private LettuceConnectionFactory lettuceConnectionFactory;
/**
* 自定义缓存key的生成策略。默认的生成策略是看不懂的(乱码内容) 通过Spring 的依赖注入特性进行自定义的配置注入并且此类是一个配置类可以更多程度的自定义配置
* 根据类名+方法名+所有参数的值生成唯一的一个key
*/
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuffer sb = new StringBuffer();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
// 缓存管理器
@Bean
public CacheManager cacheManager() {
RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(lettuceConnectionFactory);
@SuppressWarnings("serial")
Set<String> cacheNames = new HashSet<String>() {
{
add("codeNameCache");
}
};
builder.initialCacheNames(cacheNames);
return builder.build();
}
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
// 配置 Jackson2JsonRedisSerializer 序列化器,在配置 redisTemplate需要用来做k,v的序列化器
//此种序列化方式结果清晰、容易阅读、存储字节少、速度快,所以推荐更换
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置redisTemplate
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(lettuceConnectionFactory);
RedisSerializer<?> stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);// key序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化
redisTemplate.setHashKeySerializer(stringSerializer);// Hash key序列化
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
这样就大功告成啦!!!