Home >Database >Redis >Use Redis to complete the chat room function

Use Redis to complete the chat room function

齐天大圣
齐天大圣Original
2020-05-20 08:44:202405browse

Redis provides a Pub/Sub (publish/subscribe) model messaging mechanism. The publisher publishes messages to the specified channel, and subscribers who subscribe to the channel can obtain the messages. Through this mechanism, we can complete functions such as chat rooms and bulletin boards.

First, let’s introduce some commands about pub/sub.

Publish message

publish channel message Publish a message to the specified channel

If there is a car Friends group, at this time a user posted a message

127.0.0.1:6379> publish car:fans hello,everyone
(integer) 0

The return value of this command is the number of subscribers who have subscribed to this channel. As you can see, no one has subscribed to this channel yet.

Subscribe message

subscribe channel [channel] Subscribers can subscribe to one or more users

127.0.0.1:6379> subscribe car:fans
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "car:fans"
3) (integer) 1

At this time, a user has already joined the rider group. Gradually, more and more people join the group.

When a user posts a message, other group members can see the message.

127.0.0.1:6379> publish car:fans 'How are you'
(integer) 2127.0.0.1:6379> subscribe car:fans
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "car:fans"
3) (integer) 1
1) "message"
2) "car:fans"
3) "How are you"

Note: When the client executes the subscription command, it enters the subscription state and can only execute pub/sub related commands. In addition, new users who join the group cannot see previous messages because this mechanism does not persist messages. Although the functions are limited, it is simple enough.

One more thing, the more functions the better, it mainly depends on whether it is suitable for the scene. If you can do it, the simpler the better.

View the number of subscriptions

pubsub numsub [channel ...]

Want to view How many users are there in the group

127.0.0.1:6379> pubsub numsub car:fans
1) "car:fans"
2) (integer) 2

The group currently has 2 users.

Unsubscribe

unsubscribe [channel [channel ...]]

redis-cli UNSUBSCRIBE
1) "unsubscribe"
2) (nil)
3) (integer) 0

Practical combat

After introducing the above knowledge, we can complete the function of a chat room.

The pseudocode for publishing a message is very simple. The pseudocode for publishing a message is as follows:

function publist ($chanel, $message)
{
    $redis->publist($channel, $message);
}

The pseudocode for obtaining a message is as follows:

//设置php脚本执行时间
set_time_limit(0);
//设置socket连接超时时间
ini_set('default_socket_timeout', -1);
 
//声明频道名称
$channelName = "testpubsub";
 
try {
    $redis = new \Redis();
    $redis->pconnect('localhost', 6379);
    $redis->subscribe([$channelName], function ($redis, $channel, $msg)
    {
        echo 'channel:' . $channel . ',message:' . $msg . PHP_EOL;
    });
} catch (\Exception $e) {
    echo $e->getMessage();
}

There are several points to note here:

  • Consumers need to create a redis long connection,

  • Set set_time_limit and default_socket_timeout to ensure that php does not time out when blocking the message acquisition process, and the socket connection does not time out.

Currently, Redis provides a new Stream type, which is much more powerful. Interested friends can check the relevant information themselves.

The above is the detailed content of Use Redis to complete the chat room function. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn