數據庫基礎之13(redis主從複製結構,哨兵模式,持久化之RDB,持久化之AOF,hash表,list表)

目錄

redis主從複製結構模式

1、主從複製工作原理

2、配置從庫

3、反客爲主---手動從庫變主庫

4、哨兵模式---自動從庫變主庫

 5、配置帶驗證的主從複製---帶密碼自動從庫變主庫

6、持久化之RDB

7、持久化之AOF

8、字符串操作

9、hash表

10、list列表

11、其它操作指令


redis主從複製結構模式


1、主從複製工作原理

• 工作原理:

  • – Slave 向 maste 發送 sync 命令
  • – Master 啓動後臺存盤進程,同時收集所有修改數據命令
  • – Master 執行完後臺存盤進程後,傳送整個數據文件到slave
  • – Slave 接收數據文件後,將其存盤並加載到內存中完成首次完全同步
  • – 後續有新數據產生時, master 繼續將新的所有收集到的修改命令依次傳給 slave ,完成同步

 

  • 主從複製缺點
  1. – 網絡繁忙,會產生數據同步延時問題
  2. – 系統繁忙,會產生數據同步延時問題


2、配置從庫

• 配置從庫 192.168.4.52/24
– redis 服務運行後,默認都是 master 服務器
– 修改服務使用的 IP 地址 bind 192.168.4.X
[root@redis52 ~]# redis-cli -h 192.168.4.52
192.168.4.52:6379> info replication                 // 查看主從配置信息
# Replication
role:master
connected_slaves:0
......
192.168.4.52:6379> SLAVEOF 192.168.4.51 6379------臨時設定自己爲從庫
OK
192.168.4.52:6379> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6379
 
注:命令行指定從庫    SLAVEOF 主庫IP地址 端口號----------重起機器會失效
192.168.4.52:6352> slaveof 192.168.4.51 6351
OK
 

3、反客爲主---手動從庫變主庫

• 反客爲主
– 主庫宕機後,手動將從庫設置爲主庫
[root@redis52 ~]# redis-cli -h 192.168.4.52
192.168.4.52:6379> SLAVEOF no one-----還原爲主庫
OK
192.168.4.52:6379> info replication
# Replication
role:master


4、哨兵模式---自動從庫變主庫

• 哨兵模式

  1. – 主庫宕機後,從庫自動升級爲主庫
  2. – 在 slave 主機編輯 sentinel.conf 文件
  3. – 在 slave 主機運行哨兵程序

[root@redis52 ~]# vim /etc/sentinel.conf
sentinel monitor redis51 192.168.4.51 6351 1-------格式:sentinel monitor 主機名 ip地址 端口 票數
sentinel auth-pass redis51 123456--------------針對監控的主庫設有密碼,所以這裏也必須配置對應密碼    
 
[root@redis52 ~]# redis-sentinel /etc/sentinel.conf-----運行哨兵程序
 
在這裏注意以下:

  1. 主機名:自定義
  2. IP 地址: 被檢控主庫的 IP 地址
  3. 端 口: master 主機 redis 服務使用的端口
  4. 票 數:主庫宕機後, 票數大於 1 的主機被升級爲主庫

 
5、配置帶驗證的主從複製---帶密碼自動從庫變主庫

• 配置 master 主機
– 設置連接密碼 ,啓動服務,連接服務
[root@redis51 ~]# vim /etc/redis/6379.conf
bind 192.168.4.51
requirepass 123456  ------設置連接redis服務器的密碼
[root@redis51 ~]#
[root@redis51 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@redis51 ~]# redis-cli -h 192.168.2.52 -a 123456 -p 6351
192.168.4.51:6379>
 
• 配置 slave 主機
– 指定主庫 IP ,設置連接密碼,啓動服務
[root@redis52 ~]# vim /etc/redis/6379.conf
bind 192.168.4.52
slaveof 192.168.4.51 6351 -----------作爲誰的從庫
masterauth 123456   --------------------主庫密碼,若無密碼則沒辦法從主庫備份數據
[root@redis52 ~]#
[root@redis52 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@redis52 ~]# redis-cli -h 192.168.4.52
192.168.4.52:6379> INFO replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6379
 

