Redis的進階應用程式-交易處理、持久化、發布與訂閱訊息、虛擬記憶體使用,redis交易處理
三、交易處理
Redis的交易處理比較簡單。只能保證client發起的事務中的命令可以連續的執行,而且不會插入其他的client命令,當一個client在串連中發出multi命令時,這個串連就進入一個事務的上下文,該串連後續的命令不會執行,而是存放到一個隊列中,當執行exec命令時,redis會順序的執行隊列中的所有命令。如果其中執行出現錯去,執行正確的不會復原,次不同於關係型資料庫的事務。
復原後age的值已經改變。
取消一個事務用discard,取消事務隊列,資料全部復原。
Redis樂觀鎖:使用watch監視指定的key,當exec時如果監視的key從調用watch後發生過變化,這整個事務會失敗。可調用watch多次監視多個key。watch和事務對整個串連有效,如果斷開了串連監視和事務都會清除(exec,discard,unwatch也不例外)。
四、持久化機制
Redis是一個支援持久化的記憶體資料庫,Redis需要經常將記憶體中的資料同步到磁碟來保證持久化。
Redis支援兩種持久化方式:
1、snapshotting(快照),將資料存放到檔案裡,預設。
是將記憶體中的資料已快照的方式寫入到二進位檔案中,預設檔案dump.rdb,可以通過配置設定自動做快照持久化的方式。可配置Redis在n秒內如果超過m
個key被修改就自動儲存快照。
save 900 1 #900秒內如果超過1個key被修改,者發起快照儲存
save 300 10 #300秒內如果超過10個key被修改,這快照儲存
save 60 10000 #60秒內如果超過10000個資料被修改,發起快照儲存
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,效能最好,持久化沒有保證
開啟以後,在bin檔案夾中會多兩個隱藏檔,如下:
五、發布與訂閱資訊
發布訂閱(pub/sub)是一種訊息通訊模式,主要的目的是解除訊息發行者和訂閱者之間的耦合,Redis作為一個pub/sub的server,在訂閱者和發行者之間起到訊息路由的功能。訂閱者通過subscribe和psubscribe命令向redis訂閱自己感興趣的訊息類型,redis將資訊類型成為通道(channel)。當發行者通過關publish命令向redis server發送特定類型的資訊時,訂閱該訊息類型的全部client都會接收到此訊息。
例如開啟三個用戶端,一個發布訊息,另外兩個訂閱訊息,如下
六、虛擬記憶體的使用
Redis的虛擬記憶體是暫時吧不經常訪問的資料從記憶體交換到磁碟中,從而騰出記憶體空間用於其他的訪問資料,尤其對於redis這樣的記憶體資料庫,記憶體總是不夠用的。除了分隔到多個redis server外,提高資料庫的容量的方法就是使用虛擬記憶體,把那些不常訪問的資料交換到磁碟上。
通過配置vm相關的redis.config配置:
vm-enable yes #開啟vm功能
vm-swap-file /tmp/redis.swap #交換出來的value儲存的檔案路徑
vm-max-memory 10000000 #redis使用的最大記憶體上線
vm-page-size 32 #每個頁面的大小32位元組
vm-pages 123217729 #最多使用多小個頁面
vm-max-threads 4 #用於執行value對象換入的背景工作執行緒數量
虛擬記憶體管理在2.6及之上版本取消了