標籤:
Redis進階實用特性
4、持久化機制
Redis是一個支援持久化的記憶體資料庫,也就是說Redis需要經常將記憶體中的資料同步到硬碟來保證持久化。
Redis支援兩種持久化方式:
(1)、snapshotting(快照) 也是預設。
快照是預設的持久化方式,這種方式是將記憶體中資料以快照的方式寫入到二進位檔案中,預設的檔案名稱為dump.rdb。可以通過配置設定自動做快照持久化的方式。我們可以配置redis在n秒內如果超過m個key的修改就自動做快照。
修改設定檔redis.conf:
save 900 1 #900秒內如果超過1個key被修改,則發起快照儲存。
(2)、Append-only file(縮寫aof)的方式。
由於快照方式是在一定間隔時間做一次的,所以如果redis意外down掉的話,就會丟失最後一次快照後的所有修改。 aof比快照方式有更好的持久化性,是由於在使用aof時,redis會將每個收到的寫命令都通過write函數追加到檔案中,當redis重啟時會通過重新執行檔案中儲存的寫命令來在記憶體中重建整個資料庫的內容。 當然由於OS會在核心中緩衝write做的修改,所以可能不是立即寫到磁碟上,這樣aof方式的持久化也還是有可能丟失部分修改。可以通過設定檔告訴redis我們想要通過fsync函數強制OS寫入到磁碟的時機。
appendonly yes //啟用aof持久化方式
#appendfsync always //收到寫命令就立即寫入磁碟,最慢,但是保證完全的持久化
appendfsync everysec //每秒鐘寫入磁碟一次,在效能和持久化方面做了很好的折中
#appendfsync no //完全依賴OS,效能最好,持久化沒保證
修改設定檔redis.conf, 再在redis用戶端進行寫入操作,可以看到redis所在的bin目錄下存在兩個檔案,appendonly.aof存的是操作命令,dump.rdb存的是位元據。
[email protected]:/usr/local/redis/bin# ll total 12720 drwxr-xr-x 2 root root 4096 2015-06-18 01:25 ./ drwxr-xr-x 4 root root 4096 2015-06-18 01:21 ../ -rw-r--r-- 1 root root 56 2015-06-18 01:26 appendonly.aof -rw-r--r-- 1 root root 180 2015-06-15 02:25 dump.rdb -rwxr-xr-x 1 anny anny 566 2015-06-04 02:35 mkreleasehdr.sh* -rwxr-xr-x 1 anny anny 3759902 2015-06-14 20:09 redis-benchmark* -rwxr-xr-x 1 anny anny 20295 2015-06-14 20:09 redis-check-aof* -rwxr-xr-x 1 anny anny 40868 2015-06-14 20:09 redis-check-dump* -rwxr-xr-x 1 anny anny 3853871 2015-06-14 20:09 redis-cli* -rwxr-xr-x 1 anny anny 5325229 2015-06-14 20:09 redis-server* |
5、發布訂閱訊息
發布訂閱(pub/sub)是一種訊息通訊模式,主要的目的是解除訊息發行者和訊息訂閱者之間的耦合,Redis作為一個pub/sub的server,在訂閱者和發行者之間起到了訊息路由的功能。訂閱者可以通過subscribe和psubscribe命令向Redis Server訂閱自己感興趣的訊息類型,redis將資訊類型稱為通道(channel)。當發行者通過publish命令向redis server發送特定類型的資訊時,訂閱該資訊類型的全部client都會收到此訊息。
Redis 發布訂閱(pub/sub)是一種訊息通訊模式:寄件者(pub)發送訊息,訂閱者(sub)接收訊息。
Redis 用戶端可以訂閱任意數量的頻道。
展示了頻道 channel1 , 以及訂閱這個頻道的三個用戶端 —— client2 、 client5 和 client1 之間的關係:
當有新訊息通過 PUBLISH 命令發送給頻道 channel1 時, 這個訊息就會被發送給訂閱它的三個用戶端:
Redis中發布/訂閱實驗:
開啟三個終端,
在第一個終端中輸入如下命令,通過subscribe訂閱了tv1和tv2兩個頻道:
[email protected]:/usr/local/redis/bin$ ./redis-cli -a anny
127.0.0.1:6379> subscribe tv1 tv2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "tv1"
3) (integer) 1
1) "subscribe"
2) "tv2"
3) (integer) 2
在第二個終端中輸入如下命令,通過subscribe 訂閱了tv1頻道:
[email protected]:/usr/local/redis/bin$ ./redis-cli -a anny
127.0.0.1:6379> subscribe tv1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "tv1"
3) (integer) 1
在第三個終端中輸入如下命令,通過發布訊息:
[email protected]:/usr/local/redis/bin# ./redis-cli -a anny
127.0.0.1:6379> publish tv1 test
(integer) 2
127.0.0.1:6379> publish tv2 abc
(integer) 1
可以看到第一個終端和第二個終端同時接收到第三個終端發布的訊息:
第一個終端收到訊息如下:
1) "message"
2) "tv1"
3) "test"
1) "message"
2) "tv2"
3) "abc"
第二個終端收到訊息如下:
1) "message"
2) "tv1"
3) "test"
下表列出了 redis 發布訂閱常用命令:
| 序號 |
命令及描述 |
| 1 |
PSUBSCRIBE pattern [pattern ...] 訂閱一個或多個符合給定模式的頻道。 |
| 2 |
PUBSUB subcommand [argument [argument ...]] 查看訂閱與發布系統狀態。 |
| 3 |
PUBLISH channel message 將資訊發送到指定的頻道。 |
| 4 |
PUNSUBSCRIBE [pattern [pattern ...]] 退訂所有給定模式的頻道。 |
| 5 |
SUBSCRIBE channel [channel ...] 訂閱給定的一個或多個頻道的資訊。 |
| 6 |
UNSUBSCRIBE [channel [channel ...]] 指退訂給定的頻道。 |
6、虛擬記憶體的使用
redis的虛擬記憶體與作業系統的虛擬記憶體不是一回事,但是思路和目的都是相同的。就是暫時把不經常訪問的資料從記憶體交換到磁碟中,從而騰出寶貴的記憶體空間用於其他需要訪問的資料。尤其是對於redis這樣的記憶體資料庫,記憶體總是不夠用的。除了可以將資料分割到多個redis server外,另外能夠提高資料庫容量的辦法就是使用虛擬記憶體把那些不經常訪問的資料交換到磁碟上。
下面關於VM相關的配置項(redis.conf):
vm-enabled yes #開啟vm功能
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對象換入緩衝的背景工作執行緒數量
修改設定檔redis.conf後,殺掉redis-server進程,重啟redis-server。
會提示在redis.conf檔案中增加一個配置項 really-use-vm yes
註:我目前實驗的Redis 3.0.2版本不存關於虛擬記憶體的配置項,手工加入後,啟動Redis-server會報錯。
W3C School Redis基礎教程: http://www.w3cschool.cc/redis/redis-backup.html
Redis學習第八課:Redis進階實用特性(二)