一個Redis訊息佇列實現
訊息佇列
某次在某乎上看到有人提到訊息佇列的問題,然後有人在回答裡提到了Redis,接著便有人在評論裡指出:Redis是快取,不是訊息佇列。
但不幸的是,Redis的確提供一個簡易的訊息佇列機制,可以用於一些要求不那麼高的場合。
方法就是利用Redis的列表型別的push和pop操作。
我對前文所介紹的Redis Cache作了一點簡單的擴充套件,增加了訊息佇列功能。
實現
程式碼基本就這麼點:
class RedisMQ(RedisCache):
def __init__(self, dbname, host='localhost', port=6379, db=0 ):
super(RedisMQ, self).__init__(dbname, host, port, db)
def push(self, channel, data):
ch = self._getkey("channel", channel)
self.db.lpush(ch, self.SERIALIZER.dumps(data))
def pop(self, channel, timeout=5):
ch = self._getkey("channel", channel)
msg = self.db.brpop(ch, timeout)
return self.SERIALIZER.loads(msg[1]) if msg else None
class Channel(object):
MQ = RedisMQ("msgqueue")
def __init__(self, channel):
self.channel = channel
def push(self, **kwargs):
Channel.MQ.push(self.channel, kwargs)
def pop(self):
return Channel.MQ.pop(self.channel)
用法
訊息生產者
ch = Channel("test")
ch.push(a=123,b="hello")
訊息消費者,可能是另一個執行緒,甚至是另一個程序,甚至是另外一臺主機——只要它們共用同一個redis即可。
ch = Channel("test")
while msg=ch.pop():
# msg: {"a": 123, "b": "hello"}
# ch is empty
相關推薦
一個Redis訊息佇列實現
訊息佇列 某次在某乎上看到有人提到訊息佇列的問題,然後有人在回答裡提到了Redis,接著便有人在評論裡指出:Redis是快取,不是訊息佇列。 但不幸的是,Redis的確提供一個簡易的訊息佇列機制,可以用於一些要求不那麼高的場合。 方法就是利用Redis的列
SpringBoot(9) 基於Redis訊息佇列實現非同步操作
什麼是訊息佇列?所謂訊息佇列,就是一個以佇列資料結構為基礎的一個真實存在的實體,如陣列,redis中的佇列集合等等,都可以。為什麼要使用佇列?主要原因是由於在高併發環境下,由於來不及同步處理,請求往往會發生堵塞,比如說,大量的insert,update之類的請求同時到達MyS
redis 訊息佇列實現
方式一:通過list的阻塞讀取命令,blpop或者brpop 消費者 public class Consumer extend
Redis + DB +訊息佇列 實現高效的文章點贊,點踩功能
需求說明 使用者可點贊或踩,每贊一次,“贊”數量+1,每踩一次,“踩”數量+1,“點贊”和“點踩” 當天內二選一當天內有效 場景:使用者A 點贊 文章a,文章a 點贊量+1 ,同一使用者,同一文章 當天再次點選無效,贊與踩二選一,隔天再次點選有效 表設計 文章的
使用jedis實現Redis訊息佇列(MQ)的釋出(publish)和訊息監聽(subscribe)
前言: 本文基於jedis 2.9.0.jar、commons-pool2-2.4.2.jar以及json-20160810.jar 其中jedis連線池需要依賴commons-pool2包,json
[轉載]使用訊息佇列實現分散式事務-公認較為理想的分散式事務解決方案
前陣子從支付寶轉賬1萬塊錢到餘額寶,這是日常生活的一件普通小事,但作為網際網路研發人員的職業病,我就思考支付寶扣除1萬之後,如果系統掛掉怎麼辦,這時餘額寶賬戶並沒有增加1萬,資料就會出現不一致狀況了。 上述場景在各個型別的系統中都能找到相似影子,比如在電商系統中,當有使用者下單後,除了在訂單表插
System V訊息佇列實現的檔案伺服器(不跨網路)
可能是定時的部分有問題吧,導致客戶端無法接收資料,不過我感覺思想是沒錯的。。。先pull上吧,以後發現錯誤再改 參考資料:UNP卷二 message.h #ifndef _MESSAGE_H #define _MESSAGE_H #include<stdio.h> #i
利用訊息佇列實現簡單聊天程式
本篇利用訊息佇列的特性實現簡單的聊天程式,msgsnd傳送資料,msgrcv接收資料來實現聊天功能,訊息佇列詳情。 資料接收端msgrcv //這是一個以system V訊息佇列實現的聊天程式客戶端 //// 1.建立訊息佇列 //// 2.從訊息佇列中獲取一個數據,打印出來 ///
brpop阻塞redis訊息佇列
不使用brpop的時候其實也可以實現redis的訊息佇列,只是不是阻塞的,目前已知的問題長時間沒有任務的話,consumer會出現假死的狀態,使用redis3.0版本,聽說使用3.2以上的版本不會出現這種假死的問題,目前沒有測試: def parse_url(self):
PHP訊息佇列實現及應用:訊息佇列概念介紹
在網際網路專案開發者經常會遇到『給使用者群發簡訊』、『訂單系統有大量的日誌需要記錄』或者在秒殺業務的時候伺服器無法承受瞬間併發的壓力。 這種情況下,我們怎麼保證系統正常有效的執行呢? 這個時候,我們可以引入一個叫『訊息佇列』的概念來解決上面的需求。 訊息佇列的概
Spring Boot中使用WebSocket總結(三):使用訊息佇列實現分散式WebSocket
在上一篇文章(www.zifangsky.cn/1359.html)中我介紹了服務端如何給指定使用者的客戶端傳送訊息,並如何處理對方不線上的情況。在這篇文章中我們繼續思考另外一個重要的問題,那就是:如果我們的專案是分散式環境,登入的使用者被Nginx的反向代理分配到多個不同伺服器,那麼在其中一個伺服器建立了W
基於Apache Apollo 的MQTT訊息佇列實現
1.Apache Apollo 的介紹和服務搭建 (以 windows為例) 1.1 介紹 MQTT是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。該協議支援所有平臺,幾乎可以把所有聯網物品和外部連線起來,被用來當做
一個用訊息佇列 的人,不知道為啥用 MQ,這就有點尷尬
訊息佇列 為什麼寫這篇文章? 博主有兩位朋友分別是小A和小B: 小A,工作於傳統軟體行業(某社保局的軟體外包公司),每天工作內容就是和產品聊聊需求,改改業務邏輯。再不然就是和運營聊聊天,寫幾個SQL,生成下報表。又或者接到客服的通知,某某功能故障了,改改資料,然後下班部署上
springcloud 之 redis訊息佇列
(1) redis 作為訊息佇列, (2) eureka client 作為服務發現元件 (3) netty作為長連線中心 application.yml server: port: 8099 # Redis資料庫索引(預設為0) spring: redis
redis訊息佇列的處理邏輯
redis 作佇列使用時,假設需要完成以下邏輯: 1.一端入,令一端出。 2.每一次讀取佇列內容長度10。 3. 讀取完之後從移除讀取過的內容。 先說結論: 官方客戶端命令的順序應該是: 1.rpush
介紹下用訊息佇列實現分散式事務
在OIE的時代, 上層應用開發人員總是認為資料庫足夠強大, 所以很多業務可以做的非常簡單。 比如A轉賬50元給B這個過程, 只要寫一個簡單sql語句塊就ok了。 開始事務; A賬戶減去50 B賬戶增加50 提交事務。
如何使用Jedis操作Redis訊息佇列
資源連結 [Jedis的jar包] 1 [Commons-io的jar包] 2 使用方法 程式碼樣例如下,使用前,注意開啟redis的server程式。 程式碼樣例 package RedisExample; import redis.clients.jedis.Jedis; public class T
分散式延遲訊息佇列實現分析與設計
介紹 延遲佇列,顧名思義它是一種帶有延遲功能的訊息佇列。 那麼,是在什麼場景下我才需要這樣的佇列呢? 很多時候我們會有延時處理一個任務的需求,比如說: 2個小時後給使用者傳送簡訊。 15分鐘後關閉網路連線。 2分鐘後再次嘗試回撥。 下面我們來分別探討一下幾種實現方案: Ja
使用訊息佇列實現分散式事務-公認較為理想的分散式事務解決方案(三)
Begin transaction update A set amount=amount-10000 where userId=1; update B set amount=amount+10000 where userId=1; End t
Php訊息佇列實現
分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/ 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!