Redis高級實用特性html
注:我學習的環境是vmware7.1 + ubantu10.10+ redis 3.0.2redis
一、安全性 數據庫
設置客戶端鏈接後進行任何其餘指定前須要的密碼。由於redis速度至關快,一個外部用戶能夠在一秒鐘進行不少次的密碼嘗試,這就須要設定很是強大的密碼來防止暴力破解。 能夠在Redis的配置文件中找到以下項: # requirepass foobared requirepass annyubuntu
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
OKui
或者在啓動Redis客戶端時,設置密碼,命令以下:spa
root@ubuntu:/usr/local/redis# ./bin/redis-cli -a anny
二、主從複製
Redis主從複製配置和使用都要很是簡單。經過主從複製能夠容許多個slave server擁有和master server相同的數據庫副本。
Redis主從複製的特色:
一、Master能夠擁有多個slave。
二、多個slave能夠鏈接同一個master外,還能夠鏈接到其它的slave。
三、主從複製不會阻塞master, 在同步數據時,master能夠繼續處理client請求。
四、提升系統的伸縮性。
注意:Redis的主從複製,不只僅是master與slave相鏈接,也能夠slave與slave相鏈接,當master宕機時,另外一個主要的slave立馬轉換角色,變成master。
Redis主從複製過程:
一、Slave與master創建鏈接,發送sync同步命令。
二、master會啓動一個後臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存。
三、後臺完在保存後,就將此文件發送給slave。
四、slave將此文件保存到硬盤上。
配置主從服務器:
只須要修改slave的配置文件中加入如下配置:
slaveof 192.168.32.216 6379 #指定master的ip和端口
masterauth anny #這是主機的密碼
主從服務器實驗操做:
一、首先將本臺虛擬機重命名爲Redis_master,經過下面命令關機。
root@ubuntu:/usr/local/redis#init 0
二、經過vmware,在Redis_master虛擬機名稱上點右鍵,點擊「Clone」命令,一路點「下一步」,直到完成。將新克隆的虛擬機重命名爲Redis_slave。
三、分別啓動虛擬機redis_master和redis_slave。
四、切換到虛擬機redis_slave,修改IP。修改/usr/local/redis/etc/redis.conf文件,修改如下內容:
slaveof 192.168.32.216 6379
masterauth anny
五、分別啓動兩臺機器的redis-server.
六、咱們在虛擬機redis_master的 redis客戶端寫入數據,數據會自動同步到虛擬機redis_slave上。
七、如何判斷誰是主誰是從,能夠經過info命令查看role內容。
三、事務處理
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"