redis
redis的安裝一
安裝的準備
首先得買一個服務器(我買的阿里云ecs輕量級);
再下載遠程客戶端(我用的Xshell,Xftp);
打開Xftp將下載好得redis壓縮包傳輸Xftp中,在進入Xshell中Linux命令安裝;
rides安裝
下載地址:https://redis.io/
安裝:
1,Linux進入redis所在目錄;
2,執行命令:tar -zxvf redis-3.2.10.tar.gz //個人建議將軟體安裝在/usr/local目錄下,執行命令:tar -zxvf redis-3.2.10.tar.gz -C /usr/local/redis,當然解壓完了move也可以;
3,進入解壓后的目錄進行編譯,cd redis-3.2.10. 執行命令:make ,make命令后可能報錯,如果報錯,解決如下:
報錯一:那可能是沒有gcc (linux下的一個編譯器,是c,c++程式的編譯器)
使用命令yum進行安裝,yum -y install gcc
報錯二:error:jemalloc/jemalloc.h:No such file or disectoty //可能找不到c語言中的頭檔案
執行 make MALLOC = libc
4,安裝完gcc之后,make distclean 清理下上次make后產生的檔案,再make
redis啟動:
方式一:前端啟動模式,前端模式啟動的缺點是ssh命令視窗關閉則redis-server程式結束,而且當前命令視窗處于一種阻塞狀態,想要執行其它命令需要重新開啟一個新命令視窗
執行命令:cd /usr/local/redis/redis-3.2.10/bin
再執行命令:./redis-server
//ps -f | grep redis 查看行程 kill pid(行程號) 殺掉行程
方式二:后臺啟動模式,./redis-server & //建議后臺啟動
后臺啟動并輸出日志到 nohup.out 檔案:nohup /usr/local/redis-3.2.10/src/-server &
再回車確定
ls查看檔案會發現出現一個nohup.out檔案
cat nohup.out 就會將日志打在此檔案中
redis關閉:./redis -cli shutdown
redis的安裝二
https://www.jb51.net/article/146751.htm
redis客戶端
redis命令列客戶端:redis -cli (./redis -cli -h 127.0.0.1 -p 6379) //redis自帶基于命令列得redis客戶端
Redis Desktop Manager(遠程客戶端): //要下載
遠程連接redis需要修改redis主目錄下的redis.conf組態檔:
1,bind ip 系結ip注釋掉
2,protected-mode yes 保護模式改為no;
可以進入目錄組態檔改,也可以命令改,命令如下:
進入目錄:cd /usr /local /redis-3.2.10 /
進入檔案:vim redis.conf 回車確定
注釋bind ip;protected-mode yes 保護模式改為no;回車確定
ps -ef | grep redis //查看行程
kill pid //殺掉當前行程再重啟
nohup /usr/local/redis-3.2.10/src/redis - server /usr/local/redis-3.2.10/redis.conf & //重啟行程并打出日志檔案
進入下載好的遠程客戶端:
Connection 連接自己的遠程服務器地址; //這里一定要填自己的遠程ip,不能填本地
ok
phpRedisAdmin(遠程客戶端):
需要安裝php運行環境
php開發自行下載xampp
redis編程客戶端:
redis的Java客戶端:
jedis:
jedis原始碼:https://github.com/xetorhio/jedis
api檔案:http://xetorthio.geihub.io/jedis/
redis的使用
基礎命令:
1, ./redis -cli //啟動
輸入ping,redis會回傳PONG表示服務運行正常
2,redis默認16個庫,但是可以再redis.conf中修改, //可進檔案改,也可命令改
進入檔案:vim redis.conf 回車確定
找到databases 16 //可改
3,redis默認使用0號庫,select db //切換庫 例:select 2
4,洗掉
洗掉所有庫資料 : flushall
洗掉當前庫資料 : flushdb
5,獲取redis的所有配置 :config get *
6,退出連接:exit / quit
7,查看當前資料庫中key的數目:dbsize
8,查看redis服務器的統計資訊:info
命令與使用檔案:
命令:
key命令
字串型別 :string
哈希型別 :hash
串列型別 :list
集合型別 :set
有序集合型別 :zset(sorted set)
檔案:
中文:https://redis.io/commands
英文:https://redisdoc.com/
redis常用命令 :
keys * //列出所有key
exists key //檢查某個key是否存在
set key value //存入key值 例:set k1 v1
move key db //將當前的key移動到給定的庫db中,例:move k1 2
expire key seconds //設定key值過期時間 例:expire k1 8
ttl key (time to live) //查看是否過期,-1永不過期,-2 已過期或key不存在
type key //查看key所存盤值得型別
del key //洗掉key
redis更多使用方法請移步菜鳥教程:https://www.runoob.com/redis/redis-install.html
redis5中資料型別命令
字串型別 String(可以存盤任何形式的字串)
set key value 將字串值value設定到key中
get key 獲取key中的value
incr key 將key中存盤的數字加一,若key不存在,key得值先被初始化為0,再執行incr操作(只對存盤的數字有用)
decr key 將key中存盤的數字減一,若key不存在,key得值先被初始化為0,再執行incr操作(只對存盤的數字有用)
setex key seconds value 設定key值及過期時間(set expire)
setnx key value 給無值或者不存在的key給值,有值則不設定值
getset key value 給key設定新值并回傳舊值
strlen key 回傳key所存盤字串長度
append key value 若key存在且為字串,則追加(跟jquery一樣);key不存在將追加的設為新值
incrby key increment 將key所存盤的值加上增質量(自定義量),若key不存在,則key的值初始化為0,再執行incrby
decrby key increment 將key所存盤的值減去增質量(自定義量),若key不存在,則key的值初始化為0,再執行incrby
getrange key start end 截取key中字串值,從star開始,end結束(類似subString)
setrang key offset value 從字串指定位置替換value,例:k1值為helloworld,執行setrang k1 5(第五個位置) redis 則輸出:helloredis
mset key1 value key2 value2 ... 同時設定多個key-value
mget key1 key2 keyn ... 同時獲取多個key-value
msetnx key1 value key2 value2 ... 同時設定多個key-value,當且僅當所有給定key都不存在時才能設定成功,有一個key存在值都不行
哈希型別hash(String型別的映射,適合存盤物件)
hset key field value 將哈希表key中的域field的值設定為value 例:hset k1 id 1001
hget key field 取值 例:hget k1 id
hmset key1 field value ... 同時設定多個值 例:hmset k2 id 1002 name likauhua age 10 pwd 123 ...
hmget key field ... 同時取多個值 例:hmget k2 id name age
hgetall key 查詢哈希表key里所有值
hdel key 洗掉哈希表key中一個或多個指定值field
hkeys key 查看哈希表key中所有field域(查詢所有欄位)
hvals key 查看哈希表key中所有域的值(欄位所對應的值)
type key 查案key存盤的資料型別
hlen key 查看哈希表key中域field的個數(欄位個數)
hexists key 查看哈希表key中,給定域field是否存在(欄位是否存在還)例:hexists k1 id
hincrby key field increment 為哈希表key中的域的值加上增量 例:hincrby k1 id 5
hincrbyfloat key field increment 為哈希表key中的域的值加浮點數上增量
hsetnx key field value 將哈希表key中的域field的值設為value,當且僅當field不存在時才設定,否則不設定 例:hsetnx k1 age(這個欄位不存在時才能設定) 18
串列型別list(簡單的字串串列,按照插入排序,元素可重復)
lpush key value1 value2 value3 將一個或多個值value插入到串列key的表頭(最左邊) 例:lpush k1 1 2 3 4 5
rpush key value1 value2 value3 將一個或多個值value插入到串列key的表尾(最右邊) 例:lpush k1 7 8 9 10 11
lrange key start stop 獲取表key中指定區間內元素,0為第一元素,-1為倒數第一元素, 例:lrange key 0 -1 (區間所有元素)
lpop key 從左邊獲取串列key的第一個元素,并將該元素移除
rpop key 從右邊獲取串列key的第一個元素,并將該元素移除
lindex key index 獲取串列key中下標為指定index元素 例:lindex key 3
llen key 獲取串列key的長度
lrem key count value 從左至右洗掉串列中指定個數與指定value值相等的value 例:lrem k1 1 4 4這個元素被洗掉了
ltrim key start stop 洗掉指定區域外的元素
rpoplpush source destination 將串列source中的尾元素插入到串列destination中,作為頭元素 例:rpoplpush k1 k2 (將本串列尾元素放另一個串列當頭元素)
lset key index value 將串列key下標為index的元素設為value 例:lset k1 0 222(將0下標下的元素替換成22)
linsert key before|after pivot value 將值插入到指定值之前或之后 例:linsert k1 before 5 100(將k1域內值5前插入100,元素非下標)
集合型別 set(redis的Set時String型別的無序集合,成員唯一,集合中不重復)
sadd key member member ... 將一個或多個member元素加入集合key中,已存在集合的member元素不加入 例:sadd k1 1 2 3 4
smembers key 獲取聚合key中所有元素
sismember key member 判斷member是否是集合key的成員 例:sismember k1 1
scard key 獲取聚合中元素個數
srem key member 洗掉聚合中一個或多個元素(指定洗掉某個元素) 例:srem k1 2
srandmemner key [count] 隨機回傳集合中一個或多個元素 count 是回傳的個數
spop key 隨機洗掉集合中的一個元素
smove source destination member 將member元素從一個集合移到另一個集合 例:smove k1 k2 2(將元素2從k1 移到k2)
有序聚合zset(sorted set):跟set差不多,不同的是zset得每個元素都會關聯一個分數(分數可重復),redis通過分數來為集合中的成員進行排序
zadd key score member 將一個或多個member元素及其score值加入到有序集合 例:zadd k1 100 likaihua 90 likaihua2
zrange key start stop 獲取有序集合key中,指定區間的成員,按score大小排序 例:zrange k1 0 -1
zrevrange key start stop 獲取有序集合key中,指定區間的成員,按score小大排序 例:zrange k1 0 -1
zrem key member 洗掉有序集合key中得一個或多個成員 例:zrem k1 likaihua
zcard key 獲取集合個數
zrank key member 獲取有序集合key中,成員member排名,有序集成員按score值從小到大排列 例:zrank k1 likaihua
zrevrank key member 獲取有序集合key中,成員member排名,有序集成員按score值從大到小排列
zrangebyscore key start stop 獲取有序集合key中,所有score值介于min和max之間的成員 例:zrange k1 100 90
zrevrangebyscore key start stop 獲取有序集合key中,所有score值介于max和min之間的成員
zcount key min max 獲取有序集合key中,所有score值介于min和max之間的成員個數 例:zcount k1 10 100
score(分數)
Table鍵 補全命令
官方命令檔案:redisdoc.com
redis的發布和訂閱
發布訂閱:redis發布訂閱(pub/sub)是一種訊息通信模式;也稱為生產者模式,實作訊息佇列的一種方式
訊息佇列三要素:1,生產者(producer)2,消費者(consumer)3,訊息服務(broker)
三者關系:1 (producer)——>3 (redis在次充當consumer)——>2(consumer)
一個訊息發布者,多個訊息訂閱者
命令實作:1,開啟4個redis客戶端,三個作為訊息訂閱者,一個作為訊息發布者:./redis-cli
2,訊息訂閱者:subscribe channel
// 如果是訂閱匹配模式:psubscribe chan * 表示匹配以chan開頭的頻道主題都能拿到
3,訊息發布者:publish channel message
//就跟扶貧一樣,國家把錢給政府干部,干部(干部===訊息發布者)發錢,帶有精準扶貧這個標識人就可以憑此去拿錢(貧困戶==訊息訂閱者)
jedis編程實作:
訂閱者:
public void onMessage(String channel, String message){ //封裝的回呼函式
System.out.println("頻道"+channel+"發布了訊息"+message);
}
public static void main (String [ ] arg){
Jedis jedis = new Jedis ("192.168.0.1" ,6379); //連接redis
Sub sub = new Sub(); //創建訂閱者物件
jedis.subscribe(sub, "channel");
}
發布者:
public static void main (String [ ] arg){
Jedis jedis = new Jedis ("192.168.0.1" ,6379); //連接redis
jedis.publish("channel", "hello world"); //發布訊息
jedis.close();
}
redis事務(redis中的事務是一組命令集合,至少兩條以上命令,redis事務保證這些命令被執行時不會被其他操作打斷)
正常流程:1,MULTI:該命令告訴redis接下來的命令暫不執行,將其暫存(開啟事務)
2,SADD "user1" 第一天命令進入等待佇列
3,SADD "user2"第二條命令進入等待佇列
4,EXEC 告知redis執行暫存的命令(提交事務) //放棄事務:DISCARD,不執行,事務放棄
//就跟坐客車(事務 == 大客車)一樣,單個不走,包車不準,等人多了,包圓兒了一塊走,
命令示例:
MULTI
set k2(key) v2(value)
set k3(key) v3(value)
EXEC
也存在例外和例外情況:1,語法錯誤,事務回滾不執行
2,語法正常,邏輯錯誤,例如incr給一個字符加1,或者不給值,能夠入隊,但提交事務后會顯示該陳述句存在錯誤
鎖:
悲觀鎖:當有人讀取資料時會被認為要更改資料,因此每次在讀取資料時會先上鎖,直到這個執行緒拿到鎖為止,(本執行緒結束后其他執行緒才能進來讀取資料,就跟上廁所似的,進去先鎖門,自己拉完了別人才能進來拉)
樂觀鎖:當有人讀取資料時不會被認為更改資料,不上鎖,但在更新時會判斷在此期間是否有人更改資料,一般用版本號機制進行判斷,
悲觀鎖的判斷機制:大多數基于資料版本號機制實作,版本號?:即為資料增加一個版本標識,
一般通過為資料庫表添加“version”欄位來實作讀取資料時,也將此版本一同讀出,之后來讀取資料的人提交資料更新時,會對此版本號加1,
此時提交資料的版本號與資料庫表對應記錄的當前版本號對比,若提交資料版本號大于資料庫表當前版本號,則準予更新(資料庫當前版本號只會更新一次)
示例:
1,A操作員將用戶資料讀取(version=1),進行修改操作,
2,B操作員將用戶資料讀取(version=1),進行修改操作,
3,A完成操作,提交資料時(version +1 =2),提交更新,此時提交資料版本號大于資料庫記錄的當前版本號,準許提交,
4,B完成操作,提交資料時(version +1 =2),提交更新,但是此時的資料庫記錄的版本號已經被A提交資料后更新為2了,所以B提交的版本號不大于資料庫記錄的當前版本號,則不準予提交資料更新,
因為資料庫記錄的版本號只更新一次,誰快先更新了,版本號就變了,必須等上一個執行緒完成后再進去操作,(就爭媳婦似的的,誰下手快生了娃,誰就穩了)
redis的watch機制實作樂觀鎖(監視一個或多個key,如果在事務exec執行之前這個key被其他命令更改,那么該事務將會被打斷)
命令如下:
set k1 1 //設k1為1
watch k1 //監視k1
set k1 2 //k1值在被監視時被更改為2,另外人開客戶端更改也一樣
multi //開始事務
set k1 3 //將k1值改為3
exec //提交事務
輸出null,事務被放棄,檢測到k1也被更改為2,不再是1了,
(就像本來你跟你女朋友快要結婚了,但是結婚前一天在你爸媽的眼皮子底下決定跟別人私奔,你爹媽知道了不想讓你背鍋,在你們結婚時強行拆散,唉,真慘,)
redis的持久化機制
持久化概述:持久化==存盤,就一直存著可以,
redis持久化:redis資料存盤在記憶體中,記憶體是瞬時的,如果發生宕機或者系列糟糕情況,記憶體會丟失,redis提供兩者持久化機制
//就跟男人一樣,要持久,持之以恒,堅定不移,
RDB方式:在指定的時間間隔內將記憶體中的資料快照寫入磁盤,資料恢復時將快照檔案直接再讀到記憶體
步驟:在redis.conf檔案中配置
配置格式:save <seconds><changes>
save 900 1 //900秒內一次資料更改會保存一次
save 3000 10
save 6000 20
組態檔redis.conf中搜索SNAPSHTTING:dbfilename:設定RDB檔案名,默認檔案名為dump.rdb //就是可以修改保存檔案的名字
dir:指定RDB和AOF的檔案目錄 //修改保存檔案的指定目錄
//修改redis.conf檔案后要重啟一下redis
AOF方式:redis每收到一條修改命令時,它將命令寫道一個AOF檔案中(不記錄讀命令),當redis重啟時,再通過AOF中的所有命令在恢復
步驟:rdis.conf檔案中搜索APPEND ONLY MODE
1,將append only改為yes,默認no;
AOF相關設定: 1,appengfilename:AOF檔案名,可改,默認:appendonly.aof
////查看aop檔案存盤的命令:1,ll *.aop;2,cat appendonly .aof
2,appendfsync:配置向aof檔案寫命令資料策略:
1,append fsync always 每次執行寫入都會執行同步,慢且安全
2,append fsync everysec 每秒執行一次同步操作
3,append fsync no 不主動進行同步操作,交給系統來做,30秒一次,快但不且不安全
3,auto-aof-rewrite-percentage(例如:100):設定當目前aof檔案大小超過上一次重寫時aof檔案大小的百分之多少時,將再次進行重寫;若之前未進行重寫,則以啟動時最小aof檔案大小為依據;
//進行檔案優化,例:set k1 1 后再執行 set k1 2,那么set k1 1則不被記錄,只記錄有用的命令
4,auto-aof-rewtite-min-size(例如:64mb):設定允許重寫的最小aof檔案大小
總結:可以同時使用兩種方式,默認優先加載aof
redis集群
主從復制
主從復制(master/slave):
簡介:redis做集群,為保證單點故障,就將資料復制多芬島多臺不同服務器,即使其中一臺出現故障,其他服務仍可運行,
實作:部署多臺redis,并在組態檔中指定之間的主從關系,主負責寫,同時將寫入資料實時同步到從機器,即主從復制,master/slave,redis默認master用于寫,slave用于讀,
配置方式一:修改組態檔,啟動時,服務器讀取組態檔,自動成為指定服務器的從服務器,構成主從復制關系,
主服務器(master)
include /usr/local/redis-5.0.3/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis6380.pid
logtile 6380.log
dbfilename dump6380.rdb
從服務器(slave)
include /usr/local/redis-5.0.3/redis.conf
daemonize yes
port 6381
pidfile /var/run/redis6380.pid
logtile 6381.log
dbfilename dump6381.rdb
slaveof 127.0.0.1 6380
示例:(由于只有一臺服務器,因此在一個redis中啟三個實體,一個master兩個slave)方便觀看就開4個客戶端視窗,
以下為客戶端視窗 1,
bin目錄下
cp redis.conf redis6380.conf //復制原來redis6379.conf組態檔,并生成新的redis6380.conf組態檔
ll //出現redis6380.conf檔案
>redis6380.conf //滯空redis6380.conf檔案
vim redis6380.conf //進入redis6380.conf檔案,添加主服務的配置
配置master
include /usr/local/redis-5.0.3/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis6380.pid
logtile 6380.log
dbfilename dump6380.rdb
:wq //如果無法保存退出,就按下esc鍵再,:wq a.txt
配置從slave
cp redis6380.conf redis6381.conf //復制redis6380.conf檔案
vim redis6381.conf //進組態檔配置從
include /usr/local/redis-5.0.3/redis.conf
daemonize yes //表示后臺啟動
port 6380
pidfile /var/run/redis6380.pid
logtile 6380.log
dbfilename dump6380.rdb
slaveof 127.0.0.1 6380 //設定是6380的從服務器
:wq //如果無法保存退出,就按下esc鍵再,:wq a.txt
cp redis6380.conf redis6382.conf //復制redis6380.conf檔案
vim redis6381.conf //進組態檔配置從
include /usr/local/redis-5.0.3/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis6380.pid
logtile 6380.log
dbfilename dump6380.rdb
slaveof 127.0.0.1 6380 //設定是6380的從服務器
:wq //如果無法保存退出,就按下esc鍵再,:wq a.txt
客戶端視窗2
./redis-server ../redis6380.conf //后臺啟動master
./redis-server ../redis6381.conf //后臺啟動slave
./redis-server ../redis6382.conf //后臺啟動slave
ps -ef | grep redis //查看這三個行程是否啟動
如果已經有三個行程的了,也可以檢查各個埠所處角色
./redis -cli -p 6380 //開啟6381客戶端
info replication //插看服務器角色命令
查看的資訊:
role:master(主) //角色master
connected_slaves:2 //兩個從,埠號分別為
slave0:port:6381
slave1:port:6382
客戶端視窗3
./redis -cli -p 6381 //開啟6381客戶端
info replication //插看服務器角色命令
查看的資訊:
role:slave(從) //角色slave
master_host:127.0.0.1 //主是本地的
master_port:6380 //埠號為6380
master_link_status:up //開啟狀態
客戶端視窗4
./redis -cli -p 6382 //開啟6381客戶端
info replication //插看服務器角色命令
查看資訊與3一樣
配置完成可測驗
1,回到master所在客戶端視窗
set k1 v1
set k2 v2 //設定兩個值,在從服務器去取,看是否能讀取值
2,回到任意一個slave所在客戶端視窗
get k1
get k2
3,看能否讀到值,讀到即配置成功
get k3 //讀master為設定的值看是否能讀到
輸出null,未讀到;
4,回到master所在客戶端視窗
set k3 v3 //設定k3,再去slave讀,看是否能讀取
5,回到任意一個slave所在客戶端視窗
get k3
輸出:v3 //讀取成功
主從關系配置完成
如果現在出現問題了,master服務器宕機了,關閉了,主沒了,只有從了,怎么辦?
引入新的處理方式
容災處理(冷處理):當master服務出現故障后,需要手動將slave中的一個提升為master,將剩下的slave重新掛至新的master上;
命令如下:
slaveof no one :將一臺slave服務器提升為master
slaveof 127.0.0.1 6381(新提上slave埠號):將slave掛至新的master上
操作示例:
1,在master所在服務器客戶端
shutdown //關閉master,模擬master出故障
ps -ef | grep redis //查看redis6380.conf行程是否被關閉
2,在任意一個slave所在服務器客戶端
slaveof no one //提升為主
info replication //查看所處角色即從服務
顯示資訊
role:master //角色為主
connected_slaves:0 //沒有從服務器
3,在另外slave中的任意一個slave所在服務器客戶端
slaveof 127.0.0.1 6381 //將本slave掛至新的master上去
info replication //查看角色及主服務
顯示資訊
role:slave
master_host:127.0.0.1
master_port:6381 //掛在了新的master上了
4,假如現在原來的master6380服務器修好
./redis-server ../redis6380.conf //后臺啟動
ps -ef | grep redis //查看行程是否被啟動
./redis-cli -p 6380 //進入redis
info replication //查看角色
顯示資訊
role:master //角色為master
connected_slaves:0 //slaves為0
原來master重啟后,默認角色為master現在將它掛至新的6381master上去
slaveof 127.0.0.1 6381 //將本slave掛至新的master上去
總結:
1,使用到的相關命令:
./redis-cli -p 6380 進入指定客戶端埠
info replication 查看redis服務器所處角色
如果不配置啟動,默認為master
2,master下線,寫請求無法執行;slave下線,讀請求處理性能下降
3,master故障,需要手動提升一個slave為master,其他的slave要重新掛至新的master上去
4,主從復制模式的故障轉移需要手動操作,需要實作自動化處理,就再次引入Sentine哨兵,實作故障自動轉移
哨兵模式(熱處理)
作用:Sentine哨兵可以來監控多個redis服務實體運行情況
Sentinel配置:
1,復制三份檔案:sentinel26380.conf,sentinel26381.conf,sentinel26382.conf;
2,修改每個組態檔
port 26380;port 26381;port 26382;
sentinel monitor mymaster 127.0.0.1 6380 2
Sentinel會根據master的配置自動發現master和slave,Sentinel默認埠是26379
3,啟動三個實體
./redis-sentinel ../sentinel26380.conf
./redis-sentinel ../sentinel26380.conf
./redis-sentinel ../sentinel26380.conf
啟動三個實體后,會創建三個監視master服務的Sentinel實體
4,哨兵模式已啟動;
操作示例:
redis6379客戶端視窗
1, cd usr/local/redis-5.0.3/bin //進入bin檔案夾
2,ll //會看到一個
// redis-sentinel 哨兵可執行檔案,讀取組態檔,站崗
// sentinel.conf 哨兵組態檔
3,復制三個sentinel.conf組態檔
cp sentinel.conf sentinel26380.conf //復制sentinel26379組態檔生成新的sentinel26380檔案
cp sentinel.conf sentinel26381.conf
cp sentinel.conf sentinel26382.conf
4,逐個修改sentinel.conf檔案
vim sentinel26380.conf
port 26380 (進哪個埠改那個)
sentinel monitor mymaster 127.0.0.1 6381 2
// 2 投票數:這個投票數就是哨兵的投票數,檢測master的這個哨兵發現這個master掛了,但它不能直接確定,
//會讓其他的哨兵也來檢測這個master,認為掛了的哨兵就投一票,等票數過半了,就確定真掛了,
:wq //保存退出
vim sentinel26381.conf
port 26381 (進哪個埠改那個)
sentinel monitor mymaster(可修改檔案名) 127.0.0.1 6381(主服務埠號,上面新提升的slave) 2(投票數)
:wq //保存退出
vim sentinel26382.conf
port 26382 (進哪個埠改那個)
sentinel monitor mymaster(可修改檔案名) 127.0.0.1 6381(主服務埠號,上面新提升的slave) 2(投票數)
:wq //保存退出
/*
決議:
sentinel monitor mymaster(檔案名可修改) 127.0.0.1(本地地址) 6381(master,主服務埠號) 2(投票數)
2 投票數:這個投票數就是哨兵的投票數,檢測master的這個哨兵發現這個master掛了,但它不能直接確定master掛了,
會讓其他的哨兵也來檢測這個master,認為掛了的哨兵就投一票,等票數過半了,就確定真掛了,
*/
5,ls //查看檔案會看到三個sentinel.conf檔案
./redis-sentinel ../sentinel26380.conf //啟動檔案
6,在新建兩個客戶端視窗方便啟動,1視窗,2,視窗
1視窗
./redis-sentinel ../sentinel26381.conf
2視窗
./redis-sentinel ../sentinel26382.conf
7,回到之前的master客戶端視窗,關閉master,演示故障轉移
shutdown
ps -ef | gerp redis //查看行程,redis6381是否被關閉
8,看1,2視窗,是否列印的日志資訊
...
# + failover-end master mymaster 127.0.0.1 6381 //6381行程end
# + switch-master mymaster 127.0.0.1 6381 127.0.0.1 6380 //master6381替換成6380
9,回到6380客戶端視窗查看角色
info replication
資訊顯示
role:slave //角色slave
master-port:6380 //它的master是6380
10,回到6381(被停掉的master服務器),重啟服務看看
./redis-server ../redis6381.conf //重啟服務
./redis -cli -p 6381 //進入redis客戶端
info replication
顯示資訊
role:slave //角色slave
master-port:6380 //它的master是6380
示例完成;
總結:哨兵模式你補了容災處理需要手動處理的缺陷,哨兵監控master主服務,當它發現master掛了的時候會自動進行古故障轉移,
自動將其中的slave與掛了的master進行角色交換,而后就算掛了的master服務重啟后也不再是master,而是自動修改成新master服務的slave服務,
redis相關安全
redis設定密碼:redis.conf檔案配置中 requirepass 123456
操作示例:
cd usr/local/redis-5.0.3
vim redis.conf //進入配置修改
找到requirepass去掉注釋,后面加上密碼 123456
:wq
kill 6379 //殺掉行程重啟
./redis-server ../redis.conf & //啟動后臺
./redis -cli -p 6379 //啟動6379客戶端
AUTH 123456
在jedis連接客戶端時也要密碼
jedis.auth("123456");
系結ip:#bin 127.0.0.1 去點注釋,127.0.0.1換成你允許連接的ip.表示只允許這個ip進行訪問;
命令禁止和重命名(也是在redis.conf配置中進行):
rename-command FLUSHALL del 重命名flushall命令為del
注意:這里重命名前提是appendonly.aof檔案中沒有flushall命令,否則服務器無法啟動
//因為redis.conf配置里改名了,appendonly.aof檔案中還存在flushall命令,那會沖突,無法識別del新命令
rename-command FLUSHALL "" 禁用flushall //flushall 清空本庫所有資訊
rename-command FLUSHDB "" 禁用flushdb //flushdb 清空所有庫所有資訊
rename-command CONFIG JIJJMKXW 重命名config命令
rename-command CONFIG "" 禁用config命令 //config查看所有配置 config get *
redis特點:
簡單穩定;支持豐富的記憶體結構;讀寫速度快;有持久化支持;支持部分事務操作;
總結:紙上得來尚覺淺,絕知此事要躬行;
set k1 "加油!"
https://www.bilibili.com/video/BV1Q4411N7u4/?p=28
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/8787.html
標籤:NoSQL
