专业IM即时通讯软件开发,值得信赖!

HashMap加双向链表构建IM系统会话列表内存模型

即时通讯软件开发 云聊IM 1480℃

IM系统都有一个会话列表页,如下图所示

当某个会话收到或者发送消息后,该会话会排到会话顶部。由于支持消息漫游,服务器端需要保存每个用户客户端的会话顺序。如何才能在海量消息收发的场景下,准确记录各个客户端的会话顺序呢?

可以采用一个类似LRU内存淘汰的算法来解决这个问题。采用HashMap与LinkList(链表)组合的方式(如下图)。

图中左边是一个Map结构,可以通过sessionid快速索引到具体session(会话)数据,session数据以链表形式存储(图中右边部分)。

当这个会话收到或者发送消息时,通过Map在O(1)的时间定位到具体会话数据,然后修改会话数据的链表指针,将此会话数据放到链表头部(top)。完成整个操作时间复杂度是常量,可视为O(1)级别。效率很高。

当其他设备拉取会话列表时,按照链表顺序,分批返回会话列表即可。

实际研发层面,考虑到数据持久化以及研发效率,可选用Redis的SortedSet结构,时间复杂度为O(lg N),N为会话数量。适当控制保存会话的数量,这个复杂度完全可以接受。

转自公众号:【普通程序员】

版权声明:部分文章、图片等内容为用户发布或互联网整理而来,仅供学习参考。如有侵犯您的版权,请联系我们,将立刻删除。
喜欢 (0)
仿微信聊天软件开发
点击这里给我发消息