把瞬間伺服器的請求處理換成非同步處理,緩解伺服器的壓力,實現資料順序排列取得。本文主要和大家分享redis如何實現訊息佇列,希望能幫助大家。
訊息隊列,通俗點說就是訊息傳輸過程中暫時保存訊息的容器,可以在不同平台、不同語言的應用之間傳輸數據,並且可以非同步地實現資料寫入,在處理大並發問題時能起到很好的效果。
說一下我現在使用訊息佇列的場景:我的系統需要即時接收來自客戶端的請求(週期性請求),並且將請求的資料保存在資料庫,每次請求的資料量很小,但由於需要頻繁操作資料庫,所以系統遭遇到效能瓶頸。原先的想法是直接將這些數據保存在redis中,但仔細想想,雖然每次的數據量不大,但是由於數據是周期性的並且會不斷增長,雖然redis也有持久化功能,但如果依靠持久化到硬碟來保存,就失去了redis作為記憶體資料庫的優勢,所以最後決定使用訊息佇列。
方式如下:
每次要求的資料直接寫入訊息佇列,然後給予客戶端回應,後台開啟一個執行緒監聽訊息佇列,一旦有資料寫入,取得訊息佇列中的資料寫入mysql資料庫,這樣就可以實現非同步地將即時資料寫入資料庫,避免系統因直接操作資料庫造成的瓶頸。
那麼問題來了,使用哪種訊息佇列,現在比較主流的訊息佇列如:RabbitMQ,ActiveMQ等,其技術比較成熟效率也很高。但考慮到專案本身已經使用了redis(做快取),而且每次的資料量比較小,而redis不只是一個key-value資料庫,它支援豐富的資料類型,如HashMap、Set、List等,其中的List完全可以當作訊息佇列使用,並且redis的List支援blpop,brpop等阻塞式的指令,完全可以滿足我的需求。簡單的測試程式碼如下:
//产生数据 import redis.clients.jedis.Jedis; public class RedisProducer { /** * jedis操作List */ public static void main(String[] args){ Jedis jedis = new Jedis("192.168.10.209", 6379); for(int i = 0;i<10;i++) { jedis.lpush("informList","value_" + i); } jedis.close(); } } //消费数据 import java.util.List; import redis.clients.jedis.Jedis; public class RedisConsumer { /** * jedis操作List */ public static void main(String[] args){ ScheduleMQ mq = new ScheduleMQ(); mq.start(); } } class ScheduleMQ extends Thread { @Override public void run() { while(true) { Jedis jedis = new Jedis("192.168.10.209", 6379); //阻塞式brpop,List中无数据时阻塞 //参数0表示一直阻塞下去,直到List出现数据 List<String> list = jedis.brpop(0, "informList"); for(String s : list) { System.out.println(s); } jedis.close(); } } }
相關推薦:
以上是redis怎麼實作訊息佇列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!