Redis高級實用特性
注:我學習的環境是vmware7.1 + ubantu10.10+ redis 3.0.2
1、安全性
設置客戶端連接后進行任何其他指定前需要的密碼。因為redis速度相當快,一個外部用戶可以在一秒鐘進行很多次的密碼嘗試,這就需要設定非常強大的密碼來防止暴力破解。 可以在Redis的配置文件中找到如下項: # requirepass foobared requirepass anny
root@ubuntu:/usr/local/redis# ps -e
root@ubuntu:/usr/local/redis# kill -9 2039
root@ubuntu:/usr/local/redis# netstat -tunpl | grep 6379
root@ubuntu:/usr/local/redis# ./bin/redis-server ./etc/redis.conf?
root@ubuntu:/usr/local/redis# ./bin/redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379>
為Redis設置密碼后,再啟動Redis客戶端,命令就無法執行。
對Redis客戶端進行授權,通過以下命令:
127.0.0.1:6379> auth anny
OK
或者在啟動Redis客戶端時,設置密碼,命令如下:
root@ubuntu:/usr/local/redis# ./bin/redis-cli -a anny
2、主從復制
Redis主從復制配置和使用都要非常簡單。通過主從復制可以允許多個slave server擁有和master server相同的數據庫副本。
Redis主從復制的特點:
1、Master可以擁有多個slave。
2、多個slave可以連接同一個master外,還可以連接到其它的slave。
3、主從復制不會阻塞master, 在同步數據時,master可以繼續處理client請求。
4、提高系統的伸縮性。
注意:Redis的主從復制,不僅僅是master與slave相連接,也可以slave與slave相連接,當master宕機時,另一個主要的slave立馬轉換角色,變成master。
?
Redis主從復制過程:
1、Slave與master建立連接,發送sync同步命令。
2、master會啟動一個后臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令并緩存。
3、后臺完在保存后,就將此文件發送給slave。
4、slave將此文件保存到硬盤上。
配置主從服務器:
只需要修改slave的配置文件中加入以下配置:
slaveof 192.168.32.216 6379 #指定master的ip和端口
masterauth anny #這是主機的密碼
主從服務器實驗操作:
1、首先將本臺虛擬機重命名為Redis_master,通過下面命令關機。
root@ubuntu:/usr/local/redis#init 0
2、通過vmware,在Redis_master虛擬機名稱上點右鍵,點擊“Clone”命令,一路點“下一步”,直到完成。將新克隆的虛擬機重命名為Redis_slave。
3、分別啟動虛擬機redis_master和redis_slave。
4、切換到虛擬機redis_slave,修改IP。修改/usr/local/redis/etc/redis.conf文件,修改以下內容: ????
slaveof 192.168.32.216 6379 ????
masterauth anny
5、分別啟動兩臺機器的redis-server.
6、我們在虛擬機redis_master的 redis客戶端寫入數據,數據會自動同步到虛擬機redis_slave上。
7、如何判斷誰是主誰是從,可以通過info命令查看role內容。
3、事務處理
Redis 事務可以一次執行多個命令, 并且帶有以下兩個重要的保證:
- 事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。
- 事務是一個原子操作:事務中的命令要么全部被執行,要么全部都不執行。
一個事務從開始到執行會經歷以下三個階段:
- 開始事務。
- 命令入隊。
- 執行事務。
Redis對事務的支持目前還比較簡單。Redis只能保證一個client發起的事務中命令可以連續的執行,而中間不會插入其他client的命令。當一個client在一個連接中發出multi命令時,這個連接會進入一個事務上下文,該連接后續的命令不會立即執行,而是先放到一個隊列中,當執行exec命令時,redis會順序的執行隊列中的所有命令。
Redis 事務命令
下表列出了 redis 事務的相關命令:
?
序號 | 命令及描述 |
---|---|
1 | DISCARD?取消事務,放棄執行事務塊內的所有命令。 |
2 | EXEC?執行所有事務塊內的命令。 |
3 | MULTI?標記一個事務塊的開始。 |
4 | UNWATCH?取消 WATCH 命令對所有 key 的監視。 |
5 | WATCH key [key ...]?監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。 |
?
multi:將任務命令放入隊列
exec:順序執行本事務上下文隊列中的任務命令。
127.0.0.1:6379> get age
"20"
127.0.0.1:6379>?multi
OK
127.0.0.1:6379> set age 10
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379>?exec
1) OK
2) OK
127.0.0.1:6379> get age
"20"
discard:清空事務的命令隊列并退出事務上下文,即我們常說的事務回滾。
當執行了multi命令后,如果想取消事務處理,可以使用discard命令。
127.0.0.1:6379>?multi
OK
127.0.0.1:6379> set age 30
QUEUED
127.0.0.1:6379> set age 40
QUEUED
127.0.0.1:6379>?discard
OK
127.0.0.1:6379> get age
"20"
強調:在Redis的事務上下文中,當其中某一個命令執行失敗時,不會影響到其他命令的執行。這一點跟我們理解中的事務不一樣,發生錯誤,不會回滾。
看下面例子,在整個事務中,第一條命令執行成功,而第二條命令執行失敗,但事務沒有回滾。
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> get name
"test"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> incr name
QUEUED
127.0.0.1:6379> exec
1) (integer) 21
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379> get age
"21"
樂觀鎖:
大多數是基于數據版本(version)的記錄機制實現的。即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表增加一個“version”字段來實現讀出數據時,將此版本號一同讀出,之后更新時,對此版本號加1。此時,將提交數據的版本號與數據庫表對應記錄的當前版本號時行比對,如果提交的數據版本號大于數據庫當前版本號,則予以更新,否則認為是過期數據。
watch命令會監視給定的key,當exec的時候如果監視的key從調用watch后發生過變化,則整個事務會失敗。也可以調用watch命令多次監視多個key,這樣就可以對指定的key加樂觀鎖。注意watch的key是對整個連接有效的,事務也一樣。如果連接斷開,監視和事務都會被自動清除。當然exec、discard、unwatch命令都會清除連接中的所有監視。
Redis樂觀鎖實例:
在第一個終端中,通過watch命令監控名稱為“age“的key:
127.0.0.1:6379> get age
"21"
127.0.0.1:6379>?watch age
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 18
QUEUED
然后我在第二個終端中,對key為“age“進行賦值。
127.0.0.1:6379> set age 25
OK
然后我又回到第一個終端進行后續命令,這時執行事務返回nil,表示事務執行不成功。
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get age
"25"
?