root@redis52 ~]# vim /etc/sentinel.conf
sentinel monitor redis51 192.168.4.51 6351 1-------格式:sentinel monitor 主機名 ip地址 端口 票數
sentinel auth-pass redis51 123456--------------針對監控的主庫設有密碼,所以這裏也必須配置對應密碼    
 
[root@redis52 ~]# redis-sentinel /etc/sentinel.conf-----運行哨兵程序


6、持久化之RDB

RDB介紹

  • 全稱 Reids DataBase
  • – 數據持久化方式之一
  • – 在指定時間間隔內,將內存中的數據集快照寫入硬盤
  • – 術語叫 Snapshot 快照。
  • – 恢復時,將快照文件直接讀到內存裏。

相關配置參數 vim /etc/redis/6379.conf
• 文件名
– dbfilename “dump.rdb"---- 默認文件名
– save “”------------------ 禁用 RDB
• 數據從內存保存到硬盤的頻率
– save 900 1--------------- 900 秒內且有 1 次修改存盤
– save 300 10---------------300 秒內且有 10 次修改存盤
– save 60 10000-------------60 秒內且有 10000 修改存盤
注意:不管時間頻率條件是否滿足,只要停一次服務/etc/init.d/redis_6379 stop,redis就會將內存中的數據存盤到dump.rdb,若沒有該文件,則會自動創建此文件。所以就算flushall,千萬不要緊接着shutdown,先將dump.rdb備份以下,然後停止服務,再將備份的數據覆蓋複製dump.rdb,再啓服務就可以了,數據照樣能恢復。


• 手動立刻存盤

  1. – > save---阻塞寫存盤,存盤的時候不允許存儲數據
  2. – > bgsave ------不阻塞寫存盤

• 壓縮
– rdbcompression yes | no
• 在存儲快照後,使用 crc16 算法做數據校驗
– rdbchecksum yes|no
• bgsave 出錯停止寫操作 , 對數據一致性要求不高設置爲 no
– stop-writes-on-bgsave-error yes|no
 
使用RDB文件恢復數據
• 備份數據
– 備份 dump.rdb 文件到其他位置
– ~]# cp 數據庫目錄 /dump.rdb    備份目錄
• 恢復數據

  1. - 停掉redis服務
  2. – 把備份的 dump.rdb 文件拷貝回數據庫目錄 , 重啓 redis 服務
  3. – cp 備份目錄 /dump.rdb 數據庫目錄 /
  4. – /etc/init.d/redis_6379 start

RDB優點與缺點
• RDB 優點
– 持久化時, Redis 服務會創建一個子進程來進行持久化,會先將數據寫入到一個臨時文件中,待持久化過程都結束了,再用這個臨時文件替換上次持久化好的文件;整個過程中主進程不做任何 IO 操作,這就確保了極高的性能。
– 如果要進行大規模數據恢復,且對數據完整性要求不是非常高,使用 RDB 比 AOF 更高效。
• RDB 的缺點
– 意外宕機,最後一次持久化的數據會丟失。


7、持久化之AOF

AOF介紹

  1. • 只追加操作的文件
  2. – Append Only File
  3. – 記錄 redis 服務所有寫操作。
  4. – 不斷的將新的寫操作,追加到文件的末尾。
  5. – 使用 cat 命令可以查看文件內容

相關配置參數
• 文件名
– appendfilename "appendonly.aof" -----默認文件名
– appendonly yes --------------啓用aof ,默認 no
 
• AOF 文件記錄,寫操作的三種方式
– appendfsync always------------有新的寫操作立即記錄,性能差,完整性好。
– appendfsync everysec -------- 每秒記錄一次,宕機時會丟失 1 秒的數據
– appendfsync no---------------系統不忙的時候,才存數據到aof文件
 
• 日誌重寫 ( 日誌文件會不斷增大 ) ,何時會觸發日誌重寫
– redis 會記錄上次重寫時 AOF 文件的大小,默認配置
是當 aof 文件是上次 rewrite 後大小的 1 倍且文件大於
64M 時觸發。
– auto-aof-rewrite-percentage 100
– auto-aof-rewrite-min-size 64mb
 
