GGTalk 开源即时通讯系统源码剖析之:服务端全局缓存

GGTalk 对需要频繁查询数据库的数据做了服务端全局缓存处理,这样做一来大大降低了数据库的读取压力,二来在客户端的请求到来时,服务端能更快地响应,极大地提升了用户体验。这篇文章将会详细剖析关于 GGTalk 服务端全局缓存的设计与实现。还没有GGTalk源码的朋友,可以到 GGTalk源码下载中心 下载。

一. GGTalk 服务端三大核心

首先,我们需要了解 GGTalk服务端 的三大核心,其分别是:

  • 消息处理:处理来自客户端的消息;
  • 全局缓存:将用户和群组的数据缓存在内存中;
  • 数据库交互:对数据库中的信息进行增删改查。

1. 消息处理

此部分的代码位于 GGTalk/TalkBase/Server/Core/ServerHandle.cs

当一个客户端的请求进来时,首先会进入消息处理环节,根据用户传递的消息号,进入不同的逻辑分支。以修改用户信息为例:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-csharp"><span style="color:#008000">//(客户端逻辑代码)</span>
<span style="color:#008000"><span style="color:#808080">///</span> <span style="color:#808080"><summary></span></span>
<span style="color:#008000"><span style="color:#808080">///</span> 修改个人资料。</span>
<span style="color:#008000"><span style="color:#808080">///</span> <span style="color:#808080"></summary></span>        </span>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> <span style="color:#a31515">ChangeMyBaseInfo</span>(<span style="color:#0000ff">string</span> name, <span style="color:#0000ff">string</span> signature, <span style="color:#0000ff">string</span> department) {
  <span style="color:#008000">//...</span>
  <span style="color:#0000ff">this</span>.rapidPassiveEngine.SendMessage(<span style="color:#a31515">null</span>, <span style="color:#0000ff">this</span>.talkBaseInfoTypes.ChangeMyBaseInfo, data, <span style="color:#a31515">""</span>, <span style="color:#a31515">true</span>);
  <span style="color:#008000">//...</span>
}
</code></span></span>

当一个用户信息被修改时,会调用如上方法,然后通过调用 rapid客户端引擎 上的 SendMessage 方法发送一条消息(其中 data 为用户信息的 byte[]数组)。

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-csharp"><span style="color:#008000">//(服务端逻辑代码)</span>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> <span style="color:#a31515">Initialize</span>() {
<span style="color:#008000">//...</span>
  <span style="color:#0000ff">this</span>.rapidServerEngine.MessageReceived += <span style="color:#0000ff">new</span> ESBasic.CbGeneric<<span style="color:#0000ff">string</span>,ClientType, <span style="color:#0000ff">int</span>, <span style="color:#0000ff">byte</span>[], <span style="color:#0000ff">string</span>>(rapidServerEngine_MessageReceived);
<span style="color:#008000">//...</span>
}
</code></span></span>

客户端发送消息会触发 rapid服务端引擎 上的 MessageReceived 事件,最终程序流程会来到如下图的地方。

根据客户端传递在消息号来匹配对应的 if分支,然后进行对应的处理。

2. 全局缓存

此部分的代码位于 GGTalk/TalkBase/Server/Core/ServerGlobalCache.cs

接着前面修改用户信息的例子:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-csharp"><span style="color:#0000ff">if</span> (informationType == <span style="color:#0000ff">this</span>.talkBaseInfoTypes.ChangeMyBaseInfo) {
<span style="color:#008000">//...</span>
  <span style="color:#0000ff">this</span>.serverGlobalCache.UpdateUserInfo(sourceUserID, contract.Name, contract.Signature, contract.OrgID);
  TUser user = <span style="color:#0000ff">this</span>.serverGlobalCache.GetUser(sourceUserID);
<span style="color:#008000">//...</span>
}
</code></span></span>

