天天看點

Redis進階應用

Redis進階實用特性分6部分:

1、安全性

設定用戶端連接配接後進行任何其他操作時,需要使用密碼

修改redis.conf配置檔案,requirepass password指令就是用來設定密碼的

修改完配置檔案後要重新開機redis服務

重新開機後,發現在指令行執行操作時,會有以下提示。此時需要用auth password 來授權

1

2

3

4

5

6

<code>127.0.0.1:6379&gt; keys *</code>

<code>(error) NOAUTH Authentication required.</code>

<code>127.0.0.1:6379&gt; auth redis123</code>

<code>OK</code>

<code>(empty list or </code><code>set</code><code>)</code>

如果不希望在指令行輸入密碼來完成授權,則可以在登入用戶端時,輸入密碼

<code>[root@localhost init.d]</code><code># /usr/local/redis/bin/redis-cli -a redis123</code>

2、主從複制

Redis主從複制配置和使用非常簡單。通過主從複制可以允許多個slave server擁有和master server相同的資料庫副本

主從複制的工作原理:

1、slave與master建立連接配接後,發送sync同步指令

2、master會啟動一個背景程序,将資料庫快照儲存到檔案中,同時master主程序會開始收集新的寫指令并緩存

3、背景完成儲存後,将此檔案發送給slave

4、slave将此檔案儲存到硬碟上

主從複制的特點:

a、Master可以擁有多個slave

b、多個slave可以連接配接同一個master外,還可以連接配接到其他slave(這個特性是為了防止master出現故障後,slave無法進行同步,如果slave還連接配接了其他slave,那麼master挂掉後,這個slave就會變成master,接管服務)

c、主從複制不會阻塞master,在同步資料時,master可以繼續處理client請求

d、提高系統的伸縮性

主從複制的配置:

在slava的配置檔案中加入以下配置:

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

masterauth PASSWORD  # 這是master的密碼

注意:主從配置的注意事項:

master、slave的配置檔案中bind 127.0.0.1 這條配置改成eth0網卡的ip位址,否則redis的端口預設監聽在127.0.0.1上。這樣slave 到master的端口不通。

更改bind 的IP位址後,進入用戶端時使用指令:

<code>$redis_home</code><code>/bin/redis-cli</code> <code>-h 172.16.206.140</code>

即使用-h參數指定eth0網卡的IP位址,預設是127.0.0.1 

3、事務處理

Redis對事務的處理目前還比較簡單,Redis隻能保證一個client發起的事物中的指令可以連續的執行,而中間不會插入其他client的指令。當一個client在一個連接配接中發出multi指令時,這個連接配接會進入一個事務上下文,該連接配接後續的指令不會立即執行,而是先放到一個隊列中,當執行exec指令時,redis會順序的執行隊列中的指令

例如:

7

8

9

10

11

12

13

14

15

16

17

18

19

<code>172.16.206.142:6379&gt; </code><code>set</code> <code>age 27</code>

<code>172.16.206.142:6379&gt; </code>

<code>172.16.206.142:6379&gt; get age</code>

<code>"27"</code>

<code>172.16.206.142:6379&gt; multi</code>

<code>172.16.206.142:6379&gt; </code><code>set</code> <code>age 37</code>

<code>QUEUED</code>

<code>172.16.206.142:6379&gt; </code><code>set</code> <code>age 47\</code>

<code>172.16.206.142:6379&gt; </code><code>set</code> <code>age 47</code>

<code>172.16.206.142:6379&gt; </code><code>exec</code>

<code>1) OK</code>

<code>2) OK</code>

<code>3) OK</code>

<code>"47"</code>

discard:取消一個事務

<code>172.16.206.142:6379&gt; </code><code>set</code> <code>age 100</code>

<code>172.16.206.142:6379&gt; </code><code>set</code> <code>age 200</code>

<code>172.16.206.142:6379&gt; discard</code>

事務復原:

Redis不支援事務復原,當隊列中有兩個事務,一個完成了另外一個沒有完成,那麼沒有完成的那個事務不會影響整個事務。

