Redis學習筆記五:redis的高級實用特性講解

1、Redis高級實用特性

1.安全性

        設置客戶端鏈接後進行任何其餘指定前須要使用的密碼。redis

        警告:由於redis速度至關快,因此在一臺比較好的服務器下,一個外部的用戶能夠在一秒鐘進行150K次的密碼嘗試,這意味着你須要指定很是強大的密碼來防止暴力破解。數據庫

[root@localhost ~]# vi /usr/local/redis/etc/redis.conf 

 

        修改配置文件中的以下配置項緩存

1.  #requirepass foobared  
2.  requirepass beijing

        咱們設置了鏈接的口令是beijing。安全

        重啓redis服務bash

1.  [root@localhost ~]# pkill redis-server  
2.  [root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf  
3.  [root@localhost ~]# /usr/local/redis/bin/redis-cli  
4.  redis 127.0.0.1:6379> keys *  
5.  (error) ERR operation not permitted  
6.  redis 127.0.0.1:6379> auth beijing  
7.  OK  
8.  redis 127.0.0.1:6379> keys *  
9.  1) "name"  
10. redis 127.0.0.1:6379> exit  
11.   
12. [root@localhost ~]# /usr/local/redis/bin/redis-cli -a beijing  
13. redis 127.0.0.1:6379> keys *  
14. 1) "name" 

 

2.主從複製

        Redis主從複製配置和使用都很是簡單。經過主從複製能夠容許多個slave server擁有和master server相同的數據庫副本。服務器

1).Redis主從複製特色:session

        a.Master能夠擁有多個slaveapp

        b.多個slave能夠鏈接同一個master外,還能夠鏈接到其它slave函數

        c.主從複製不會阻塞master,在同步數據時,master能夠繼續處理client請求性能

        d.提升系統的伸縮性

2).Redis主從複製過程:

        a.Slave與Master創建鏈接,發送sync同步命令

        b.Master會啓動一個後臺進程,將數據庫快照保存到文件中,同時Master主進程會開始收集新的寫命令並緩存

        c.後臺完成保存後,就將此文件發送給slave

        d.Slave將此文件保存到硬盤上

3).配置主從服務器

        配置slave服務器很簡單,只須要在slave的配置文件中加入如下配置:

1.  slaveof 192.168.1.1 6379 #指定master的ip和端口   

2.  masterauth beijing #這是主機的密碼  

1.  [root@localhost ~]# vi /usr/local/redis/etc/redis.conf  
2.  //修改其中的slaveof <maserip> <masterport>、masterauth <master-password>  
3.  [root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf  
4.  [root@localhost ~]# /usr/local/redis/bin/redis-cli -a beijing  
5.  redis 127.0.0.1:6379> keys *  
6.  (empty list or set)  

        配置好後,在Master設置任何key,在Slaver數據庫中也會有,表示主從複製成功。

        如咱們在主數據庫上設置一對鍵值對

1.  redis 127.0.0.1:6379> set name master  
2.  OK  
3.  redis 127.0.0.1:6379>  

        在從數據庫上取這個鍵

1.  redis 127.0.0.1:6379> get name  
2.  "master"  
3.  redis 127.0.0.1:6379>  

        咱們怎麼判斷哪一個是主哪一個是從呢?咱們只需調用info就能夠獲得主從信息,咱們在從庫中執行info以下:

1.  redis 127.0.0.1:6379> info  
2.  role:slave  
3.  master_host:localhost  
4.  master_port:6379  
5.  master_link_status:up  
6.  master_last_io_seconds_ago:10  
7.  master_sync_in_progress:0  
8.  db0:key=1,expires=0  
9.  redis 127.0.0.1:6379> 

        裏面的role會顯示是Master仍是Slave服務器,master_link_status的值是up表示正在鏈接Master服務器

 

3.事務處理

        Redis對事務的支持目前不比較簡單。Redis只能保證一個client發起的事務中的命令能夠連續的執行,而中間不會插入其餘client的命令。當一個client在一個鏈接中發出multi命令時,這個鏈接會進入一個事務上下文,該鏈接後續的命令不會當即執行,而是先放到一個隊列中,當執行exec命令時,redis會順序的執行隊列中的全部命令。

1.  redis 127.0.0.1:6379> get age  
2.  "33"  
3.  redis 127.0.0.1:6379> multi  
4.  OK  
5.  redis 127.0.0.1:6379> set age 10  
6.  QUEUED  
7.  redis 127.0.0.1:6379> set age 20  
8.  QUEUED  
9.  redis 127.0.0.1:6379> exec  
10. 1) OK  
11. 2) OK  
12. redis 127.0.0.1:6379> get age  
13. "20" 

        如何取消一個事務?

