單機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的其他從伺服器,會發現有一個從伺服器變成了主伺服器。