单机redis(可以跳过)
1.安装环境
yum -y install gcc-c++
2.获取压缩包
wget http://download.redis.io/releases/redis-5.0.6.tar.gz
3.解压
tar -zxvf redis-5.0.6.tar.gz
4.切换到对应的目录,然后编译
cd redis-5.0.6
make
自此,redis已经安装成功
5.启动redis,指定配置文件
./src/redis-server redis.conf
界面如下(我6379端口已经被占用,所以我修改为7000了)

6.Ctrl+c
退出当前服务,由于不是以守护线程的方式去启动,所以需要Ctrl+c停止服务
7.修改redis.conf配置文件
daemonize no 修改为 daemonize yes ,以守护线程启动
修改密码为 requirepass root
8.再次启动redis,和上面命令一样
9.查看redis服务
ps -ef |grep redis
10.连接客户端
./src/redis-cli
进入指定端口redis
./src/redis-cli -p 7000
键入info,查看当前redis信息
键入shutdown 停止redis服务
单机redis就安装和调试完了。
redis 主从模式配置
主从模式: redis的主从模式,使用异步复制,slave节点异步从master节点复制数据,master节点提供读写服务,slave节点只提供读服务(这个是默认配置,可以通过修改配置文件 slave-read-only 控制)。master节点可以有多个从节点。配置一个slave节点只需要在redis.conf文件中指定 slaveof master-ip master-port 即可。
1.进入到redis目录
cd /home/tool/redis/redis-5.0.6
2.新建一个文件夹,存放redis的配置文件
mkdir config
3.在config下,新建三个配置文件,如下:
cd config
vi master-7000.conf
bind 0.0.0.0
port 7000
logfile "7000.log"
dbfilename "dump-7000.rdb"
daemonize yes
rdbcompression yes
vi slave-7001.conf
bind 0.0.0.0
port 7001
logfile "7001.log"
dbfilename "dump-7001.rdb"
daemonize yes
rdbcompression yes
slaveof 127.0.0.1 7000
vi slave-7002.conf
bind 0.0.0.0
port 7002
logfile "7002.log"
dbfilename "dump-7002.rdb"
daemonize yes
rdbcompression yes
slaveof 127.0.0.1 7000
master-7000.conf,为主节点配置文件,slave-7001.conf,slave-7002.conf为从节点配置文件,在从节点的配置文件中使用:slaveof 指定master节点
4.启动三台reids服务
./src/redis-server config/master-7000.conf
./src/redis-server config/slave-7001.conf
./src/redis-server config/slave-7002.conf
查看一下redis服务
ps -ef |grep redis
info replication
5.先分别连上三台Redis服务,获取key为name的值,通过-p 指定连接那个端口的redis服务
./src/redis-cli -p 7000
./src/redis-cli -p 7001
./src/redis-cli -p 7002
测试get name 都为nil(没有)
6.测试主从
给master节点set一个key为name的值,获取从节点name值,结果如下:
127.0.0.1:7000> set name master
OK
从节点
127.0.0.1:7001> get name
"master"
127.0.0.1:7002> get name
"master"
现在我们对从节点进行写入操作,结果如下:
slave节点只提供读服务,不能进行写入操作
注意
使用主从模式时应注意matser节点的持久化操作,matser节点在未使用持久化的情况详情下如果宕机,并自动重新拉起服务,从服务器会出现丢失数据的情况。以下测试:
首先,禁止matser服务持久化
127.0.0.1:7000> CONFIG SET save ""
OK
在master节点set一个值
127.0.0.1:7000> set age 23
OK
slave节点可以get到age的值
127.0.0.1:7001> get age
"23"
关掉master节点服务
127.0.0.1:7000> shutdown
not connected>
slave节点此时仍可以get到age的值
127.0.0.1:7001> get age
"23"
重启master服务,此时获取不到age的值
./src/redis-server config/master-7000.conf
./src/redis-cli -p 7000
127.0.0.1:7000> get age
(nil)
slave节点此时在获取age的值为空,数据丢失
./src/redis-cli -p 7001
127.0.0.1:7001> get age
(nil)
数据丢失的原因:因为master服务挂了之后,重启服务后,slave节点会与master节点进行一次完整的重同步操作,所以由于master节点没有持久化,就导致slave节点上的数据也会丢失掉。所以在配置了Redis的主从模式的时候,应该打开主服务器的持久化功能。
到这,redis的主从模式就已经完成了
哨兵
sentinel是哨兵,用于监视主从服务器的运行状况,如果主服务器挂掉,会在从服务器中选举一个作为主服务器。
新建三个哨兵配置文件(分别监视上面一主二从)
sentinel-7000.conf
port 27000
daemonize yes
logfile "27000.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel-7001.conf
port 27001
daemonize yes
logfile "27001.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel-7002.conf
port 27002
daemonize yes
logfile "27002.log"
sentinel monitor mymaster 127.0.0.1 7000 2
然后分别启动
./src/redis-server config/sentinel-7000.conf --sentinel
./src/redis-server config/sentinel-7001.conf --sentinel
./src/redis-server config/sentinel-7002.conf --sentinel
启动之后配置会变成
port 27000
sentinel myid 7f4d877479793a2e16e34b541c1f01055d85276c
daemonize yes
logfile "27000.log"
# Generated by CONFIG REWRITE
dir "/home/tool/redis/redis-5.0.6"
protected-mode no
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 127.0.0.1 7002
sentinel known-replica mymaster 127.0.0.1 7001
sentinel known-sentinel mymaster 127.0.0.1 27002 de9744aa912c76c3c0db08c6dd371b545cdca83a
sentinel known-sentinel mymaster 127.0.0.1 27001 4b63d1decceb108fd968998c84db7dfa96e083d3
sentinel current-epoch 0
测试:
分别进入三台redis
./src/redis-cli -p 7000
./src/redis-cli -p 7001
./src/redis-cli -p 7002
查看对应的角色
info replication
7000:
7001:
7002:
将master服务杀死
接着查看redis7000:
7001:
7002:
发现7002已经变成主节点master了
springboot集成
application.properties文件
// 主从配置
// name of Redis server 哨兵监听的Redis server的名称
spring.redis.sentinel.master=mymaster
// comma-separated list of host:port pairs 哨兵的配置列表
spring.redis.sentinel.nodes=127.0.0.1:27000,127.0.0.1:27001,127.0.0.1:27002
新增RedisSentinelConfiguration代码
/**
* redis哨兵配置
* @return
*/
@Bean
public RedisSentinelConfiguration redisSentinelConfiguration(){
RedisSentinelConfiguration configuration = new RedisSentinelConfiguration();
String[] host = redisNodes.split(",");
for(String redisHost : host){
String[] item = redisHost.split(":");
String ip = item[0];
String port = item[1];
configuration.addSentinel(new RedisNode(ip, Integer.parseInt(port)));
}
configuration.setMaster(master);
return configuration;
}
/**
* 连接redis的工厂类
*
* @return
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
//构造方法中注入RedisSentinelConfiguration对象
JedisConnectionFactory factory = new JedisConnectionFactory(redisSentinelConfiguration());
factory.setHostName(host);
factory.setPort(port);
factory.setTimeout(timeout);
factory.setPassword(password);
factory.setDatabase(database);
return factory;
}
验证思路
* 写一个controller方法,用来往redis中新增数据
* 此时关闭redis主服务器,再次调用contoller方法、
* 如果接口依旧可以写入信息,说明配置成功。此时查看redis的其他从服务器,会发现有一个从服务器变成了主服务器。