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!