SpringBoot 2.2.1.RELEASE
を使用して、pom.xml に直接プロジェクト環境を構築します。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
に redis の依存関係を追加します。redis がデフォルト構成の場合、追加の構成を追加する必要はありません。次のように、application.yml
で直接構成することもできます。以下
spring: redis: host: 127.0.0.1 port: 6379 password:
redisのパブリッシュ/サブスクライブは主に2つのコマンドを使用しますpublish/subscribe
; SpringBootでパブリッシュとサブスクライブモードを使用するのは比較的簡単です, そして、RedisTemplate の実装を使用すると非常に便利です
@Service public class PubSubBean { @Autowired private StringRedisTemplate redisTemplate; public void publish(String key, String value) { redisTemplate.execute(new RedisCallback<Object>() { @Override public Object doInRedis(RedisConnection redisConnection) throws DataAccessException { redisConnection.publish(key.getBytes(), value.getBytes()); return null; } }); } }
ここではメッセージ サブスクリプションを使用することに注意してください。 org.springframework.data.redis.connection.MessageListener
消費ロジックを実装する
public void subscribe(MessageListener messageListener, String key) { redisTemplate.execute(new RedisCallback<Object>() { @Override public Object doInRedis(RedisConnection redisConnection) throws DataAccessException { redisConnection.subscribe(messageListener, key.getBytes()); return null; } }); }
上記のパブリッシュとサブスクライブを検証するための簡単なテストケースを作成します。を理解してくださいMessageListener
使用姿勢; 単純な WEB プロジェクトを作成し、2 つの REST インターフェイスを提供します
@RestController @RequestMapping(path = "rest") public class DemoRest { @Autowired private PubSubBean pubSubBean; // 发布消息 @GetMapping(path = "pub") public String pubTest(String key, String value) { pubSubBean.publish(key, value); return "over"; } // 新增消费者 @GetMapping(path = "sub") public String subscribe(String key, String uuid) { pubSubBean.subscribe(new MessageListener() { @Override public void onMessage(Message message, byte[] bytes) { System.out.println(uuid + " ==> msg:" + message); } }, key); return "over"; } }
まず 2 つのコンシューマを作成し、次にメッセージを送信するときに両方を受信します。新しいコンシューマ または、メッセージを送信するとき、3 人全員がメッセージを受信できます
Redis のパブリッシュとサブスクライブは、比較的単純なシナリオにのみ適しています。これは、1 対 N をサポートする単純なパブリッシュおよびサブスクライブ モデルであることがわかり、送信されたメッセージはオンラインの消費者のみが取得できます (オンラインでない消費者については、次のようにしか言えません)。残念です) そして redis の場合、メッセージがプッシュアウトされたら終わりです。消費者が正常に消費できるかどうかについては、私たちは気にしません。
強調:
オンライン消費者のみがメッセージを受信できます
消費者がメッセージを受信できるのは 1 回だけです
次の質問は次のとおりです。どのような状況で実行できますか? Redis を使用したパブリッシュとサブスクライブについてはどうですか?
メモリベースのキャッシュの無効化
二次キャッシュに reids メモリを使用することは、比較的一般的な方法であると言えます。システム負荷を効果的に改善しますが、問題も明らかです。特にアプリケーションが複数のサーバーにデプロイされている場合、メモリ内のキャッシュされたデータの無効化が問題になります。すべてのサーバーの特定のメモリ キャッシュを同時に無効にしたい場合は、次を使用します。 redis のパブリッシュ/サブスクライブは 1 つです より良い選択
SpringCloud Config 構成の更新
SpringCloud Config を構成センターとして使用している友人は、この問題に頻繁に遭遇する可能性があります。変更は問題です (もちろん、公式サポートは mq を介してバス経由で同期することです。また、Spring Boot admin を介してフラッシュを強制することもできます)
Redis パブリッシュ/サブスクライブの助けを借りて、これも問題です。構成の動的な更新を実現するための優れた代替手段 (後述) 特定の実装デモ、ご興味がございましたら、引き続き Yihuihui ブログをフォローしてください)
#redis キーが無効なサブスクリプション #キャッシュに Redis を使用する場合、通常は有効期限を設定します。Redis は有効期限イベントを提供します。もちろんデフォルトでは有効になっていません。また、subscribeを通じてキャッシュ無効化イベントにサブスクライブすることもできます
設定を変更しますそしてキー無効化イベント
notify-keyspace-events Ex##を有効にします #redisを再起動した後、無効なイベント
subscribe __keyevent@0__:expiredをサブスクライブします
以上がRedis パブリッシュおよびサブスクライブ メソッドを使用して単純なメッセージング システムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。