1.  redis 127.0.0.1:6379> get age  
2.  "20"  
3.  redis 127.0.0.1:6379> multi  
4.  OK  
5.  redis 127.0.0.1:6379> set age 30  
6.  QUEUED  
7.  redis 127.0.0.1:6379> set age 40  
8.  QUEUED  
9.  redis 127.0.0.1:6379> discard  
10. OK  
11. redis 127.0.0.1:6379> get age  
12. "20"

        能夠發現此次2個set age命令都沒被執行。discard命令其實就是清空事務的命令隊列並退出事務上下文,也就是咱們常說的事務回滾。

        以下例子能夠看到,age因爲是個數字,那麼它能夠有自增運算,可是name是個字符串,沒法對其進行自增運算,因此會報錯,若是按傳統關係型數據庫的思路來說,整個事務都會回滾,可是咱們看到redis倒是將能夠執行的命令提交了,因此這個現象對於習慣於關係型數據庫操做的朋友來講是很彆扭的,這一點也是redis今天須要改進的地方。

1.  redis 127.0.0.1:6379> incr name  
2.  (error) ERR value is not an integer or out of range  
3.  redis 127.0.0.1:6379> multi  
4.  OK  
5.  redis 127.0.0.1:6379> incr age  
6.  QUEUED  
7.  redis 127.0.0.1:6379> incr name  
8.  QUEUED  
9.  redis 127.0.0.1:6379> exec  
10. 1) (integer) 21  
11. 2) (error) ERR value is not an integer or out of range  
12. redis 127.0.0.1:6379> get age  
13. "21"  

        樂觀鎖復瑣事務控制:

        樂觀鎖:大多數是基於數據版本( version)的記錄機制實現的。即爲數據增長一個版本標識,在基於數據庫表的版本解決方案中,通常是經過爲數據表添加一個"version"實段來實現讀取出數據時,將此版本號一同讀出,以後更新時,對此版本號加1。此時,將提交數據的版本號與數據庫表對應記錄的當前版本號進行比對,若是提交的數據版本號大於數據庫當前版本號,則予以更新,不然認爲是過時數據。

        Redis樂觀鎖實例:假設有一個age的key,咱們開2個session來對age進行賦值操做,咱們來看一下結果如何。

        1)第1步 session1

1.  redis 127.0.0.1:6379> get age  
2.  "10"  
3.  redis 127.0.0.1:6379> watch age  
4.  OK  
5.  redis 127.0.0.1:6379> multi  
6.  OK

        2)第2步 session2

1.  redis 127.0.0.1:6379> set age 30  
2.  OK  
3.  redis 127.0.0.1:6379> get age  
4.  "30" 

        3)第3步 session1

1.  redis 127.0.0.1:6379> set age 30  
2.  QUEUED  
3.  redis 127.0.0.1:6379> exec  
4.  (nil)  //由於有wathch age  
5.  redis 127.0.0.1:6379> get age  
6.  "30" 

 

        watch命令監視給定的key,當exec時候若是監視的key從調用watch後發生過變化,則整個事務會失敗。也能夠調用watch屢次監視多個key。這樣就能夠對指定的key加樂觀鎖了。注意watch的key是對整個鏈接有效的,事務也同樣。若是鏈接斷開,監視和事務都會被自動清除。固然,exec、discard、unwatch命令都會清除鏈接中的全部監視。

        事務回滾:redis的事務實現是如此簡單,固然會存在一些問題。第一個問題是redis只能保證事務的每一個命令連續執行,可是若是事務中的一個命令失敗了,並不回滾其餘命令,好比使用的命令類型不匹配。

 

4.持久化機制

        Redis是一個支持持久化的內存數據庫,也就是說redis須要常常將內存中的數據同步到硬盤來保證持久化。

        Redis支持兩種持久化方式:

        a.snapshotting(快照)也是默認方式

        b.Append-only file(縮寫aof)的方式

        1).Snapshotting方式

        快照是默認的持久化方式。這種方式是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。能夠經過配置設置自動作快照持久化的方式。咱們能夠配置redis在n秒內若是超過m個key被修改就自動作快照。

1.  save 900 1    #900秒內若是超過1個key被修改,則發起快照保存  

