Redis初探08——Redis的高級實用特性

一、安全性
設置客戶端連接後進行任何其他指定前需要使用的密碼。
警告:因爲redis速度相當快,所以一臺比較好的服務器,一個外部用戶可以在一秒鐘進行15萬次的密碼嘗試,這意味着你需要指定非常非常強大的密碼來防止暴力破解。
這裏寫圖片描述
1、設置redis密碼:
在etc下的redis.conf文件中找到requirepass(vi命令下的搜索關鍵字:按下/後輸入關鍵字)
在requirepass後跟設置的密碼:
這裏寫圖片描述
保存後重啓redis服務。
這裏寫圖片描述

雖然進入客戶端不需要密碼,但是如果不使用auth輸入密碼授權,則無法進行操作。
命令:auth zhaojw
也可以在進入客戶端的時候輸入密碼,則進入後就不需要auth進行授權就可以操作。
命令: ./redis-cli -a zhaojw
這裏寫圖片描述

二、主從複製
Redis的主從複製配置和使用都很簡單,通過主從複製可以允許多個slave server(從服務器)擁有和master server(主服務器)想同的數據庫複本。
Redis主從複製的特點:
1、Master可以擁有多個slave。
2、多個slave可以連接同一個master外,還可以連接其他的slave。當主機擋掉以後,某一個slave會立即變爲主機。
3、主從複製不會阻塞master,在同步數據時,master可以繼續處理client的請求。
4、提高系統的伸縮性。

Redis主從複製的過程:
1、slave與master建立連接,發送sync同步命令
2、Master會啓動一個後臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存。
3、後臺完成保存後,就將此文件發送給slave。
4、slave將文件保存到硬盤上。

配置主從服務器(/etc/redis.conf文件中):
1、配置slave服務器:
在slave的配置文件中加入以下配置:
slaveof 主機master的ip 主機master的端口
masterauth 主機密碼
這裏寫圖片描述
可用info命令查看當前服務器的角色role是主還是從,以及連接信息。

三、事務處理
1、Redis對事物的支持目前還比較簡單。Redis只能保證一個client發起的事物中的命令可以連續的之行,而不會插入其他client的命令。
當一個client在一個連接中發出multi命令時,這個連接會進入一個事物上下文,該鏈接後續的命令不會立即執行,而是放入一個隊列中,當執行exec命令時,redis會順序的執行隊列中的所有命令。

127.0.0.1:6379[1]> set name zhaojw
OK
127.0.0.1:6379[1]> get name
"zhaojw"
127.0.0.1:6379[1]> multi
OK
127.0.0.1:6379[1]> set name zhaojw1
QUEUED
127.0.0.1:6379[1]> set name zhaojw2
QUEUED
127.0.0.1:6379[1]> set age 26
QUEUED
127.0.0.1:6379[1]> exec
1) OK
2) OK
3) OK
127.0.0.1:6379[1]> get name
"zhaojw2"
127.0.0.1:6379[1]> get age
"26"

discard:取消事物,清空事物的命令隊列並退出事物上下文,也就是常說的事物回滾。

127.0.0.1:6379[1]> get name
"zhaojw2"
127.0.0.1:6379[1]> multi
OK
127.0.0.1:6379[1]> set name zhaojw
QUEUED
127.0.0.1:6379[1]> set name zhaojw1
QUEUED
127.0.0.1:6379[1]> discard
OK
127.0.0.1:6379[1]> get name
"zhaojw2"

2、redis中的事物的命令隊列中的某一條命令執行錯誤時,不會回滾,也就是數其餘沒有錯誤的命令依然之行,只是錯誤的命令沒有執行。

3、樂觀鎖複雜事物控制
樂觀鎖:大多數是基於數據版本(version)的記錄機制實現的。即爲數據增加一個版本標識,在基於數據庫表的版本解決方案中,一般是通過爲數據庫表裏添加一個“version”字段來實現讀取數據時,將此版本號一同讀出,之後更新時,對此版本號加1。此時,將提交的數據的版本號與數據庫表對應記錄的當前版本號進行比對,如果提交的數據版本號大於數據庫的當前版本號,則予以更新,否則認爲是過期數據。
watch命令會監視給定的key,當exec時候如果監視的key從調用watch後發生過變化,則整個事物會失敗。也可以調用watch多次監視多個key,這樣就可以對指定的key加樂觀鎖了。注意watch的key是對整個連接有效的,事物也一樣。如果連接斷開,監視與事物都會被自動清除。當然,exec,discard,unwatch命令都會清除連接中的所有監視。

