redis怎麼實作訊息佇列?

小云云
發布: 2023-03-20 14:22:02
原創
9559 人瀏覽過

把瞬間伺服器的請求處理換成非同步處理,緩解伺服器的壓力,實現資料順序排列取得。本文主要和大家分享redis如何實現訊息佇列,希望能幫助大家。

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();
        }
    }
}
登入後複製

相關推薦:

PHP如何使用redis訊息佇列發布微博

php實作訊息佇列類別實例分享

PHP高階程式設計訊息佇列

以上是redis怎麼實作訊息佇列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板