2.  save 300 10   #300秒內,如超過10個key被修改,則發起快照保存  

        2).aof方式

        因爲快照方式是在必定間隔時間作一次的,因此若是redis意外down掉的話,就會丟失最後一次快照後的全部修改。

        aof比快照方式有更好的持久化性,是因爲在使用aof時,redis會將每個收到的寫命令都經過write函數追加到文件中,當redis重啓時會經過從新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。

        固然因爲os會在內核中緩存write作的修改,因此可能不是當即寫到磁盤上。這樣aof方式的持久化也仍是有可能會丟失部分修改。

        能夠經過配置文件告訴redis咱們想要經過fsync函數強制os寫入到磁盤的時機,默認的文件名爲appendonly.aof[可經過cat方法看,保存的是命令]。

        vi /usr/local/redis/etc/redis.conf

1.  appendonly yes //啓動aof持久化方式  

2.  #appendfsync always  //收到寫命令就當即寫入磁盤,最慢,可是保證徹底的持久化  

3.  appendfsync everysec //每秒種寫入磁盤一次,在性能和持久化方面作了很好的折中  

4.  #appendfsync no //徹底依賴os,性能最好,持久化沒保證  

 

5.發佈訂閱消息

        發佈訂閱(pub/sub)是一種消息通訊模式,主要的目的是解除消息發佈者和消息訂閱者之間的耦合,Redis做爲一個pub/sub的server,在訂閱者和發佈者之間起到了消息路由的功能。訂閱者能夠經過subscribe和psubscribe命令向redis server訂閱本身感興趣的消息類型,redis將信息類型稱爲通道(channel)。當發佈者經過publish命令向redis server發送特定類型的信息時,訂閱該信息類型的所有client都會收到此消息。

        1)第1步 session1

1.  redis 127.0.0.1:6379> subscribe tv1 tv2  
2.  Reading message... (press Ctrl+C to quit)  
3.  1) "subscribe"  
4.  2) "tv1"  
5.  3) (integer) 1  
6.  1) "subscribe"  
7.  2) "tv2"  
8.  3) (integer) 2 

        2)第2步 session2

1.  redis 127.0.0.1:6379> subscribe tv1  
2.  Reading message... (press Ctrl+C to quit)  
3.  1) "subscribe"  
4.  2) "tv1"  
5.  3) (integer) 1 

        3)第3步 session3

1.  redis 127.0.0.1:6379> publish tv1 test  
2.  (integer) 2  //說明有兩個監聽  
3.  redis 127.0.0.1:6379> publish tv2 haha  
4.  (integer) 1  //說明只有一個監聽  
5.  redis 127.0.0.1:6379>  

        4)第4步 session1

1.  1) "message"  
2.  2) "tv1"  
3.  3) "test"  
4.  1) "message"  
5.  2) "tv2"  
6.  3) "haha"

        第4步 session2

1.  1) "message"  
2.  2) "tv1"  
3.  3) "test"  

 

6.虛擬內存的使用

        Redis的虛擬內存與操做系統的虛擬內存不是一回事,可是思路和目的都是相同的。就是暫時把不常常訪問的數據從內存交換到磁盤中,從而騰出寶貴的內存空間用於其餘須要訪問的數據。尤爲是對於redis這樣的內存數據庫,內存老是不夠用的。除了能夠將數據分割到多個redis server外,另外可以提升數據庫容量的辦法就是使用虛擬內存把那些不常常訪問的數據交換到磁盤上。

        查了一下官方文檔,發現虛擬內存其實一直是不建議使用的。在redis2.4版本之後,乾脆就直接去掉了虛擬內存的支持,緣由是虛擬內存可使Redis在內存不夠的狀況下仍然能夠將全部數據序列保存在內存裏,這個過程很影響性能,會慢近10倍以上。感謝@賣紅薯的提示。因此你們若想繼續使用虛擬內存,則最低版本只能是redis2.4了。

        下面是vm相關配置:

         vi  /usr/local/redis/etc/redis.conf

1.  vm-enabled yes                  #開啓vm功能  

2.  vm-swap-file /tmp/redis.swap    #交換出來的value保存的文件路徑  

3.  vm-max-memory 1000000           #redis使用的最大內存上限  

4.  vm-page-size 32                 #每一個頁面的大小32字節  

5.  vm-pages 134217728              #最多使用多少頁面  

6.  vm-max-threads 4                #用於執行value對象換入的工做線程數量  

        並設置以下配置,肯定要使用虛擬內存

1.  really-use-vm yes  

相關文章
相關標籤/搜索