四、持久化機制
Redis是一個支持持久化的內存數據庫,也就是說Redis需要經常將內存中的數據同步到硬盤來保證持久化。
Redis支持兩種持久化方式:
1、snapshotting(快照)默認方式:
這中方式是將內存中數據以快照的方式寫入二進制文件中,默認的文件名爲dump.rdb(二進制文件無法查看)。可以通過配置設置自動做快照持久化的方式。我們可以配置redis在n秒內如果超過m個key被修改就自動做成快照。
如:save 900 1 #900秒內超過1個key被修改,則發起快照保存。
save 300 10 #300秒內超過10個key被修改,則發起快照保存。
這裏寫圖片描述
2、Append-only file(縮寫:aof)的方式:
由於快照方式是在一定間隔時間做一次,所以如果redis意外down掉的話,就會丟失最後一次快照後的所有修改。
aof比快照方式有更好的持久化性,是由於在使用aof時,redis會將每一個收到的寫命令通過write函數追加到文件中,當redis重啓時會通過重新之行文件中保存的寫命令來在內存中重建整個數據庫的內容。
當然由於os(ObjectStream)會在內核中緩存write做的修改,所以可能不是立即寫到磁盤上,這樣aof方式的持久化也還是有可能丟失部分修改。可以通過配置文件告訴redis我們想要通過fsync函數強制os寫入到磁盤的時機。
配置aof:
appendonly yes #啓用aof持久化方式
這裏寫圖片描述

appendfsync always:收到寫命令就立即寫入磁盤,最慢,但是保證完全的持久化
appendfsync everysec :每秒寫入磁盤一次,在性能和持久化方面做了很好的折中。
appendfsync no :完全依賴os,性能最好,但是持久化沒保證。
這裏寫圖片描述

五、發佈訂閱消息
發佈與訂閱(pub/sub)是一種信息通信模式,主要的目的是解除消息發佈這與消息訂閱者之間的耦合,Redis作爲一個pub/sub的server,在訂閱者和發佈者之間起到了一個消息路由的功能。訂閱者可以通過subscribe和psubcribe命令向redis server訂閱自己感興趣的消息類型,redis將消息類型成爲通道(channel)。當發佈這通過publish命令向redis server發送特定類型的信息時,訂閱該信息類型的全部client都會收到此消息。
比如:第一個客戶端:subscribe tv1
第二個客戶端訂閱tv1和tv2:subscribe tv1 tv2
第三個客戶端在tv1上發佈消息:psubcribe tv1 zhaojw。返回監聽tv1的客戶端個數。
那麼第一個和第二個客戶端都顯示了zhaojw這條信息。
若第三個客戶端在tv2上發佈消息,那麼只有第二個客戶端才能收到這條消息。

六、虛擬內存的使用
Redis的虛擬內存與操作系統的虛擬內存不是一回事,但是思路和目的都是相同的。就是暫時把不經常訪問的數據從內存交換到磁盤中,從而騰出寶貴的內存空間用於其他需要訪問的數據。尤其是對於redis這樣的內存數據庫,內存總是不夠用的。除了可以將數據分隔到多個redis server外。另外能夠提高數據庫容量的辦法就是使用虛擬內存把那些不經常訪問的數據交換寫到磁盤上。
vm-enabled:是否開啓虛擬內存支持
vm-swap-file /tmp/redis.swap:#交換出來的value保存的文件路徑
vm-max-memory 10000000:設置redis使用的最大物理內存大小
vm-page-size 32:設置虛擬內存的頁大小,即每個頁面大小是32個字節
vm-pages 134413131:設置交換文件總的page數量,最多使用多少頁面
vm-max-threads:設置VMIO同時使用的線程數量,用於執行value對象換入緩存的工作線程數量

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