Terbitkan dan langgan (pub/sub) ialah model komunikasi mesej Tujuan utama adalah untuk memisahkan gandingan antara penerbit mesej dan pelanggan mesej kepada corak Pemerhati dalam corak reka bentuk. pub/sub bukan sahaja menyelesaikan gandingan peringkat kod langsung penerbit dan pelanggan, tetapi juga menyelesaikan gandingan kedua-duanya dalam penggunaan fizikal. Sebagai pelayan pub/sub, redis memainkan fungsi penghalaan mesej antara pelanggan dan penerbit. Pelanggan boleh melanggan pelayan redis untuk jenis mesej yang mereka minati melalui arahan langgan dan planggan Redis memanggil jenis mesej sebagai saluran. Apabila penerbit menghantar jenis mesej tertentu kepada pelayan redis melalui arahan terbitkan. Semua pelanggan yang melanggan jenis mesej ini akan menerima mesej ini. Penyampaian mesej di sini adalah banyak-ke-banyak. Pelanggan boleh melanggan berbilang saluran dan menghantar mesej kepada berbilang saluran.
Mari kita mulakan dengan arahan asas:
PSUBSCRIBE pattern [pattern ...] #订阅一个或多个符合给定模式的频道;PUBSUB subcommand [argument [argument ...]] #查看订阅与发布系统状态;PUBLISH channel message #将信息发送到指定的频道;PUNSUBSCRIBE [pattern [pattern ...]] #退订所有给定模式的频道;SUBSCRIBE channel [channel ...] #订阅给定的一个或多个频道的信息;UNSUBSCRIBE [channel [channel ...]] #指退订给定的频道;
Seperti yang anda lihat dari manual redis, sebenarnya, mod "terbit dan langgan" hanya mempunyai 6 arahan satu
LANGGAN
Langgan maklumat daripada saluran atau saluran tertentu.
SUBSCRIBE channel [channel ...]
Melihat dari penjelasan rasmi di atas, permainannya adalah seperti mendengar radio dalam kehidupan sebenar. Apa yang kita lakukan jika kita ingin mendengar radio? Ia mesti di saluran yang betul sahaja kita boleh mendengar program yang baik, jadi kita mesti melanggan saluran terlebih dahulu.
root@localhost:~ # redis-cli -p 6379127.0.0.1:6379> SUBSCRIBE msg Reading messages... (press Ctrl-C to quit) 1) "subscribe"2) "msg"3) (integer) 1 root@localhost:~ # redis-cli -p 6379127.0.0.1:6379> SUBSCRIBE msg Reading messages... (press Ctrl-C to quit) 1) "subscribe"2) "msg"3) (integer) 1
LANGGANAN juga boleh melanggan berbilang saluran, supaya maklumat yang diterima mungkin datang daripada berbilang saluran.
PUBLISH
Sehingga kini, kedua-dua subscibe ini sedang memantau saluran msg Seterusnya, jika ada berita keluar dari saluran msg, pasti akan dilanggan Diterima, mari kita lihat dahulu cara menggunakan arahan ini dalam manual redis.
Hantar mesej maklumat ke saluran saluran yang ditentukan.
PUBLISH channel message
Demonstrasi berikut:
Adakah anda melihat bahawa selepas penerbitan menghantar mesej pada saluran mesej, ia dipantau dengan melanggan dan kemudian dicetak secara berasingan? Output, okay, setakat ini, model publish-subscribe yang paling asas adalah seperti ini. Sebenarnya? ? ? Semudah itu, tetapi kadang-kadang kita masih mempunyai keperluan, iaitu, bolehkah saya padankan dengan kunci? Sebagai contoh, ia dikehendaki melanggan semua saluran dengan awalan china Jika ini boleh dilakukan, ia akan menjadi sangat bagus. . . Jika saya menjawab, pastinya Redis yang perkasa pasti boleh melakukannya, ia memberikan arahan PSUBSCRIBE.
LANGGAN
Langgan satu atau lebih saluran yang sepadan dengan corak tertentu Setiap corak menggunakan sebagai watak yang sepadan semua saluran bermula dengan Saluran bermula dengannya (it.news, it.blog, it.tweets, dll.), berita.* sepadan dengan semua saluran bermula dengan berita (news.it, news.global.today, dsb.), dan seterusnya.
PSUBSCRIBE pattern [pattern ...]
知道了发布和订阅的机制之后,接下来就可以开始研究具体的实现了,我们从Redis的订阅命令开始说起。
前面说到,Redis将所有接受和发送信息的任务交给channel来进行,而所有channel的信息就储存在redisServer这个结构中:
struct redisServer { // 省略 ... dict *pubsub_channels; // Map channels to list of subscribed clients // 省略 ... };
pubsub_channels是一个字典,字典的键就是一个个channel,而字典的值则是一个链表,链表中保存了所有订阅这个channel的客户端。
举个例子,如果在一个 redisServer 实例中,有一个叫做 news 的频道,这个频道同时被client_123 和 client_456 两个客户端订阅,那么这个 redisServer 结构看起来应该是这样子:
可以看出,实现SUBSCRIBE命令的关键,就是将客户端添加到给定channel的订阅链表中。
除了直接订阅给定channel外,还可以使用PSUBSCRIBE订阅一个模式(pattern),订阅一个模式等同于订阅所有匹配这个模式的channel 。
和redisServer.pubsub_channels属性类似,redisServer.pubsub_patterns属性用于保存所有被订阅的模式,和pubsub_channels不同的是, pubsub_patterns是一个链表(而不是字典):
struct redisServer { // 省略 ... list *pubsub_patterns; // A list of pubsub_patterns // 省略 ... };
pubsub_patterns 的每一个节点都是一个 pubsubPattern 结构的实例,它保存了被订阅的模式,以及订阅这个模式的客户客户端:
typedef struct pubsubPattern { redisClient *client; robj *pattern; } pubsubPattern;
举个例子,假设在一个 redisServer 实例中,有一个叫做 news.* 的模式同时被客户端client_789 和 client_999 订阅,那么这个 redisServer 结构看起来应该是这样子:
现在可以知道,实现PSUBSCRIBE命令的关键,就是将客户端和订阅的模式添加到redisServer.pubsub_patterns当中。
Atas ialah kandungan terperinci Analisis contoh model terbitan/langgan Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!