Redis 的高級應用
Redis 的高級應用,包括:安全性設置,主從複製,事務處理,持久化機制,虛擬內存的使用。
安全性
涉及到客戶端連接是需要指定密碼的(由於 redis 速度相當的快,一秒鐘可以 150K 次的密碼嘗試,所以需要設置一個強度很大的密碼)。
設置密碼的兩種方式:
- config set requirepass [password] :設置密碼。
- 在redis.conf文件中設置requirepass屬性。
兩種輸入認證的方式:
- 登錄時使用:redis-cli -a password。
- 登錄後可以用:auth password。
guc@guc:/redis-4.0.9$ redis-cli -a 654321
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "654321"
127.0.0.1:6379> quit
guc@guc:/redis-4.0.9$ redis-cli
127.0.0.1:6379> config get requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 654321
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "654321"
127.0.0.1:6379>
主從複製
爲了分擔服務器壓力,會在特定情況下部署多臺服務器分別用於緩存的讀和寫操作,用於寫操作的服務器稱爲主服務器,用於讀操作的服務器稱爲從服務器。
從服務器通過 psync 操作同步主服務器的寫操作,並按照一定的時間間隔更新主服務器上新寫入的內容。
Redis 主從複製的過程:
- Slave與Master建立連接,發送psync同步命令。
- Master啓動一個後臺進程,將數據庫快照保存到文件中,同時Master主進程會開始收集新的寫命令並緩存。
- 後臺完成保存後,將此文件發送給Slave。
- Slave將此文件保存到磁盤上。
Redis主從複製的特點:
-
可以擁有多個Slave。
-
多個Slave可以連接同一個Master外,還可以連接到其他的Slave。(當 Master 宕機後,相連的 Slave 轉變爲 Master)。
-
主從複製不會阻塞Master,在同步數據時,Master可以繼續處理Client請求。(非阻塞式的同步只能應用於對讀數據延遲接受度較高的場景)
-
提高系統的可伸縮性。
主服務器設置了連接密碼:
config set masterauth <password>
要建立這樣一個主從關係的緩存服務器,只需要在 Slave 端執行命令:
SLAVEOF IPADDRESS:PORT
> SLAVEOF 127.0.0.1:6379
說明:可通過 info replication 查看主從請求信息。
事務處理
Redis 的事務處理比較簡單。只能保證 client 發起的事務中的命令可以連續的執行,而且不會插入其它的 client 命令,當一個 client 在連接中發出 multi 命令時,這個連接就進入一個事務的上下文,該連接後續的命令不會執行,而是存放到一個隊列中,當執行 exec 命令時,redis 會順序的執行隊列中的所有命令。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set hi helloworld
QUEUED
127.0.0.1:6379> set hi nihaoa
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
注:redis 對於事務的處理方式比較特殊,它不會在事務過程中出錯時恢復到之前的狀態,這在實際應用中導致我們不能依賴 redis 的事務來保證數據一致性。
持久化機制
內存中的數據會在重啓之後消失,持久化的作用就是要將這些數據長久存到磁盤中以支持長久使用。
Redis 是一個支持持久化的內存數據庫,Redis 需要經常將內存中的數據同步到磁盤來保證持久化。
Redis支持持久化的兩種方式:
- snapshotting(快照):將數據存放到文件裏,默認方式。是將內存中的數據以快照的方式寫入到二進制文件中,默認文件 dump.rdb,可以通過配置設置自動做快照持久化的方式。可配置 Redis 在 n 秒內如果超過 m 個 key 被修改就自動保存快照。比如: save 900 1:900 秒內如果超過 1 個 key 被修改,則發起快照保存。 save 300 10:300 秒內如果超過 10 個 key 被修改,則快照保存。
- Append-only file(縮寫爲 aof):將讀寫操作存放到文件中。
注:由於快照方式在一定間隔時間做一次,所以如果 Redis 意外 down 掉的話,就會丟失最後一次快照後的所有修改。
aof 比快照方式有更好的持久化性,是由於使用 aof 時,redis 會將每一個收到的寫命令都通過 write 函數寫入到文件中,當 redis 啓動時會通過重新執行文件中保存的寫命令來在內存中重新建立整個數據庫的內容。
由於 os 會在內核中緩存 write 做的修改,所以可能不是立即寫到磁盤上,這樣 aof 方式的持久化也還是有可能會丟失一部分數據。可以通過配置文件告訴 redis 我們想要通過 fsync 函數強制 os 寫入到磁盤的時機。
###配置文件中可配置參數:
- appendonly yes //啓用aof持久化方式
- appendfsync always //收到寫命令就立即寫入磁盤,慢,但保證了數據的完整性
- appendfsync everysec //每秒寫入磁盤一次,在性能和持久化方面做了很好的折中
- appendfsync no //完全依賴os,性能最好,持久化沒有保證。
save 命令將數據寫入磁盤中
127.0.0.1:6379> save
OK