• 修復 AOF 文件,
– 把文件恢復到最後一次的正確操作(針對於不小心把aof文件修改錯了)
[root@redis53 6379]# redis-check-aof --fix appendonly.aof
0x
83: Expected \r\n, got: 6166
AOF analyzed: size=160, ok_up_to=123, diff=37
This will shrink the AOF from 160 bytes, with 37 bytes, to 123
bytes
Continue? [y/N]: y
Successfully truncated AOF
 
使用AOF文件恢復數據
• 備份數據

- 停掉redis服務
– 備份 appendonly.aof 文件到其他位置
– ~]# cp 數據庫目錄 /appendonly.aof    備份目錄
 
• 恢復數據
– 把備份的 appendonly.aof 文件拷貝回數據庫目錄 , 重啓 redis 服務
– Cp 備份目錄 /appendonly.aof  數據庫目錄/   
 – /etc/init.d/redis_6379 start
 
AOF優點與缺點
• AOF 優點

  1. – 可以靈活的設置同步持久化 appendfsync alwayls ,異步持久化 appendfsync everysec
  2. – 宕機時,僅可能丟失 1 秒的數據

 
• AOF 的缺點
– AOF 文件的體積通常會大於 RDB 文件的體積。執行 fsync 策略時的速度可能會比 RDB 慢。


8、字符串操作

• set key value [ex seconds] [px milliseconds] [nx|xx]
– 設置 key 及值,過期時間可以設置爲秒或毫秒爲單位
– ex 設置過期秒
– px 設置過期毫秒
– nx 只有 key 不存在,纔對 key 進行操作    不存在變量才定義變量
– xx 只有 key 已存在,纔對 key 進行操作    存在變量才定義變量(修改)


• setrange key offset value
– 從偏移量開始複寫 key 的特定位的值
>set first "hello world"
>setrange first 6 “Redis”        // 改寫爲 hello Redis
192.168.4.51:6351> set num 13356894561
OK
192.168.4.51:6351> setrange num 4 ***** -----------這裏的4是從0開始的,所以4就是第5位,從第5位開始將後面的5位改爲*
(integer) 11
192.168.4.51:6351> get num
"1335*****61"
注:引號不算字符長度。空格算一個字符長度

• getrange key start end
– 返回字串值中的子字串,截取範圍爲 start 和 end
– 負數偏移量表述從末尾計數, -1 表示最後一個字符, -2表示倒數第二個字符
192.168.4.51:6351> set h 1234567
OK
192.168.4.51:6351> getrange h 3 6
"4567"
 
>set first “hello,the world”
>getrange first -5 -1
>getrange first 0 4
in
 
• append key value
192.168.4.51:6351> append name harry-------– 字符存在則追加,不存在則創建 key 及 value
(integer) 5     ---------------------------– 返回值爲 key 的長度
192.168.4.51:6351> get name
"harry"
192.168.4.51:6351> append name 9999
(integer) 9
192.168.4.51:6351> get name
"harry9999"

• strlen key
– 統計字串長度
192.168.4.51:6351> strlen name
(integer) 9
 
• setbit key offset value
– 對 key 所存儲字串,設置或清除特定偏移量上的位 (bit)
– Value 值可以爲 1 或 0 , offset 爲 0~2^32 之間
– key 不存在,則創建新 key
>setbit bit 0 1
>setbit bit 1 0
bit: 第 0 位爲 1 ,第一位爲 0
 
• bitcount key
– 統計字串中被設置爲 1 的比特位數量
>setbit bits 0 1        //0001
>setbit bits 3 1        //1001
>bitcount bits        //結果爲 2
記錄網站用戶上線頻率,如用戶 A 上線了多少天等類似的數據
如用戶在某天上線,則使用 setbit ,以用戶名爲 key ,將網站上線
日爲 offset ,並在該 offset 上設置 1 ,最後計算用戶總上線次數時
,使用 bitcount 用戶名即可
這樣,即使網站運行 10 年,每個用戶僅佔用 10*365 比特位即 456
字節即可
>setbit peter 100 1 // 網站上線 100 天用戶登錄了一次
>setbit peter 105 1 // 網站上線 105 天用戶登錄了一次
>bitcount peter
 
