>  기사  >  데이터 베이스  >  Redis를 사용하여 채팅방 기능을 완료하세요.

Redis를 사용하여 채팅방 기능을 완료하세요.

齐天大圣
齐天大圣원래의
2020-05-20 08:44:202295검색

Redis는 Pub/Sub(게시/구독) 모델 메시징 메커니즘을 제공합니다. 게시자는 지정된 채널에 메시지를 게시하고 채널을 구독하는 구독자는 메시지를 얻을 수 있습니다. 이 메커니즘을 통해 채팅방, 게시판 등의 기능을 완성할 수 있습니다.

먼저 pub/sub에 관한 몇 가지 명령어를 소개하겠습니다.

채널 메시지 게시

채널 메시지 게시 지정된 채널에 메시지 게시

자동차 친구 그룹이 있고, 이때 사용자가 메시지를 게시했다고 가정해 보세요

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

반환 값 이 명령의 의미는 사용자가 채널을 구독했다는 것입니다. 채널 구독자 수입니다. 보시다시피 아직 이 채널을 구독한 사람이 없습니다.

메시지 구독

채널 [채널] 구독 구독자는 한 명 이상의 사용자를 구독할 수 있습니다

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

이 시점에서 사용자가 자동차 친구 그룹에 가입했습니다. 점차적으로 점점 더 많은 사람들이 그룹에 합류합니다.

사용자가 메시지를 게시하면 다른 그룹 구성원이 해당 메시지를 볼 수 있습니다.

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"

참고: 클라이언트가 구독 명령을 실행하면 구독 상태로 들어가며 pub/sub 관련 명령만 실행할 수 있습니다. 또한 이 메커니즘은 메시지를 유지하지 않기 때문에 그룹에 가입하는 새 사용자는 이전 메시지를 볼 수 없습니다. 기능은 제한되어 있지만 충분히 간단합니다.

한 가지 더, 기능이 많을수록 주로 장면에 적합한지 여부에 달려 있습니다. 할 수 있다면 간단할수록 좋습니다.

구독자 수 확인

pubsub numsub [채널...]

그룹의 사용자 수를 확인하고 싶습니다

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

그룹의 사용자는 현재 2명입니다.

Unsubscribe

Unsubscribe [채널 [채널 ...]]

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

실전 전투

위의 지식을 소개한 후 채팅방 기능을 완성할 수 있습니다.

메시지 게시를 위한 의사코드는 매우 간단합니다.

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

메시지 가져오기를 위한 의사코드는 다음과 같습니다.

//设置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();
}

여기서 몇 가지 참고할 사항이 있습니다.

  • 소비자는 redis 긴 연결을 생성해야 합니다.

  • set_time_limit 및 default_socket_timeout을 설정하여 차단된 메시지 획득 프로세스 PHP가 시간 초과되지 않고 소켓 연결 시간이 초과되지 않도록 보장합니다.

현재 Redis는 새로운 스트림을 제공합니다. 훨씬 더 강력한 유형입니다. 관심 있는 친구들이 직접 관련 정보를 확인할 수 있습니다.

위 내용은 Redis를 사용하여 채팅방 기능을 완료하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.