Redis高級應用
一、Redis事務及樂觀鎖
(一)事務
-
Redis支持簡單的事務
-
Redis與mysql事務的對比
Mysql Redis 開啓 start transaction muitl 語句 普通sql 普通命令 失敗 rollback 回滾 discard 取消 成功 commit exec -
在mutil後面的語句中, 語句出錯可能有2種情況
- 語法就有問題,exec時,報錯, 所有語句得不到執行
- 語法本身沒錯,但適用對象有問題。比如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