Redis高級實用特性html
四、持久化機制redis
Redis是一個支持持久化的內存數據庫,也就是說Redis須要常常將內存中的數據同步到硬盤來保證持久化。
Redis支持兩種持久化方式:
(1)、snapshotting(快照) 也是默認方式。
快照是默認的持久化方式,這種方式是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。能夠經過配置設置自動作快照持久化的方式。咱們能夠配置redis在n秒內若是超過m個key的修改就自動作快照。數據庫
修改配置文件redis.conf:
save 900 1 #900秒內若是超過1個key被修改,則發起快照保存。ubuntu
(2)、Append-only file(縮寫aof)的方式。緩存
因爲快照方式是在必定間隔時間作一次的,因此若是redis意外down掉的話,就會丟失最後一次快照後的全部修改。 aof比快照方式有更好的持久化性,是因爲在使用aof時,redis會將每一個收到的寫命令都經過write函數追加到文件中,當redis重啓時會經過從新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。 固然因爲OS會在內核中緩存write作的修改,因此可能不是當即寫到磁盤上,這樣aof方式的持久化也仍是有可能丟失部分修改。能夠經過配置文件告訴redis咱們想要經過fsync函數強制OS寫入到磁盤的時機。app
appendonly yes //啓用aof持久化方式 函數
#appendfsync always //收到寫命令就當即寫入磁盤,最慢,可是保證徹底的持久化 性能
appendfsync everysec //每秒鐘寫入磁盤一次,在性能和持久化方面作了很好的折中 ui
#appendfsync no //徹底依賴OS,性能最好,持久化沒保證spa
修改配置文件redis.conf, 再在redis客戶端進行寫入操做,能夠看到redis所在的bin目錄下存在兩個文件,appendonly.aof存的是操做命令,dump.rdb存的是二進制數據。
root@ubuntu:/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* |
五、發佈訂閱消息
發佈訂閱(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兩個頻道:
anny@ubuntu:/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頻道:
anny@ubuntu:/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
在第三個終端中輸入以下命令,經過發佈消息:
root@ubuntu:/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 ...]] 指退訂給定的頻道。 |
六、虛擬內存的使用
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