1.發佈者如何知道訂閱者是否知道消息git
2.若是隻有部分訂閱者接收到消息,發佈者應該如何處理redis
利用redis的pub/sub實現消息隊列,固然也能夠使用redis的隊列實現,只不是須要線程,會形成延時和線程空轉而引發的內存消耗。 發佈者經過publish發佈消息.net
public Long publish(final String channel, final String message) { checkIsInMulti(); connect(); client.publish(channel, message); return client.getIntegerReply(); }
返回獲得接收到msg的訂閱者數量 訂閱監聽器須要繼承JedisPubSub來做爲監聽器,將發佈者和訂閱者之間進行持續連接,經過unsubscript取消訂閱同時將關閉連接所佔資源。線程
public abstract void onMessage(String channel, String message); public abstract void onPMessage(String pattern, String channel, String message); public abstract void onSubscribe(String channel, int subscribedChannels); public abstract void onUnsubscribe(String channel, int subscribedChannels); public abstract void onPUnsubscribe(String pattern, int subscribedChannels); public abstract void onPSubscribe(String pattern, int subscribedChannels);
最後經過subcript實現收到消息code
public void subscribe(final JedisPubSub jedisPubSub, final String... channels) { client.setTimeoutInfinite(); jedisPubSub.proceed(client, channels); client.rollbackTimeout(); }
訂閱的時候將會執行JedisPubSub中onSubscribe方法 收到消息的時候將會執行JedisPubSub中onMessage方法繼承
**歡迎加入193826252討論 實現代碼地址https://git.oschina.net/xForMe/fast_redis.git **隊列