1 案例1:配置redis主從複製
1.1 問題
- 具體要求以下:
- 將主機192.168.4.51做爲主庫
- 將主機192.168.4.52做爲從庫
- 測試配置
1.2 步驟
實現此案例須要按照以下步驟進行。node
步驟一:配置redis主從複製redis
1) 配置主從,4.51爲主,4.52爲從數據庫
若主機作過redis集羣,須要在配置文件裏面把開啓集羣,存儲集羣信息的配置文件都關閉,新主機則不用,這裏用以前的redis集羣作主從,須要還原redis服務器,4.51和4.52都須要還原(以4.51爲例)vim
- [root@redisA ~]# redis-cli -c -h 192.168.4.51 -p 6351 shutdown
- [root@redisA ~]# vim /etc/redis/6379.conf
- bind 192.168.4.51
- port 6379
- # cluster-enabled yes
- # cluster-config-file nodes-6351.conf
- [root@redisA ~]# /etc/init.d/redis_6379 start
- Starting Redis server...
- [root@redisA ~]# ss -antlp | grep 6379
- LISTEN 0 511 192.168.4.51:6379 *:* users:(("redis-server",pid=22274,fd=6))
- [root@redisA ~]# redis-cli -h 192.168.4.51
- 192.168.4.51:6379> info replication
- # Replication
- role:master
- connected_slaves:0
- master_replid:eaa14478158a71c41f947eaea036658c2087e8f2
- master_replid2:0000000000000000000000000000000000000000
- master_repl_offset:0
- second_repl_offset:-1
- repl_backlog_active:0
- repl_backlog_size:1048576
- repl_backlog_first_byte_offset:0
- repl_backlog_histlen:0
- 192.168.4.51:6379>
2)配置從庫192.168.4.52/24緩存
- 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
- master_link_status:up
- master_last_io_seconds_ago:3
- master_sync_in_progress:0
3)主庫查看app
- [root@redisA ~]# redis-cli -h 192.168.4.51
- 192.168.4.51:6379> info replication
- # Replication
- role:master
- connected_slaves:1
- slave0:ip=192.168.4.52,port=6379,state=online,offset=14,lag=1
- master_replid:db7932eb0ea4302bddbebd395efa174fb079319f
- master_replid2:0000000000000000000000000000000000000000
- master_repl_offset:14
- second_repl_offset:-1
- repl_backlog_active:1
- repl_backlog_size:1048576
- repl_backlog_first_byte_offset:1
- repl_backlog_histlen:14
- 192.168.4.51:6379>
4)反客爲主,主庫宕機後,手動將從庫設置爲主庫異步
- [root@redisA ~]# redis-cli -h 192.168.4.51 shutdown
- 192.168.4.52:6379> SLAVEOF no one
- OK
- 192.168.4.52:6379> INFO replication
- # Replication
- role:master
- connected_slaves:0
- master_replid:00e35c62d2b673ec48d3c8c7d9c7ea3366eac33a
- master_replid2:db7932eb0ea4302bddbebd395efa174fb079319f
- master_repl_offset:420
- second_repl_offset:421
- repl_backlog_active:1
- repl_backlog_size:1048576
- repl_backlog_first_byte_offset:1
- repl_backlog_histlen:420
- 192.168.4.52:6379>
5)哨兵模式性能
主庫宕機後,從庫自動升級爲主庫測試
在slave主機編輯sentinel.conf文件
在slave主機運行哨兵程序
- [root@redisB ~]# redis-cli -h 192.168.4.52
- 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
- ...
- [root@redisA ~]# /etc/init.d/redis_6379 start
- Starting Redis server...
- [root@redisA ~]# redis-cli -h 192.168.4.51
- 192.168.4.51:6379> info replication
- # Replication
- role:master
- connected_slaves:1
- slave0:ip=192.168.4.52,port=6379,state=online,offset=451,lag=1
- master_replid:4dfa0877c740507ac7844f8dd996445d368d6d0f
- master_replid2:0000000000000000000000000000000000000000
- ...
- [root@redisB ~]# vim /etc/sentinel.conf
- sentinel monitor redisA 192.168.4.51 6379 1
- 關鍵字 關鍵字 主機名自定義 ip 端口 票數
- sentinel auth-pass redis51 密碼
- [root@redisB ~]# redis-sentinel /etc/sentinel.conf
- ...
- 25371:X 28 Sep 11:16:54.993 # +sdown master redis51 192.168.4.51 6379
- 25371:X 28 Sep 11:16:54.993 # +odown master redis51 192.168.4.51 6379 #quorum 1/1
- 25371:X 28 Sep 11:16:54.993 # +new-epoch 3
- 25371:X 28 Sep 11:16:54.993 # +try-failover master redis51 192.168.4.51 6379
- 25371:X 28 Sep 11:16:54.994 # +vote-for-leader be035801d4d48eb63d8420a72796f52fc5cec047 3
- ...
- 25371:X 28 Sep 11:16:55.287 * +slave slave 192.168.4.51:6379 192.168.4.51 6379 @ redis51 192.168.4.52 6379
- 25371:X 28 Sep 11:17:25.316 # +sdown slave 192.168.4.51:6379 192.168.4.51 6379 @ redis51 192.168.4.52 6379
6)配置帶驗證的主從複製
關閉4.51和4.52,啓動以後用info replication查看,各自爲主
主庫設置密碼,在51上面操做
- [root@redisA ~]# redis-cli -h 192.168.4.51 shutdown
- [root@redisA ~]# vim /etc/redis/6379.conf
- requirepass 123456
- [root@redisA ~]# /etc/init.d/redis_6379 start
- Starting Redis server...
- [root@redisA ~]# redis-cli -h 192.168.4.51 -a 123456
- 192.168.4.51:6379> ping
- PONG
- 192.168.4.51:6379>
7)配置從庫主機
- [root@redisB ~]# redis-cli -h 192.168.4.52 shutdown
- [root@redisB ~]# vim /etc/redis/6352.conf
- slaveof 192.168.4.51 6379
- masterauth 123456
- [root@redisB ~]# /etc/init.d/redis_6352 start
- Starting Redis server...
52上面查看 52從主庫變爲從庫
- [root@redisB ~]# redis-cli -h 192.168.4.52 -a 123456
- 192.168.4.52:6379> info replication
- # Replication
- role:slave
- master_host:192.168.4.51
- master_port:6379
- master_link_status:up
51上面查看 51的從庫爲52
- [root@redisA ~]# redis-cli -h 192.168.4.51 -a 123456
- 192.168.4.51:6379> info replication
- # Replication
- role:master
- connected_slaves:1
- slave0:ip=192.168.4.52,port=6379,state=online,offset=98,lag=0
2 案例2 :使用RDB文件恢復數據
2.1 問題
- 要求以下:
- 啓用RDB
- 設置存盤間隔爲120秒 10個key改變存盤
- 備份RDB文件
- 刪除數據
- 使用RDB文件恢復數據
2.2 步驟
實現此案例須要按照以下步驟進行。
步驟一:使用RDB文件恢復數據
RDB介紹:
Redis數據庫文件,全稱Reids DataBase
數據持久化方式之一
在指定時間間隔內,將內存中的數據集快照寫入硬盤
術語叫Snapshot快照
恢復時,將快照文件直接讀到內存裏
相關配置參數
文件名
dbfilename 「dump.rdb」 文件名
save 「」 禁用RDB
數據從內存保存到硬盤的頻率
save 900 1 900秒內且有1次修改
save 300 10 300秒內且有10次修改
save 60 10000 60秒內且有10000修改
- [root@redisA ~]# redis-cli -h 192.168.4.51 -a 123456 shutdown
- [root@redisA ~]# vim /etc/redis/6379.conf
- dbfilename dump.rdb
- # save ""
- save 120 10
- save 300 10
- save 60 10000
- [root@redisA ~]# /etc/init.d/redis_6379 start
- Starting Redis server...
- [root@redisA ~]# redis-cli -h 192.168.4.51 -a 123456
- 192.168.4.51:6379>
- [root@redisA ~]# redis-cli -h 192.168.4.51 -a 123456
- 192.168.4.51:6379>
- 192.168.4.51:6379> set v1 k1
- OK
- 192.168.4.51:6379> set v2 k1
- OK
- 192.168.4.51:6379> set v3 k1
- OK
- 192.168.4.51:6379> set v4 k1
- OK
- 192.168.4.51:6379> set v45 k1
- OK
- 192.168.4.51:6379> set v46 k1
- OK
- 192.168.4.51:6379> set v7 k1
- OK
- 192.168.4.51:6379> set v8 k1
- OK
- 192.168.4.51:6379> set v9 k1
- OK
- 192.168.4.51:6379> set v10 k1
- OK
- 192.168.4.51:6379> keys *
- 1) "v2"
- 2) "v9"
- 3) "v10"
- 4) "v45"
- 5) "v4"
- 6) "v1"
- 7) "v46"
- 8) "v8"
- 9) "v7"
- 10) "v3"
- 192.168.4.51:6379>exit
備份數據
- [root@redisA 6379]# redis-cli -h 192.168.4.51 -a 123456 shutdown
- [root@redisA ~]# cd /var/lib/redis/6379/
- [root@redisA 6379]# ls
- dump.rdb nodes-6351.conf
- [root@redisA 6379]# cp dump.rdb dump.rdb.bak
刪除數據
- [root@redisA 6379]# rm -rf dump.rdb
- [root@redisA 6379]# /etc/init.d/redis_6379 start
- Starting Redis server...
- [root@redisA 6379]# ls
- dump.rdb dump.rdb.bak nodes-6351.conf
- [root@redisA 6379]# redis-cli -h 192.168.4.51 -a 123456
- 192.168.4.51:6379> keys *
- (empty list or set)
- 192.168.4.51:6379>
恢復數據
- [root@redisA 6379]# redis-cli -h 192.168.4.51 -a 123456 shutdown
- [root@redisA 6379]# mv dump.rdb.bak dump.rdb
- mv: overwrite ‘dump.rdb’? y
- [root@redisA 6379]# /etc/init.d/redis_6379 start
- Starting Redis server...
- [root@redisA 6379]# redis-cli -h 192.168.4.51 -a 123456
- 192.168.4.51:6379> keys *
- 1) "v7"
- 2) "v46"
- 3) "v45"
- 4) "v8"
- 5) "v4"
- 6) "v2"
- 7) "v1"
- 8) "v3"
- 9) "v9"
- 10) "v10"
- 192.168.4.51:6379>
RDB優勢:
高性能的持久化實現:建立一個子進程來執行持久化,先將數據寫入臨時文件,持久化過程結束後,再用這個臨時文件替換上次持久化好的文件;過程當中主進程不作任何IO操做
比較適合大規模數據恢復,且對數據完整性要求不是很是高的場合
RDB的缺點:
意外宕機時,最後一次持久化的數據會丟失
3 案例3 :使用AOF文件恢復數據
3.1 問題
- 要求以下:
- 啓用AOF
- 備份AOF文件
- 刪除數據
- 使用AOF文件恢復數據
3.2 步驟
實現此案例須要按照以下步驟進行。
步驟一:使用AOF文件恢復數據
1)AOF介紹
只作追加操做的文件,Append Only File
記錄redis服務全部寫操做
不斷的將新的寫操做,追加到文件的末尾
使用cat命令能夠查看文件內容
2)參數配置
文件名
appendfilename "appendonly.aof" 指定文件名
appendonly yes 啓用aof ,默認no
AOF文件記錄寫操做的方式
appendfsync always 有新寫操做當即記錄
appendfsync everysec 每秒記錄一次
appendfsync no 從不記錄
- [root@redisA 6379]# redis-cli -h 192.168.4.51 -a 123456 shutdown
- [root@redisA 6379]# rm -rf dump.rdb
- [root@redisA 6379]# vim /etc/redis/6379.conf
- appendonly yes
- appendfilename "appendonly.aof"
- appendfsync everysec
- [root@redisA 6379]# vim /etc/redis/6379.conf
- [root@redisA 6379]# /etc/init.d/redis_6379 start
- Starting Redis server...
- [root@redisA 6379]# ls
- appendonly.aof dump.rdb nodes-6351.conf
- [root@redisA 6379]# cat appendonly.aof
- [root@redisA 6379]# redis-cli -h 192.168.4.51 -a 123456
- 192.168.4.51:6379> set v1 a1
- OK
- 192.168.4.51:6379> set v2 a2
- OK
- 192.168.4.51:6379> set v3 a3
- OK
- 192.168.4.51:6379> set v4 a4
- OK
- 192.168.4.51:6379> set v5 a5
- OK
- 192.168.4.51:6379> set v6 a6
- OK
- 192.168.4.51:6379> set v7 a7
- OK
- 192.168.4.51:6379> set v8 a7
- OK
- 192.168.4.51:6379> set v9 a9
- OK
- 192.168.4.51:6379> set v10 a10
- OK
- 192.168.4.51:6379> keys *
- 1) "v2"
- 2) "v5"
- 3) "v10"
- 4) "v9"
- 5) "v6"
- 6) "v8"
- 7) "v3"
- 8) "v7"
- 9) "v1"
- 10) "v4"
- 192.168.4.51:6379> exit
- [root@redisA 6379]# cat appendonly.aof
3)使用AOF恢復數據
備份數據
- [root@redisA 6379]# cp appendonly.aof appendonly.aof.bak
- [root@redisA 6379]# redis-cli -h 192.168.4.51 -a 123456 shutdown
刪除數據
- [root@redisA 6379]# rm -rf appendonly.aof
- [root@redisA 6379]# /etc/init.d/redis_6379 start
- Starting Redis server...
- [root@redisA 6379]# redis-cli -h 192.168.4.51 -a 123456
- 192.168.4.51:6379> keys *
- (empty list or set)
- 192.168.4.51:6379> exit
恢復數據
- [root@redisA 6379]# mv appendonly.aof.bak appendonly.aof
- mv: overwrite ‘appendonly.aof’? y
- [root@redisA 6379]# redis-cli -h 192.168.4.51 -a 123456 shutdown
- [root@redisA 6379]# /etc/init.d/redis_6379 start
- Starting Redis server...
- [root@redisA 6379]# redis-cli -h 192.168.4.51 -a 123456
- 192.168.4.51:6379> keys *
- 1) "v9"
- 2) "v5"
- 3) "v8"
- 4) "v2"
- 5) "v1"
- 6) "v4"
- 7) "v10"
- 8) "v6"
- 9) "v7"
- 10) "v3"
- 192.168.4.51:6379>
修復AOF文件,把文件恢復到最後一次的正確操做
- [root@redisA 6379]# vim appendonly.aof
- *2
- $6
- SELECT
- $1
- 0
- *3
- $3
- set
- $2
- v1
- $2
- a1
- *3
- $3
- ...
- [root@redisA 6379]# redis-check-aof --fix appendonly.aof
- 0x 0: Expected prefix '*', got: '$'
- AOF analyzed: size=311, ok_up_to=0, diff=311
- This will shrink the AOF from 311 bytes, with 311 bytes, to 0 bytes
- Continue? [y/N]: y
- Successfully truncated AOF
RDB優勢:
能夠靈活的設置同步持久化appendfsync always或異步持久化appendfsync verysec
宕機時,僅可能丟失1秒的數據
RDB的缺點:
AOF文件的體積一般會大於RDB文件的體積
執行fsync策略時的速度可能會比RDB慢
4 案例4:Redis數據庫經常使用操做
4.1 問題
- 對Redis數據庫各數據類型進行增刪改查操做
- 數據類型分別爲strings、hash表、list列表
- 設置數據緩存時間
- 清空全部數據
- 對數據庫操做
4.2 步驟
實現此案例須要按照以下步驟進行。
步驟一:redis數據類型
1)String字符串
set key value [ex seconds] [px milliseconds] [nx|xx]
設置key及值,過時時間可使用秒或毫秒爲單位
setrange key offset value
從偏移量開始複寫key的特定位的值
- [root@redisA 6379]# redis-cli -h 192.168.4.51 -a 123456
- 192.168.4.51:6379> set first "hello world"
- OK
- 192.168.4.51:6379> setrange first 6 "Redis"
- (integer) 11
- 192.168.4.51:6379> get first
- "hello Redis"
strlen key,統計字串長度
- 192.168.4.51:6379> strlen first
- (integer) 11
append key value 存在則追加,不存在則建立key及value,返回key長度
- 192.168.4.51:6379> append myname jacob
- (integer) 5
setbit key offset value 對key所存儲字串,設置或清除特定偏移量上的位(bit),value值能夠爲1或0,offset爲0~2^32之間,key不存在,則建立新key
- 192.168.4.51:6379> setbit bit 0 1
- (integer) 0
- 192.168.4.51:6379> setbit bit 1 0
- (integer) 0
bitcount key 統計字串中被設置爲1的比特位數量
- 192.168.4.51:6379> setbit bits 0 1
- (integer) 0
- 192.168.4.51:6379> setbit bits 3 1
- (integer) 0
- 192.168.4.51:6379> bitcount bits
- (integer) 2
記錄網站用戶上線頻率,如用戶A上線了多少天等相似的數據,如用戶在某天上線,則使用setbit,以用戶名爲key,將網站上線日爲offset,並在該offset上設置1,最後計算用戶總上線次數時,使用bitcount用戶名便可,這樣即便網站運行10年,每一個用戶僅佔用10*365比特位即456字節
- 192.168.4.51:6379> setbit peter 100 1
- (integer) 0
- 192.168.4.51:6379> setbit peter 105 1
- (integer) 0
- 192.168.4.51:6379> bitcount peter
- (integer) 2
decr key 將key中的值減1,key不存在則先初始化爲0,再減1
- 192.168.4.51:6379> set z 10
- OK
- 192.168.4.51:6379> decr z
- (integer) 9
- 192.168.4.51:6379> decr z
- (integer) 8
- 192.168.4.51:6379> decr bb
- (integer) -1
- 192.168.4.51:6379> decr bb
- (integer) -2
decrby key decrement 將key中的值,減去decrement
- 192.168.4.51:6379> set count 100
- OK
- 192.168.4.51:6379> DECRBY cc 20
- (integer) -20
- 192.168.4.51:6379> DECRBY cc 20
- (integer) -40
get key 返回key存儲的字符串值,若key不存在則返回nil,若key的值不是字串,則返回錯誤,get只能處理字串
- 192.168.4.51:6379> get a
- (nil)
getrange key start end 返回字串值中的子字串,截取範圍爲start和end,負數偏移量表示從末尾開始計數,-1表示最後一個字符,-2表示倒數第二個字符
- 192.168.4.51:6379> set x 123456789
- OK
- 192.168.4.51:6379> getrange x -5 -1
- "56789"
- 192.168.4.51:6379> getrange x 0 4
- "12345"
incr key 將key的值加1,若是key不存在,則初始爲0後再加1,主要應用爲計數器
- 192.168.4.51:6379> set page 20
- OK
- 192.168.4.51:6379> incr page
- (integer) 21
incrby key increment 將key的值增長increment
- 192.168.4.51:6379> set x 10
- OK
- 192.168.4.51:6379> incr x
- (integer) 11
- 192.168.4.51:6379> incr x
- (integer) 12
incrbyfloat key increment 爲key中所儲存的值加上浮點數增量 increment
- 192.168.4.51:6379> set num 16.1
- OK
- 192.168.4.51:6379> incrbyfloat num 1.1
- "17.2"
mset key value [key value …] 設置多個key及值,空格分隔,具備原子性
- 192.168.4.51:6379> mset j 9 k 29
- OK
mget key [key…] 獲取一個或多個key的值,空格分隔,具備原子性
- 192.168.4.51:6379> mget j k
- 1) "9"
- 2) "29"
2)list列表
Redis的list是一個字符隊列,先進後出,一個key能夠有多個值
lpush key value [value…] 將一個或多個值value插入到列表key的表頭,Key不存在,則建立key
- 192.168.4.51:6379> lpush list a b c
- (integer) 3
lrange key start stop 從開始位置讀取key的值到stop結束
- 192.168.4.51:6379> lrange list 0 2
- 1) "c"
- 2) "b"
- 3) "a"
- 192.168.4.51:6379> lrange list 0 -1
- 1) "c"
- 2) "b"
- 3) "a"
- 192.168.4.51:6379> lrange list 0 -2
- 1) "c"
- 2) "b"
lpop key 移除並返回列表頭元素數據,key不存在則返回nil
- 192.168.4.51:6379> lpop list
- "c"
- 192.168.4.51:6379> LPOP list
- "b"
llen key 返回列表key的長度
- 192.168.4.51:6379> llen list
- (integer) 1
lindex key index 返回列表中第index個值
- 192.168.4.51:6379> lindex list 1
- "c"
lset key index value 將key中index位置的值修改成value
- 192.168.4.51:6379> lpush list a b c d
- (integer) 5
- 192.168.4.51:6379> lset list 3 test
- OK
rpush key value [value…] 將value插入到key的末尾
- 192.168.4.51:6379> rpush list3 a b c
- (integer) 3
- 192.168.4.51:6379> rpush list3 d
- (integer) 4
rpop key 刪除並返回key末尾的值
- 192.168.4.51:6379> RPOP list3
- "d"
3)hash表
hset key field value 將hash表中field值設置爲value
- 192.168.4.51:6379> hset site google 'www.g.cn'
- (integer) 1
- 192.168.4.51:6379> hset site baidu 'www.baidu.com'
- (integer) 1
hget key filed 獲取hash表中field的值
- 192.168.4.51:6379> hget site google
- "www.g.cn"
hmset key field value [field value…] 同時給hash表中的多個field賦值
- 192.168.4.51:6379> hmset site google www.g.cn baidu www.baidu.com
- OK
hmget key field [field…] 返回hash表中多個field的值
- 192.168.4.51:6379> hmget site google baidu
- 1) "www.g.cn"
- 2) "www.baidu.com"
hkeys key 返回hash表中全部field名稱
- 192.168.4.51:6379> hmset site google www.g.cn baidu www.baidu.com
- OK
- 192.168.4.51:6379> hkeys site
- 1) "google"
- 2) "baidu"
hgetall key 返回hash表中全部key名和對應的值列表
- 192.168.4.51:6379> hgetall site
- 1) "google"
- 2) "www.g.cn"
- 3) "baidu"
- 4) "www.baidu.com"
hvals key 返回hash表中全部key的值
- 192.168.4.51:6379> hvals site
- 1) "www.g.cn"
- 2) "www.baidu.com"
hdel key field [field…] 刪除hash表中多個field的值,不存在則忽略
- 192.168.4.51:6379> hdel site google baidu
- (integer) 2