Основное введение
Опубликовать/подписаться (означает опубликовать, подписаться) – это функция публикации и подписки
- В системах, основанных на событиях, pub/sub является широко используемой моделью коммуникации. Он использует события в качестве основного механизма связи для обеспечения режима взаимодействия, требующегося для крупномасштабных систем: подписчик (например, клиент) выражает событие или класс событий, которые он заинтересован в получении в форме подписки на события; издатель (например, сервер) может отслеживать события, в которых заинтересован подписчик, уведомляя соответствующих подписчиков.
- Издателю сообщений, то есть клиенту публикации, не нужны эксклюзивные ссылки. Вы можете использовать ту же ссылку redis client для других операций (например, incr) при публикации сообщений
- Подписчику сообщения, то есть клиенту подписки, нужны эксклюзивные ссылки. То есть во время подписки клиент redis не может выполнять другие операции. В это время клиент ожидает сообщения “опубликовать” блокирующим способом. Это хорошо понятно. Поэтому стороне подписчика необходимо использовать отдельную ссылку, даже в дополнительном потоке.
При использовании банковской карты для потребления банки часто сообщают пользователям информацию о транзакциях через wechat, SMS или электронную почту, что является режимом публикации и подписки. Здесь публикация-это публикация информации о транзакциях, а подписка-это все каналы. Это очень распространено в практической работе, и redis поддерживает такой режим.
Режим публикации и подписки сначала требует источника сообщения, то есть сообщение должно быть опубликовано, например, банковское уведомление в примере. Первый-это система бухгалтерского учета банка. После получения заказа на транзакцию он отправит сообщение. В это время подписчик может получить сообщение для обработки. Режим наблюдателя является типичным применением этого режима.
Реализация терминала
Подписка, канал-это новости о выпуске “чата”
реализация кода
подписываться. php
connect("127.0.0.1",6379);
//$redis->setOption(Redis::OPT_ READ_ Timeout, - 1); // redis mode does not time out. Recommended
$redis - > subscribe (['chan '],'callback'); // callback is the name of the callback function
//$redis - > subscribe (['chan '], array (New testcall(),'callback')); // if the callback function is a method name in the class, write as follows
//Callback function, write processing logic here
function callback($instance, $channelName, $message)
{
echo $channelName, "==>", $message, PHP_EOL;
//$instance is the redis instance object created above. In the callback function, the default parameter is, so there is no need to pass a parameter. Except for the four commands, subscribe, psubscribe, unsubscribe and punsubscribe, other commands cannot be used
//If you want to use other commands in redis, do this
$newredis = new Redis();
$newredis->connect("127.0.0.1", 6379);
echo $newredis->get('test') . PHP_EOL;
$newredis->close();
//Different business logic can be processed according to $channelname and $message
switch($chan) {
case 'chan-1':
...
break;
case 'chan-2':
...
break;
}
switch($message) {
case 'msg1':
...
break;
case 'msg2':
...
break;
}
}php
connect("127.0.0.1",6379);
$redis->publish('chan','this is a message');Введение в код
- subscribe.php Не устанавливайте тайм-аут в
Метод 1: набор ini_(“тайм-аут по умолчанию для сокета”, -1);
Способ 2: $redis – > setoption (redis:: OPT)_ ВРЕМЯ ОЖИДАНИЯ ЧТЕНИЯ, -1);
Если тайм – аут не установлен, сообщение об ошибке появится через 60 секунд
PHP Fatal error: Uncaught RedisException: read error on connection to 127.0.0.1:6379 in subscribe.php:6
Режим 1 реализуется путем временного изменения значения конфигурации ini, тайм-аут по умолчанию для сокета по умолчанию составляет 60 секунд_ Тайм-аут-это параметр тайм-аута потока сокетов, то есть весь процесс потока сокетов от создания до передачи и закрытия должен быть завершен в течение времени, установленного этим параметром. Если это не может быть завершено, PHP автоматически завершит работу сокета и вернет предупреждение.
Второй способ-изменить элемент конфигурации redis, чтобы он действовал только при подключении redis. По сравнению с режимом 1 это не окажет неожиданного влияния на другие методы.
Массовая подписка
Redis psubscribe поддерживает пакетную подписку с помощью сопоставления шаблонов
$redis – > подписка на подписку ([“Мой * “],”подписка на подписку”);//функция обратного вызова записывает имя функции, возможно, $redis – > подписка на подписку ([“Мой*”], массив (Новый тестовый вызов (), “подписка на подписку”));//функция обратного вызова является методом в классе, и имя класса записывается с помощью вашего собственного определенного класса
$redis – > подписка на подписку ([“Мой * “],”подписка на подписку”);//функция обратного вызова записывает имя функции, возможно, $redis – > подписка на подписку ([“Мой*”], массив (Новый тестовый вызов (), “подписка на подписку”));//функция обратного вызова является методом в классе, и имя класса записывается с помощью вашего собственного определенного класса
connect("127.0.0.1",6379);
$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
//Matching method 1: publish available $redis - > publish ('mymest ','This is a message');
//$redis->psubscribe(['my*'],'psubscribe');
//Matching method 2: publish available $redis - > publish ('mydest ','This is a message');
//$redis->psubscribe(['my?est'],'psubscribe');
//Matching method 3: publish with $redis - > publish ('myaest ','This is a message'); or $redis - > publish ('myeest ','This is a message');
$redis->psubscribe(['my[ae]est'],'psubscribe');
function psubscribe($redis, $pattern, $chan, $msg) {
echo "Pattern: $pattern\n";
echo "Channel: $chan\n";
echo "Payload: $msg\n";
}Правила сопоставления шаблонов
Он поддерживает следующие типы, такие как Hello:
h?llo подписывается на “привет, привет и привет”, h*llo подписывается на “привет” и “привет”, h[ae]llo подписывается на “привет” и “привет”, но специальные символы hillo не используются для побега
Введение в метод PubSub
публичная функция pubsub (ключевое слово$, аргумент$)
PubSub получает информацию о пабе/подсистеме. Ключевое слово $может использоваться как “каналы”, “numsub” или “numpat”. Данные, возвращаемые разными ключевыми словами, отличаются
*$redis > PubSub ('channels'); // all channels gets all channels and returns an array
*$redis - > PubSub ('channels', '* pattern *'); // just channels matching your pattern to return channels that match the matching pattern
*$redis - > PubSub ('numsub ', array ('chan1','chan2 '); // get subscriber counts for' chan1 'and' chan2 '// returns the number of each subscription channel and returns an array
*$redis - > PubSub ('numpat '); // get the number of pattern subscribers to get the number of subscriptions in pattern matching mode, i.e. $redis - > psubscribe (['My [AE] EST'],'psubscribe '); the returned quantity is 1, $redis - > subscribe (['chan'],'callback '); this method cannot get the number, so the returned number is 0справочные ресурсы:
Режим подписки на публикацию Redis