基於redis佇列的日誌系統實現

2021-09-26 15:28:03 字數 1484 閱讀 2740

1、log的儲存不應該被當前執行緒的session影響,和log4j一樣,執行到哪一步就記錄哪一步,輸出到資料庫,不能出現錯誤回滾或則儲存失敗。

2、log的儲存和插入不能影響當前執行緒,不能因為日誌儲存過多而影響當前程序響應速度,或則占用資料庫資源影響程序的讀寫。

先將日誌產生後放入快取佇列中,不影響當前程序,另起乙個程序去消費佇列中的日誌資訊,儲存至資料庫。

本次使用了redis 的生產消費模式,生產日誌,另起執行緒消費日誌

優點: 不影響當前程序,也不受當前程序影響,用redis佇列的話,讀寫速度極快,每秒百萬級別基本不會出現堵塞現象。

缺點:需要另起程序消費,雖然讀寫很快,但是還是做不到實時儲存。

步驟:1、新建日誌實體,資料庫日誌表,可以根據自己的需求建立多個日誌實體儲存。

public class systemloginfo extends baseentityimplements serializable 

public void setmessage(string message)

public string getipaddress()

public void setipaddress(string ipaddress)

public string getport()

public void setport(string port)

public date getlogtime()

public void setlogtime(date logtime)

public string getloglevel()

public void setloglevel(string loglevel)

}

2整合jedis;(這裡我用到了集群,所以建立了jediscluster的bean物件)

3呼叫 jediscluster.lpush()左邊插入資料(即生產資料)

jediscluster.lpush(redisserializerutil.serialize(message_key),redisserializerutil.serialize(message));
4呼叫jediscluster.brpop(),從右側取資料(即消費資料)

watetime即為等待時間,如果沒有資料會等待直至佇列中有資料,為0 時會一直等待(

因為redis佇列是單執行緒,所以這個等待會堵塞佇列的獲取。所以消費執行緒只需要乙個就可以,無需多個)

listmessage =jediscluster.brpop(watetime, redisserializerutil.serialize(logging.message_key));

if (null != message && (!message.isempty()))

5總結,redis的特性有很多,本次用到了redis的生產消費模式

基於Redis的BloomFilter實戰

離線資料處理與實時資料處理有很大的不同,其中乙個例子就是去重。在聚資料中,訪問uv和購買uv都需要實時的去重。離線處理的時候,我們可以通過count groupby 或者count distinct 等方式比較容易的計算出uv,而且不用太擔心效能,大不了就是多一點map或者執行時間久一點。那麼在實時...

基於訊息佇列的日誌元件

日誌支援的儲存方式有 文字,xml,資料庫三種。如果採用資料庫方式,支援的資料庫有sql server oracle。日誌採用讀寫分離的方式,客戶端傳送日誌到訊息佇列,然後服務端程式讀取訊息佇列,根據配置資訊,將訊息佇列中的日誌寫入載體 文字 xml 資料庫 如果採用資料方式,不需要配置path節點...

基於redis構建訊息佇列

一般來說,訊息佇列有兩種場景 一種是發布者訂閱者模式 一種是生產者消費者模式。利用redis這兩種場景的訊息佇列都能夠實現。定義 1 redis作為訊息中介軟體 1 producer consumermode 該方式是借助redis的list結構實現的。producer呼叫redis的lpush往特...