• decr key
– 將 key 中的值減 1 , key 不存在則先初始化爲 0 ,再減 1
>set test 10
>decr test


• decrby key decrement
– 將 key 中的值,減去 decrement
>set count 100
>decrby count 20


• get key
– 返回 key 所存儲的字符串值
– 如果 key 不存在則返回特殊值 nil
– 如果 key 的值不是字串,則返回錯誤, get 只能處理字串
 
• mget key [key...]
– 一次獲取一個或多個 key 的值,空格分隔, < 具有原子性>
• mset key value [key value ...]
– 一次設置多個 key 及值,空格分隔, < 具有原子性 >
192.168.4.51:6351> mset j 1 k 2
OK
192.168.4.51:6351> get j
"1"
192.168.4.51:6351> get k
"2"
 
• incr key
– 將 key 的值加 1 ,如果 key 不存在,則初始爲 0 後再加 1
– 主要應用爲計數器
• incrby key increment
– 將 key 的值增加 increment
192.168.4.51:6351> set age 56
OK
192.168.4.51:6351> get age
"56"
192.168.4.51:6351> incr age
(integer) 57
192.168.4.51:6351> incrby age 10
(integer) 67
 
• incrbyfloat key increment
– 爲 key 中所儲存的值加上浮點數增量 increment
192.168.4.51:6351> set num 15.1
OK
192.168.4.51:6351> get num
"15.1"
192.168.4.51:6351> incrbyfloat num 3.1
"18.2"

 

9、hash表

Hash表簡介

  • • Redis hash 是一個 string(字符) 類型的 value(字段) 和 value(值) 的映射表
  • • 一個 key 可對應多個 field ,一個 field 對應一個 value
  • • 將一個對象存儲爲 hash 類型,相比較於每個字段都存儲成string 類型更能節省內存Hash表操作

• hset key field value
192.168.4.50:6350> hset me hobby swiming------給變量me的hobby字段賦值爲swimming
(integer) 1
192.168.4.50:6350> hset me name  jack
(integer) 1
192.168.4.50:6350> hset me age   25
(integer) 1
192.168.4.50:6350> hset me color white
(integer) 1

• hmset key field value [field value...]– 同時給 hash 表中的多個 field 賦值
192.168.4.50:6350> hmset me hight 185 num 1----me爲變量,hight和num爲該變量的字段
OK


• hget key filed-----------------– 獲取 hash 表中 field 的值
192.168.4.50:6350> hget me age
"25"
• hmget key field [field...]– -------------返回 hash 表中多個 field 的值
192.168.4.50:6350> hmget me age name
1) "25"
2) "jack"


• hkeys key– ---------------返回 hash 表中所有 字段名稱
192.168.4.50:6350> hkeys me
1) "hobby"
2) "name"
3) "age"
4) "color"
5) "hight"
6) "num"

• hvals key–-------------- 返回 hash 表中所有 字段的值
192.168.4.50:6350> hvals me
1) "swiming"
2) "jack"
3) "25"
4) "white"
5) "185"
6) "1"

• hgetall key– 返回 hash 表中所有 field 的值,包括字段名稱-----hvals + hkeys=hgetall
192.168.4.50:6350> hgetall me
 1) "hobby"
 2) "swiming"
 3) "name"
 4) "jack"
 5) "age"
 6) "25"
 7) "color"
 8) "white"
 9) "hight"
10) "185"
11) "num"
12) "1"



• hdel key field [field...]–--------------- 刪除 hash 表中多個 字段 的值,不存在則忽略
192.168.4.50:6350> hdel me age name
(integer) 2
192.168.4.50:6350> hkeys me
1) "hobby"
2) "color"
3) "hight"
4) "num"


10、list列表

List列表簡介

  1. • Redis 的 list 是一個字符隊列
  2. 後進先出
  3. • 一個 key 可以有多個值