<code>172.16.206.142:6379&gt; </code><code>set</code> <code>name zeng</code>

<code>172.16.206.142:6379&gt; incr age</code>

<code>172.16.206.142:6379&gt; incr name</code>

<code>1) (integer) 48</code>

<code>2) (error) ERR value is not an integer or out of range</code>

<code>172.16.206.142:6379&gt; get name</code>

<code>"zeng"</code>

<code>"48"</code>

樂觀鎖:

watch指令會監視給定的key,當exec時候如果監視的key從調用watch後發生過變化,則整個事務會失敗。也可以調用watch多次監視多個key,這樣就可以對指定的key加樂觀鎖了。

4、持久化機制

Redis是一個支援持久化的記憶體資料庫,也就是說redis需要經常将記憶體中的資料同步到硬碟來保證持久化。Redis支援兩種持久化方式:

1、snapshotting(快照)也是預設方式

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

Snapshotting方式:

快照是預設的持久化方式,這種方式是将記憶體中資料以快照的方式寫入到二進制檔案中,預設的檔案名為dump.rdb.可以通過配置設定自動做持久化的方式。我們可以配置redis在n秒内如果超過m個key被修改就自動做快照

save 900 1  #900秒内如果超過1個key被修改,則發起快照儲存

save 300 10  #300秒内如果超過10個key被修改,則發起快照儲存

save 60 10000

aof方式:

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

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

appendonly yes //啟用aof持久化方式

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

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

#appendfsync no //完全依賴os,性能最好,持久化沒有保證

5、釋出訂閱消息

釋出訂閱(pub/sub)是一種消息通信模式,主要的目的是解除消息釋出者和消息訂閱者之間的耦合,Redis作為一個pub/sub的server,在訂閱者和釋出者之間起到了消息路由的功能。訂閱者可以通過subscribe和psubscribe指令向redis server訂閱自己感興趣的消息類型,redis将資訊類型稱為通道(channel)。當釋出者通過publish指令向redis server發送特定類型的資訊時,訂閱該資訊類型的全部client都會收到此消息

測試:

Redis server開三個會話視窗,并進入redis用戶端指令行

終端一訂閱tv1、tv2兩個頻道

<code>&gt; subscribe tv1 tv2</code>

<code>Reading messages... (press Ctrl-C to quit)</code>

<code>1) </code><code>"subscribe"</code>

<code>2) </code><code>"tv1"</code>

<code>3) (integer) 1</code>

<code>2) </code><code>"tv2"</code>

<code>3) (integer) 2</code>

終端二訂閱tv2頻道

<code>&gt; subscribe tv1</code>

終端三向tv1頻道釋出消息hello

<code>&gt;publish tv1 hello</code>

<code>(integer) 2</code>

結果:

終端一、二都收到消息:

<code>1) </code><code>"message"</code>

<code>3) </code><code>"hello"</code>

6、虛拟記憶體的使用

Redis的虛拟記憶體與作業系統的虛拟記憶體不是一回事,但是思路和目的都是相同的。就是暫時把不經常通路的資料從記憶體交換到磁盤中,進而騰出寶貴的記憶體空間用于其他需要通路的資料。尤其是對于redis這樣的記憶體資料庫,記憶體總是不夠用的。除了可以将資料分割到多個redis server外。另外能夠提高資料庫容量的辦法就是使用虛拟記憶體把那些不經常通路的資料交換到磁盤上。

配置如下:

vm-enabled yes              #開啟vm功能

really-use-vm yes            #确定使用虛拟記憶體,這條配置需要手動添加    

vm-swap-file  /tmp/redis.swap   #交換出來的value儲存的檔案路徑

vm-max-memory 1000000         #redis使用的最大記憶體上線

vm-page-size 32             #每個頁面的大小32位元組

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

vm-max-threads 4            #用于執行value對象換入的工作線程數量

本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1854178,如需轉載請自行聯系原作者