天天看點

Redis初探08——Redis的進階實用特性

一、安全性

設定用戶端連接配接後進行任何其他指定前需要使用的密碼。

警告:因為redis速度相當快,是以一台比較好的伺服器,一個外部使用者可以在一秒鐘進行15萬次的密碼嘗試,這意味着你需要指定非常非常強大的密碼來防止暴力破解。

Redis初探08——Redis的進階實用特性

1、設定redis密碼:

在etc下的redis.conf檔案中找到requirepass(vi指令下的搜尋關鍵字:按下/後輸入關鍵字)

在requirepass後跟設定的密碼:

Redis初探08——Redis的進階實用特性

儲存後重新開機redis服務。

Redis初探08——Redis的進階實用特性

雖然進入用戶端不需要密碼,但是如果不使用auth輸入密碼授權,則無法進行操作。

指令:auth zhaojw

也可以在進入用戶端的時候輸入密碼,則進入後就不需要auth進行授權就可以操作。

指令: ./redis-cli -a zhaojw

Redis初探08——Redis的進階實用特性

二、主從複制

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 主機密碼

Redis初探08——Redis的進階實用特性

可用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被修改,則發起快照儲存。

Redis初探08——Redis的進階實用特性

2、Append-only file(縮寫:aof)的方式:

由于快照方式是在一定間隔時間做一次,是以如果redis意外down掉的話,就會丢失最後一次快照後的所有修改。

aof比快照方式有更好的持久化性,是由于在使用aof時,redis會将每一個收到的寫指令通過write函數追加到檔案中,當redis重新開機時會通過重新之行檔案中儲存的寫指令來在記憶體中重建整個資料庫的内容。

當然由于os(ObjectStream)會在核心中緩存write做的修改,是以可能不是立即寫到磁盤上,這樣aof方式的持久化也還是有可能丢失部分修改。可以通過配置檔案告訴redis我們想要通過fsync函數強制os寫入到磁盤的時機。

配置aof:

appendonly yes #啟用aof持久化方式

Redis初探08——Redis的進階實用特性

appendfsync always:收到寫指令就立即寫入磁盤,最慢,但是保證完全的持久化

appendfsync everysec :每秒寫入磁盤一次,在性能和持久化方面做了很好的折中。

appendfsync no :完全依賴os,性能最好,但是持久化沒保證。

Redis初探08——Redis的進階實用特性

五、釋出訂閱消息

釋出與訂閱(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對象換入緩存的工作線程數量

繼續閱讀