消息处理后会来到如上 if分支,其中分别调用了 serverGlobalCache 上的 UpdateUserInfo 和 GetUser 方法,下面是这两个方法的具体实现。

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-csharp"><span style="color:#008000"><span style="color:#808080">///</span> <span style="color:#808080"><summary></span></span>
<span style="color:#008000"><span style="color:#808080">///</span> 获取目标用户,如果缓存
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<p>GGTalk是QQ的高仿版,包括客户端和服务端,可在广域网部署使用,目前最新版本为4.3。我想写一个类似汇总的文章,通过这篇文章,大家可以了解到GG的全貌和最新进展,以及关于一些常见问题的解答也汇总在这里。</p><p>言归正传,对我个人而言,我的目标并不是做一个QQ高仿版的玩具,而是希望做成一个能够真正使用的产品(这个过程还有很长的路要走),并持续维护下去。</p><p> </p><p>一.已实现的功能</p><p>(01)注册、登录、添加好友、好友列表。</p><p>(02)自拍头像。</p><p>(03)文字聊天、字体设置、GIF动态表情、窗口震动、截图、手写板、登录状态(在线、离开、忙碌、勿打扰、隐身)、输入提醒</p><p>(04)群功能:创建群、加入群、退出群、群聊天</p><p>(05)文件传送、文件夹传送(支持断点续传)</p><p>(06)语音视频聊天</p><p>(07)远程磁盘</p><p>(08)远程协助</p><p>(09)共享桌面(可以指定要共享的桌面区域)</p><p>(10)可靠的P2P</p><p>(11)网盘   </p><p>(12)离线消息</p><p>(13)离线文件</p><p>(14)托盘闪动:跟QQ完全一样,当接收到消息时,托盘会闪动对应好友的头像。点击头像,将弹出与好友的聊天框。</p><p>(15)最近联系人列表</p><p>(16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。</p><p>(17)聊天记录:支持本地保存和服务器端保存两种方式。</p><p>(18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。</p><p>(19)打开聊天窗口时,自动显示上次交谈的最后一句话。</p><p>(20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入”的提示。</p><p>(21)自动记录:GG2014会自动记录上次打开的主界面的位置、大小;最后一次打开的聊天窗口的大小;最后一次设定的字体的颜色、大小等。 </p><p>(22)主窗体靠边自动隐藏。</p><p>(23)录制视频聊天。</p><p> </p><p>二.后续待实现的功能</p><p>(1)增加持久化支持</p><p>(2)视频会议</p><p> </p><p>三.GGTalk开发环境</p><p>开发环境:VS2010 ,开发语言:C#, .NET Framework 版本: 2.0 </p><p>部署客户端时,客户端机器还需要安装VC++2008 runtime、VC++2010 runtime。</p><p> </p><p>四.GGTalk相关说明</p><p>1.如果要将GG部署到广域网,则可以在服务端的配置文件中设置监听的端口;而在客户端的配置文件中,则可以指定服务器的IP和Port。</p><p>2.虚拟数据库</p><p>(1)为了部署测试更简单,GG没有采用真实的物理数据库,而是在内存中虚拟了一个数据库(即服务端的VirtualDB类),用于存储用户注册信息、好友关系、群信息等。</p><p>(2)GG内置了几个用户:10000、10001、10002、10003,它们的登录密码都是"1"。</p><p>(3)GG内置的这几个用户之间都是好友关系。</p><p>(4)GG内置了两个群:G001、G002。G001群包含所有内置测试用户,G002群包含10000和10001两个用户。</p><p>(5)上述的这些内置信息,在VirtualDB类的构造函数中设定。</p><p>3.麦克风、摄像头的选择可在客户端系统设置窗口(SystemSettingForm)中指定。</p><p>4.语音视频:也有很多朋友问语音视频设备的工作怎么不正常,或者语音视频不流畅,这个可以直接参考OMCS官方文档:摄像头、麦克风、扬声器、设备测试 、带宽要求。</p><p>5.特别说明一下:GG项目中,只要是我写的代码,全部都放出来了。拜托喜欢每一个dll都有源码的朋友不要再问我要其它的源码了:) </p>
GG即时通讯系统GGTalk,包括客户端、服务端数据库,可在广域网部署使用。支持:文字/语音/视频聊天,文件传送,离线文件,离线消息,视频会议,性能稳定,绝不是一个玩具或demo。GG即时通讯系统GGTalk 6.2 源码版 更新日志:2019-01-03PC版修复bug:更新组成员时,没有更新组的version;修复MySQL分页错误,以及查询聊天记录错误;Android版:增加好友在线状态、群聊等功能。已实现的功能:(01)注册、登录、查找用户、添加好友、好友列表。(02)自拍头像。(03)文字聊天、字体设置、GIF动态表情、窗口震动、截图、手写板、登录状态(在线、离开、忙碌、勿打扰、隐身)、输入提醒(04)群功能:创建群、加入群、退出群、群聊天(05)文件传送、文件夹传送(支持断点续传)(06)语音视频聊天(07)远程磁盘(08)远程协助(09)共享桌面(可以指定要共享的桌面区域)(10)可靠的P2P(11)网盘   (12)离线消息(13)离线文件(14)托盘闪动:跟QQ完全一样,当接收到消息时,托盘会闪动对应好友的头像。点击头像,将弹出与好友的聊天框。(15)最近联系人列表(16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。(17)聊天记录:支持本地保存和服务器端保存两种方式。(18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。(19)打开聊天窗口时,自动显示上次交谈的最后一句话。(20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入”的提示。(21)自动记录:GG2014会自动记录上次打开的主界面的位置、大小;最后一次打开的聊天窗口的大小;最后一次设定的字体的颜色、大小等。 (22)主窗体靠边自动隐藏。(23)录制视频聊天。(24)支持数据库(SqlServer2000/2005/2008),并可以通过配置在真实数据库和虚拟数据库之间自由切换。 (25)语音视频设备测试   (26)聊天消息加密
GG即时通讯系统GGTalk,包括客户端、服务端数据库,可在广域网部署使用。支持:文字/语音/视频聊天,文件传送,离线文件,离线消息,视频会议,性能稳定,绝不是一个玩具或demo。GG即时通讯系统GGTalk 7.0 源码版 更新日志:2020-09-30全新的服务端+PC端+Android端,Android端功能基本已经完整。已实现的功能:(01)注册、登录、查找用户、添加好友、好友列表。(02)自拍头像。(03)文字聊天、字体设置、GIF动态表情、窗口震动、截图、手写板、登录状态(在线、离开、忙碌、勿打扰、隐身)、输入提醒(04)群功能:创建群、加入群、退出群、群聊天(05)文件传送、文件夹传送(支持断点续传)(06)语音视频聊天(07)远程磁盘(08)远程协助(09)共享桌面(可以指定要共享的桌面区域)(10)可靠的P2P(11)网盘   (12)离线消息(13)离线文件(14)托盘闪动:跟QQ完全一样,当接收到消息时,托盘会闪动对应好友的头像。点击头像,将弹出与好友的聊天框。(15)最近联系人列表(16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时关闭程序还是隐藏窗口。(17)聊天记录:支持本地保存和服务器端保存两种方式。(18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。(19)打开聊天窗口时,自动显示上次交谈的最后一句话。(20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方“正在输入”的提示。(21)自动记录:GG2014会自动记录上次打开的主界面的位置、大小;最后一次打开的聊天窗口的大小;最后一次设定的字体的颜色、大小等。 (22)主窗体靠边自动隐藏。(23)录制视频聊天。(24)支持数据库(SqlServer2000/2005/2008),并可以通过配置在真实数据库和虚拟数据库之间自由切换。 (25)语音视频设备测试   (26)聊天消息加密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值