Redis學習第八課:Redis高級實用特性(一)

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"

相關文章
相關標籤/搜索