1.redis下载安装:
官网下载地址:https://redis.io/download,下载压缩包,我下载的是5.0.7。
PS:Redis是c语言开发的,安装redis需要c语言的编译环境,如果没有gcc需要在线安装。
yum install gcc-c++
2.解压压缩包,我是mac本地安装所以直接双击解压,如果是linux需要进入压缩包所在路径下执行:
tar -zxf redis-5.0.7.tar.gz
3.编译:进入redis源码目录,执行 make 指令
cd redis-5.0.7
make
4.安装:make install 或者make install PREFIX=/usr/local/mysoft/redis指定安装目录,PREFIX后面是你自己的安装路径。如果不设置,则默认安装在/usr/local/bin目录下。
make install
或者
make install PREFIX=/usr/local/mysoft/redis
5.启动: redis-server redis-5.0.7/redis.conf 指定配置文件或者直接在安装目录下执行./redis-server
redis-server redis-5.0.7/redis.conf
或者
./redis-server
启动成功后停掉就行,主要是用来生成一些文件。下面开始搭建主从哨兵模式。
6.创建三个文件夹:7000、7001、7002。7000作为master节点,其他两个作为slave节点。并将之前解压的文件夹分别复制到三个文件夹里:(为了方便展示,我实在mac里搭的,linux同理)
7.修改配置:
修改master的redis.conf配置
vim 7000/redis-5.0.7/redis.conf
我们主要修改这几个地方
#端口,默认6379,这里我改成7000了
port 7000
#后台运行
daemonize yes
#修改为你的安装目录 redis_端口号 这里主服务器端口我改成7000了,默认6379
pidfile "/Users/local/redis_cluter/7000/redis_7000.pid"
#修改为你的安装目录
logfile "/Users/local/redis_cluter/7000/log.log"
#修改为你的安装目录
dir "/Users/local/redis_cluter/7000"
#默认是yes,主从和集群冲突,改为no
cluster-enabled no
修改master的sentinel.conf配置
vim 7000/redis-5.0.7/sentinel.conf
我们主要修改这几个地方
#端口默认26379,主节点我们可以不修改
port 26379
#日志文件路径
logfile "/Users/local/redis_cluter/7000/sentinel.log"
#这里配置是主服务器IP 端口 2个sentinel选举成功后才有效。‘mymaster’是自定义的名称
sentinel monitor mymaster 127.0.0.1 7000 2
接下来修改slave节点的配置
修改slave节点7001的redis.conf配置
vim 7001/redis-5.0.7/redis.conf
主要修改这几个地方
#端口,默认6379,这里我改成7001了
port 7001
#后台运行
daemonize yes
#修改为你的安装目录 redis_端口号 这里主服务器端口我改成7001了,默认6379
pidfile "/Users/local/redis_cluter/7001/redis_7001.pid"
#修改为你的安装目录
logfile "/Users/local/redis_cluter/7001/log.log"
#修改为你的安装目录
dir "/Users/local/redis_cluter/7001"
#默认是yes,主从和集群冲突,改为no
cluster-enabled no
#指定master
slaveof 127.0.0.1 7000
修改slave节点7001的sentinel.conf配置
vim 7001/redis-5.0.7/sentinel.conf
我们主要修改这几个地方
#端口默认26379,从节点我们需要修改
port 26479
#日志文件路径
logfile "/Users/local/redis_cluter/7001/sentinel.log"
#这里配置是主服务器IP 端口 2个sentinel选举成功后才有效。‘mymaster’是自定义的名称
sentinel monitor mymaster 127.0.0.1 7000 2
修改slave节点7002的redis.conf配置
vim 7002/redis-5.0.7/redis.conf
主要修改这几个地方
#端口,默认6379,这里我改成7002了
port 7002
#后台运行
daemonize yes
#修改为你的安装目录 redis_端口号 这里主服务器端口我改成7002了,默认6379
pidfile "/Users/local/redis_cluter/7002/redis_7002.pid"
#修改为你的安装目录
logfile "/Users/local/redis_cluter/7002/log.log"
#修改为你的安装目录
dir "/Users/local/redis_cluter/7002"
#默认是yes,主从和集群冲突,改为no
cluster-enabled no
#指定master
slaveof 127.0.0.1 7000
修改slave节点7002的sentinel.conf配置
vim 7002/redis-5.0.7/sentinel.conf
我们主要修改这几个地方
#端口默认26379,从节点我们需要修改
port 26579
#日志文件路径
logfile "/Users/local/redis_cluter/7002/sentinel.log"
#这里配置是主服务器IP 端口 2个sentinel选举成功后才有效。‘mymaster’是自定义的名称
sentinel monitor mymaster 127.0.0.1 7000 2
到此配置文件就已经简单修改完毕。
8.启动redis:依次启动各个节点和哨兵
redis-server 7000/redis-5.0.7/redis.conf
redis-server 7001/redis-5.0.7/redis.conf
redis-server 7002/redis-5.0.7/redis.conf
redis-server 7000/redis-5.0.7/sentinel.conf --sentinel
redis-server 7001/redis-5.0.7/sentinel.conf --sentinel
redis-server 7002/redis-5.0.7/sentinel.conf --sentinel
查看是否启动成功
ps -ef|grep redis
到此一主二从三哨兵模式搭建完成,因为我是一台服务器搭建多个节点,所以需要频繁改动端口,如果是多台服务器,每台部署一个节点就不需要了。另外还可以使用 redis-cli 的 info replication查看节点信息并测试哨兵模式,这里不做赘述了。
1.依赖jar包:
org.springframework.boot
spring-boot-starter-data-redis
redis.clients
jedis
2.在resources下添加 redis.properties 配置文件
#redis配置开始
# Redis数据库索引(默认为0)
spring.redis6.database=6
# Redis服务器地址 只使用哨兵模式可以不配置
spring.redis.host=127.0.0.1
# Redis服务器连接端口 只使用哨兵模式可以不配置
spring.redis.port=7000
# Redis服务器连接密码(默认为空)
#spring.redis.password=123456
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=10
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=10000
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=2
# 连接超时时间(毫秒)
spring.redis.timeout=20000
#redis配置结束
spring.redis.block-when-exhausted=true
3.创建 RedisConfig
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;
import java.util.HashSet;
import java.util.Set;
/**
* @ClassName RedisConfig
* @ProjectName Redis 配置类
* @Description description
* @Author zhangbuzheng
* @Version 1.0
*/
@Configuration
@PropertySource("classpath:redis.properties")
@Slf4j
public class RedisConfig {
@Value("${spring.redis.timeout}")
private int timeout;
@Value("${spring.redis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.pool.min-idle}")
private int minIdle;
@Value("${spring.redis.pool.max-wait}")
private int maxWaitMillis;
@Value("${spring.redis.jedis.pool.max-active}")
private int maxActive;
@Value("${spring.redis6.database}")
private int database6;
@Bean("redis6")
public RedisTemplate getRedisTemplate6() {
RedisConnectionFactory factory = this.getRedisSentinelConnectionFactory(database6); // 建立Redis的连接
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(factory);
redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化类型
redisTemplate.setValueSerializer(new StringRedisSerializer()); // value的序列化类型
// redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); // value的序列化类型
return redisTemplate;
}
/**
* @Author: zhangbuzheng
* @Description: 哨兵模式
* @param: database
* @Return: org.springframework.data.redis.connection.RedisConnectionFactory
*/
public RedisConnectionFactory getRedisSentinelConnectionFactory(int database) { // 是负责建立Factory的连接工厂类
Set setRedisNode = new HashSet<>();
setRedisNode.add("127.0.0.1:26379");
setRedisNode.add("127.0.0.1:26479");
setRedisNode.add("127.0.0.1:26579");
RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration("mymaster", setRedisNode);
JedisPoolConfig poolConfig = new JedisPoolConfig(); // 进行连接池配置
poolConfig.setMaxTotal(maxActive);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxWaitMillis(maxWaitMillis);
JedisConnectionFactory jedisFactory = new JedisConnectionFactory(redisSentinelConfiguration,poolConfig);
// jedisFactory.setHostName(host);
// jedisFactory.setPort(port);
// jedisFactory.setPassword(password);
jedisFactory.setDatabase(database);
jedisFactory.setTimeout(timeout);
// jedisFactory.setPoolConfig(poolConfig);
jedisFactory.afterPropertiesSet(); // 初始化连接池配置
return jedisFactory;
}
}
4.引入 RedisTemplate
@Resource(name = "redis6")
private RedisTemplate redis6;