歡迎關注公衆號:【 愛編碼】
若是有須要後臺回覆 2019贈送 1T的學習資料哦!!
繼續接着上一篇【數據庫】Redis基礎篇html
爲了保證多條命令組合的原子性,Redis提供了簡單的事務功能以及集成Lua腳原本解決這個問題。簡單介紹Redis中事務的使用方法以及它的侷限性。redis
127.0.0.1:6379> multi OK 127.0.0.1:6379> sadd user:a:follow user:b QUEUED 127.0.0.1:6379> zadd user:b:fans 1 user:a QUEUED 127.0.0.1:6379> exec 1) (integer) 1 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379> sismember user:a:follow user:b (integer) 1
Redis提供了簡單的事務功能,**將一組須要一塊兒執行的命令放到multi和
exec兩個命令之間**。數據庫
multi命令表明事務開始。
exec命令表明事務結束。
它們之間的命令是原子順序執行的。
它不支持事務中的回滾特性。安全
基本語法教程可參考下面這個網址:
https://www.runoob.com/lua/lu...服務器
在Redis中執行Lua腳本有兩種方法:eval和evalsha。app
Redis提供了基於「發佈/訂閱」模式的消息機制,此種模式下,消息發佈
者和訂閱者不進行直接通訊,發佈者客戶端向指定的頻道(channel)發佈消息,訂閱該頻道的每一個客戶端均可以收到該消息。運維
publish channel:sports "Tim won the championship"
subscribe channel:sports
有關訂閱命令有兩點須要注意:性能
- 客戶端在執行訂閱命令以後進入了訂閱狀態,只能接收subscribe、
psubscribe、unsubscribe、punsubscribe的四個命令。學習
- 新開啓的訂閱客戶端,沒法收到該頻道以前的消息,由於Redis不會對
發佈的消息進行持久化。大數據
Redis發佈訂閱與成熟MQ的比較
(1)MQ支持多種消息協議,包括AMQP,MQTT,Stomp等,而且支持JMS規範,但Redis沒有提供對這些協議的支持;
(2)MQ提供持久化功能,但Redis沒法對消息持久化存儲,一旦消息被髮送,若是沒有訂閱者接收,那麼消息就會丟失;
(3)MQ提供了消息傳輸保障,當客戶端鏈接超時或事務回滾等狀況發生時,消息會被從新發送給客戶端,Redis沒有提供消息傳輸保障。
總之,MQ所提供的功能遠比Redis發佈訂閱要複雜,畢竟Redis不是專門作發佈訂閱的,可是若是系統中已經有了Redis,而且須要基本的發佈訂閱功能,就沒有必要再安裝MQ了,由於可能MQ提供的功能大部分都用不到,並且你能夠容忍redis發佈訂閱的缺點的話,能夠考慮用它。
Redis支持RDB和AOF兩種持久化機制,持久化功能有效地避免因進程退出形成的數據丟失問題,當下次重啓時利用以前持久化的文件便可實現數據恢復。
RDB持久化是把當前進程數據生成快照保存到硬盤的過程,觸發RDB持
久化過程分爲手動觸發和自動觸發。
手動觸發和自動觸發操做方法參考這位大神的文章:
https://www.cnblogs.com/ysoce...
RDB的優缺點
優勢:
缺點:
行都要執行fork操做建立子進程,屬於重量級操做,頻繁執行成本太高。
針對RDB不適合實時持久化的問題,Redis提供了AOF持久化方式來解決。
AOF(append only file)持久化:以獨立日誌的方式記錄每次寫命令,重啓時再從新執行AOF文件中的命令達到恢復數據的目的。
AOF的主要做用是解決了數據持久化的實時性,目前已是Redis持久化的主流方式。
開啓AOF,經過修改redis.conf配置文件
appendonly yes ##默認不開啓。
AOF文件名經過appendfilename配置設置,默認文件名appendonly.aof。保存路徑同RDB持久化方式一致,經過dir配置指定。
AOF的工做流程以下圖:
1)全部的寫入命令會追加到aof_buf(緩衝區)中。
2)AOF緩衝區根據對應的策略向硬盤作同步操做。
3)隨着AOF文件愈來愈大,須要按期對AOF文件進行重寫,達到壓縮的目的。
4)當Redis服務器重啓時,能夠加載AOF文件進行數據恢復。
更詳細的工做原理能夠參考書籍【Redis開發與運維(付磊)】
或者參考這篇文章:
https://redisbook.readthedocs...
舒適提示
場景:AOF文件可能存在結尾不完整的狀況,好比機器忽然掉電致使AOF尾部文件命令寫入不全。
解決方法:
# !!! Warning: short read while loading the AOF file !!! # !!! Truncating the AOF at offset 397856725 !!! # AOF loaded anyway because aof-load-truncated is enabled
Redis持久化功能一直是影響Redis性能的高發地。主要有如下方面
1. fork操做
原由:對於高流量的Redis實例OPS可達5萬以上,若是fork操做耗時在秒級別將拖慢Redis幾萬條命令執行,對線上應用延遲影響很是明顯。正常狀況下fork耗時應該是每GB消耗20毫秒左右。能夠在info stats統計中查latest_fork_usec指標獲取最近一次fork操做耗時,單位微秒。
優化:
1)優先使用物理機或者高效支持fork操做的虛擬化技術,避免使用Xen。
2)控制Redis實例最大可用內存,fork耗時跟內存量成正比,線上建議每一個Redis實例內存控制在10GB之內。
3)合理配置Linux內存分配策略,避免物理內存不足致使fork失敗。
4)下降fork操做的頻率,如適度放寬AOF自動觸發時機,避免沒必要要的全量複製等。
2. CPU
CPU開銷分析。子進程負責把進程內的數據分批寫入文件,這個過程屬於CPU密集操做,一般子進程對單核CPU利用率接近90%。
CPU消耗優化。Redis是CPU密集型服務,不要作綁定單核CPU操做。因爲子進程很是消耗CPU,會和父進程產生單核資源競爭。
不要和其餘CPU密集型服務部署在一塊兒,形成CPU過分競爭。若是部署多個Redis實例,儘可能保證同一時刻只有一個子進程執行重寫工做。
3. 內存
內存消耗優化:
1)同CPU優化同樣,若是部署多個Redis實例,儘可能保證同一時刻只有一個子進程在工做。
2)避免在大量寫入時作子進程重寫操做,這樣將致使父進程維護大量頁副本,形成內存消耗。
4. 硬盤
優化方法以下:
a)不要和其餘高硬盤負載的服務部署在一塊兒。如:存儲服務、消息隊列服務等。
b)AOF重寫時會消耗大量硬盤IO,能夠開啓配置no-appendfsync-on-rewrite,默認關閉。表示在AOF重寫期間不作fsync操做。
c)當開啓AOF功能的Redis用於高流量寫入場景時,若是使用普通機械磁盤,寫入吞吐通常在100MB/s左右,這時Redis實例的瓶頸主要在AOF同步硬盤上。
d)對於單機配置多個Redis實例的狀況,能夠配置不一樣實例分盤存儲AOF文件,分攤硬盤寫入壓力。
注:配置no-appendfsync-on-rewrite=yes時,在極端狀況下可能丟失整個AOF重寫期間的數據,須要根據數據安全性決定是否配置。
5.AOF追加阻塞
當開啓AOF持久化時,經常使用的同步硬盤的策略是everysec,用於平衡性能和數據安全性。對於這種方式,Redis使用另外一條線程每秒執行fsync同步硬盤。當系統硬盤資源繁忙時,會形成Redis主線程阻塞,
阻塞流程分析:
1)主線程負責寫入AOF緩衝區。
2)AOF線程負責每秒執行一次同步磁盤操做,並記錄最近一次同步時間。
3)主線程負責對比上次AOF同步時間:若是距上次同步成功時間在2秒內,主線程直接返回。若是距上次同步成功時間超過2秒,主線程將會阻塞,直到同步操做完成。
優化AOF追加阻塞問題主要是優化系統硬盤負載,優化方法參考第4點。
本文主要學習Redis的事務、發佈訂閱、以及持久化。
後續會繼續學習Redis集羣等方面的知識。
若是對 Java、大數據感興趣請長按二維碼關注一波,我會努力帶給大家價值。以爲對你哪怕有一丁點幫助的請幫忙點個贊或者轉發哦。
關注公衆號【愛編碼】,回覆2019有相關資料哦。