百度空间 | 百度首页 
               
 
查看文章
 
在线好友状态列表与数据结构(1)-list
2008-09-07 23:29
Presence and Data Structure - Part I

在一个典型的IM Server上,每个登录的用户都需要维护一份自己在线用户列表,需要频繁进行以下操作

iterate
循环与遍历,很多操作需要调用iterator

insert/delete
由于在线的好友随时会产生上下线的变化,所以需要增加或删除列表的内容。

lookup

同时由于列表的元素需要保持唯一性,insert时候也需要查找已有的元素是否存在。

同时还具有以下一些特性

长度
在线的好友列表不会太长,通常都是几十个。

规律

假如系统使用的是基于号码的数字账号,这些数字通常有一定程度集中性,比如很多系统活跃用户集中在最新的号码段。


对于一个这样的需求,我尝试去了解一下需要知道在已有的数据结构中哪一种数据结构是最适合的。

在以下及后续的评估中,主要是考虑时间复杂度,即程序性能,对空间复杂度关注较少。

1) Array/List

对于这样一个列表,最简单的做法就是用数组或list实现。这就是往往现在大部分程序员不懂数据结构也能写出正常执行的程序。`

但是,Array/List都存在查找慢的问题,频繁的增删性能很慢。

2) Linked List
Linked List解决了增删性能问题,是一种最常采用的做法,如下代码片断。但仍然存在查找慢的问题。


/**
* remove a jid from a list, returning the new list
*
* @param id the JabberID that should be removed
* @param ids the list of JabberIDs
* @return the new list
*/
static jid _mod_presence_whack(jid id, jid ids) {
    jid curr;

    if (id == NULL || ids == NULL)
    return NULL;

    /* check first */
    if (jid_cmp(id,ids) == 0)
    return ids->next;

    /* check through the list, stopping at the previous list entry to a matching one */
    for (curr = ids; curr != NULL; curr = curr->next) {
    if (jid_cmp(curr->next, id) == 0)
        break;
    }

    /* clip it out if found */
    if(curr != NULL)
        curr->next = curr->next->next;

    return ids;
}
(Jabberd 1.4 更新好友列表的代码, mod_presence.cc)

(待续: 在线好友列表与数据结构(2) - Radix Tree)

类别:编程 | 添加到搜藏 | 浏览() | 评论 (5)
 
最近读者:
 
网友评论:
1
2008-09-08 02:10 | 回复
关注中……
 
2
2008-09-08 09:50 | 回复
请教一个问题,如果照你的这种说法,当用户状态改变的时候怎么去通知多人聊天时成员的状态,还有在群组中成员的状态?如果全部放到一个集合里面,会不会这个集合就会比较的大
 
3
2008-09-08 20:28 | 回复
通常的做法:群组和多人聊天在这个列表中相当一个普通用户。这个伪用户(通常是另外一个服务)收到用户状态改变的通知后自行再向群组其他成员通知。
 
4
2008-09-09 23:58 | 回复
Jabber的疑问 Server To Server如何认证 如何防止骚扰、垃圾消息 Jabber的问题 Server的运营成本太高,而性能太低,造成没有多少Jabber Service 即使同一个Service,同时在线能达到多少
 
5
2008-09-10 15:56 | 回复
请教一个问题: jabber里面如何加入文件传输功能,类似如客户端的自动更新
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu