Redis數據庫(二)--高級應用(事務,消息訂閱,持久化,主從複製)

Redis高級應用

一、Redis事務及樂觀鎖

(一)事務

在這裏插入圖片描述

  1. Redis支持簡單的事務

  2. Redis與mysql事務的對比

    Mysql Redis
    開啓 start transaction muitl
    語句 普通sql 普通命令
    失敗 rollback 回滾 discard 取消
    成功 commit exec
  3. 在mutil後面的語句中, 語句出錯可能有2種情況

    1. 語法就有問題,exec時,報錯, 所有語句得不到執行
    2. 語法本身沒錯,但適用對象有問題。比如zadd操作list對象,exec之後,會執行正確的語句,並跳過有不適當的語句。

例:張三李四搶票

在這裏插入圖片描述
這樣張三就扣了錢,但沒買到票。

(二)樂觀鎖

Redis的事務中,啓用的是樂觀鎖,只負責監測指定key有沒有被改動,若被改動了,則事務取消。
在這裏插入圖片描述

具體的命令---- watch命令

例:張三李四搶票

在這裏插入圖片描述

二、消息訂閱

Redis 發佈訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。

Redis 客戶端可以訂閱任意數量的頻道。

頻道 channel1,以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關係:

在這裏插入圖片描述

當有新消息通過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被髮送給訂閱它的三個客戶端。
在這裏插入圖片描述

方法

訂閱端

subscribe 頻道名稱

發佈端

publish 頻道名稱 發佈內容

客戶端
redis 127.0.0.1:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "message"
2) "news"
3) "good good study"
1) "message"
2) "news"
3) "day day up"

服務端
redis 127.0.0.1:6379> publish news 'good good study'
(integer) 1
redis 127.0.0.1:6379> publish news 'day day up'
(integer) 1

三、Redis持久化配置

持久化:將內容中的數據保存到硬盤上

序列化:將對象保存到硬盤上

反序列化:將硬盤上的對象讀出來

(一)RDB快照

RDB快照的配置選項(這3個選項都屏蔽,則rdb禁用)

  • save 900 1 // 900內,有1條寫入,則產生快照
  • save 300 1000 // 如果300秒內有1000次寫入,則產生快照
  • save 60 10000 // 如果60秒內有10000次寫入,則產生快照

和持久化相關的redis配置

  • stop-writes-on-bgsave-error yes // 後臺備份進程出錯時,主進程停不停止寫入?
  • rdbcompression yes // 導出的rdb文件是否壓縮
  • Rdbchecksum yes // 導入rbd恢復時數據時,要不要檢驗rdb的完整性
  • dbfilename dump.rdb //導出來的rdb文件名
  • dir ./ //rdb的放置路徑

(二)AOF日誌

Aof 的配置

  • appendonly no # 是否打開 aof日誌功能

  • appendfsync always # 每1個命令,都立即同步到aof. 安全,速度慢

  • appendfsync everysec # 折衷方案,每秒寫1次

  • appendfsync no # 寫入工作交給操作系統,由操作系統判斷緩衝區大小,統一寫入到 aof. 同步頻率低,速度快。

  • no-appendfsync-on-rewrite yes: # 正在導出rdb快照的過程中,要不要停止同步aof

  • auto-aof-rewrite-percentage 100 #aof文件大小比起上次重寫時的大小,增長率100%時,重寫

  • auto-aof-rewrite-min-size 64mb #aof文件,至少超過64M時,重寫
    在這裏插入圖片描述

(三)兩種持久化機制的比較

RDB持久化 AOF持久化
全量備份,一次保存整個數據庫 增量備份,一次保存一個修改數據庫的命令
保存的間隔較長 保存的間隔默認一秒
數據還原速度快 數據還原速度一般
save會阻塞,但bgsave或者自動不會阻塞 無論是平時還是AOF重寫,都不會阻塞
更適合數據備份,默認開啓 更適合用來保存數據,和一般SQL持久化方式一樣,默認關閉
啓動優先級 : 低 啓動優先級 : 高
體積 : 小 體積 : 大
恢復速度 : 快 恢復速度 : 慢
數據安全性 : 丟數據 數據安全性 : 根據策略決定
輕重 : 重 輕重: 輕

(四)相關問題

1.在dump rdb過程中,aof如果停止同步,會不會丟失

答: 不會,所有的操作緩存在內存的隊列裏, dump完成後,統一操作。
在這裏插入圖片描述

2.aof重寫是指什麼

答: aof重寫是指把內存中的數據,逆化成命令,寫入到.aof日誌裏。以解決 aof日誌過大的問題。
在這裏插入圖片描述

3.如果rdb文件和aof文件都存在,優先用誰來恢復數據

答: 在這種情況下,當redis重啓的時候會優先載入AOF文件來恢復原始的數據,因爲在通常情況下AOF文件保存的數據集要比RDB文件完整。

4.兩種是否可以同時用

答: 可以,而且推薦這麼做。

5.恢復時rdb和aof哪個恢復的快

答: rdb快,因爲其是數據的內存映射,直接載入到內存,而aof是命令,需要逐條執行。

四、Redis主從複製(集羣)

步驟

在這裏插入圖片描述

配置

主服務器

  • rdb禁用

    #save 900 1
    #save 300 10
    #save 60 1000
    
  • aof打開

    appendonly yes 
    

從服務器

  • 設置端口

    port 6380 
    
  • 有一臺啓用rdb

  • 兩臺都禁用aof

  • 設置slave-of

    slaveof localhost 6379 
    

啓動服務

redis-server redis.windows.conf
redis-server redis.windows6380.conf
redis-server redis.windows6381.conf

在這裏插入圖片描述

啓動客戶端

redis-cli 
redis-cli -p 6380
redis-cli -p 6381

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章