List列表操作
• lpush key value [value...]
– 將一個或多個值 value 插入到列表 key 的表頭
– Key 不存在,則創建 key
>lpush list a b c ---------list值依次爲 c b a,等同於 lpush list a; lpush list b; lpush list c
• lrange key start stop----------– 從開始位置讀取 key 的值到 stop 結束
[root@host50 ~]# redis-cli -h 192.168.4.50 -p 6350
192.168.4.50:6350> lpush website a b c d e
(integer) 5
192.168.4.50:6350> type website
list
192.168.4.50:6350> lrange website 0 -1--------------從開始讀到(倒數第一個)結束爲止----注意這裏第一個是從0開始算的
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
192.168.4.50:6350> lrange website 0 0------------從開始讀到開始
1) "e"
192.168.4.50:6350> lrange website 0 -2---------------從 0 位開始,讀到倒數 2 位爲止
1) "e"
2) "d"
3) "c"
4) "b"
192.168.4.50:6350> lrange website 0 -3
1) "e"
2) "d"
3) "c"
192.168.4.50:6350> lrange website 0 2
1) "e"
2) "d"
3) "c"
192.168.4.50:6350> lrange website -2 -1
1) "b"
2) "a"
192.168.4.50:6350> lrange website -1 -2
(empty list or set)


• lpop key-----------– 移除並返回到表頭元素數據, key 不存在則返回 nil
>lpop list----------------- 刪除表頭元素,可以多次執行

• rpop key-----– 刪除並返回 key 末尾的值
192.168.4.50:6350> rpop website
"q"

• llen key
– 返回列表 key 的長度

192.168.4.50:6350> llen website
(integer) 4


• lindex key index
– 返回列表中第 index 個值
如 lindex key 0 ; lindex key 2; lindex key -2
192.168.4.50:6350> lrange website 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
192.168.4.50:6350> lindex website 0
"d"

• lset key index value
– 將 key 中 index 位置的值修改爲 value
>lset list 3 test            // 將 list 中第 3 個值修改爲 test
192.168.4.50:6350> lset website 0 D
OK
192.168.4.50:6350> lindex website 0
"D"

• rpush key value [value...]--------– 將 value 插入到 key 的末尾
>rpush list3 a b c            //list3 值爲 a b c
192.168.4.50:6350> rpush website o p q------插入時先進先出
(integer) 7
192.168.4.50:6350> lrange website 0 -1
1) "D"
2) "c"
3) "b"
4) "a"
5) "o"
6) "p"
7) "q"



11、其它操作指令


• del key [key...]-----– 刪除一個或多個 key
• exists key------– 測試一個 key 是否存在
• expire key seconds-----– 設置 key 的生存週期
• persist key-----– 設置 key 永不過期
• ttl key---------– 查看 key 的生存週期
• keys 匹配
– 找符合匹配條件的 key ,特殊符號用 \ 屏蔽

  1. >keys *                                        // 顯示所有 key
  2. >keys h?llo                                 // 匹配 hello,hallo,hxllo 等
  3. >keys h*llo                                 // 匹配 hllo 或 h***llo 等
  4. >keys h[ae]llo                                 // 匹配 hello 和 hallo

• flushall------– 清空所有數據
• select id------– 選擇數據庫, id 用數字指定,默認數據庫爲 0
>select 0
>select 2
• move key db_id--------– 將當前數據庫的 key 移動到 db_id 數據庫中
>move key   1 --------------將 key 移動到 1 數據庫中
• rename key newkey----– 給 key 改名爲 newkey , newkey 已存在時,則覆蓋其值
• renamenx key newkey------– 僅當 newkey 不存在時,纔將 key 改名爲 newkey
• sort key------– 對 key 進行排序
>sort cost   -------------默認對數字排序,升序
>sort cost desc  -----------------降序
>lpush test “about” “site” “rename”
>sort test alpha  -----------對字符排序
>sort cost alpha limit 0 3  ---------------排序後提取 0-3 位數據
>sort cost alpha limit 0 3 desc
>sort cost STORE cost2    -----------對 cost 排序並保存爲 cost2
• type key--------– 返回 key 的數據類型

發佈了41 篇原創文章 · 獲贊 20 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章