即时通讯设计与实现详解(PHP+GatewayWorker+Redis)需要实现的功能一对一聊天(私聊)一对多聊天(群聊)类似QQ、微信等聊天列表实时消息展示工具选择GatewayWorker具有以下特点(更多信息请参考官网手册)基于Workerman开发基于Gateway,Worker进程模型支持分布式部署支持高concurrency支持全局广播或向任意客户端推送数据支持各种应用层协议多协议支持支持对象或资源永久保持高性能,便于与其他项目集成。支持长期连接。我们主要使用它的WebSocket通信协议,这个框架结合ThinkPHP、laravel等框架使用非常方便。GatewayWorker可以独立部署,PHP负责相关业务逻辑。Rediskey-value操作,集合列表等。在即时通讯中,最重要的就是响应速度,我们需要展示“消息列表”,那么就会有未读消息,未读消息数,消息内容最后一条消息,时间等等。websocket和GatewayWorker的原理不再赘述。不懂的童鞋请到端娘效果展示群聊|私聊效果图消息列表效果图数据库设计(群聊、私聊分离)私聊设计(BriefDesign)参数名称描述idprimarykeysender_idsenderidreceive_idreceiveridchat_identify标识:a与b聊天,b与a聊天。记录a-bmessage_detailslast_time_at聊天时间间隔的消息内容超过一定时间记录chat_identify字段很有用。这个字段是为了更方便的查找a和b之间的聊天记录。last_time_atQQ,微信聊天记录之间,间隔会有时间记录,不显示每条聊天记录的时间。群聊(简要设计)与私聊非常相似,只是接收者id变为group_idgroupid。消息列表设计,想要的效果是“私聊、群聊”等列表显示,数据实时变化。这里借助Redis,每个用户的列表是一个集合key=message_list:user_idRedis集合存储消息类型1私信,2群聊message_list:user_id{json_encode(['消息类型','接收者id|群id']),json_encode(['messagetype','receiverid|groupid']),json_encode(['messagetype','receiverid|groupid']),}找到每个人的消息列表,直接取即可出列表,但每个成员必须对应‘未读消息数’、‘最后一条消息的内容’、‘最后一小时的时间’。因为是可变的,需要在上面的集合列表中存储Rediskeyvaluekey=message_content:user_id_messagetype_idkey=>json_encode(['numberofmessages','lastmessagecontent','time'])每个成员对应每个这里的关键值。消息更新必须要操作Redis,以及相应的更新内容。论速度,毫无疑问redis是相当快的。私聊|需要后续优化的群聊记录表。目前的设计是一个单一形式的图书馆。显然,随着用户数量的增加,它必然会出现爆炸式增长。影响查询的响应速度。(解决方案无非是:分库分表,传输备份历史)GatewayWorker通信框架是单机部署,不能支持太高的并发。这里只是简单介绍一下即时通讯的设计。如果您有任何问题或建议,请在评论区回复。
