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的其他从服务器,会发现有一个从服务器变成了主服务器。