我写的一个统计在线人数的类,请大家进来讨论一下效率(来者有分)

c_crazyren 2003-08-05 01:53:51
package com.hnedu.stat;
/**
* 计算在线人数,说明:
*
* 在访问页面放入:
* com.hnedu.stat.OnlineCounter.addUser(Object object)
* 一般用ip来作为object的传入值,当然,如果网站统计登陆在线人数,也可用用户名
* 来作为object传入值。
*
* 调用显示在线人数
* com.hnedu.stat.OnlineCounter.getOnlineCount() *
*
* com.hnedu.stat.OnlineCounter.getOnline()
* 返回一个List,里面以String[]形式存放传入的object值和最后访问页面时间。
* by crazyren 2003-08-05 email: c_crazyren@hotmail.com
*/
import java.util.List;
import java.util.ArrayList;
import javax.servlet.http.HttpSession;
public class OnlineCounter {
//创建实例标记
public static boolean instanceFlag = false;
private static List list = new ArrayList();

private OnlineCounter() {
}
public static void addUser(Object object) {
//判断是否计数标志
boolean bool = true;
//得到用户当前访问时间
String nowtime = com.hnedu.util.StringUtils.getTime("mm:ss");
//Str数组用来存放用户得ip和访问时间
String[] str = new String[2];
str[0] = object.toString();
str[1] = nowtime;

//temp数组用来临时存放从list里面取出的用户ip和访问时间
String[] temp = new String[2];

//循环list
for (int i = 0; i < list.size(); i++) {
temp = (String[])list.get(i);
//如果从list里面取出的用户ip和str里面存放的ip相同,则更新访问时间
if(temp[0].equals(str[0])) {
list.set(i,str);
bool = false;
return;
}
//如果用户超过6分钟没有访问,则认为不在线
if(subTime(nowtime,temp[1]) > 300) {
list.remove(i);
}
}
if(bool) {
//添加一个新的在线用户
list.add(str);
}
//释放资源
str = null;temp = null;
}

public static int getOnlineCount() {
//返回当前在线人数
return list.size();
}

public static List getOnline() {
return list;
}

public void finalize() {
instanceFlag = false;
}
/** 计算两个时间差,返回相差秒数 */
private static int subTime(String src,String des) {
int n = 0;
java.util.Calendar ca = java.util.Calendar.getInstance();
long time1 =
compareStringTime(src,des,"mm:ss");
ca.setTimeInMillis(time1);
n = (ca.get(java.util.Calendar.MINUTE)) * 60;
n = n + ca.get(java.util.Calendar.SECOND);
return n;
}

/**
* 比较两个字符串时间的大小
* @param t1 时间1
* @param t2 时间2
* @param parrten 时间格式 :yyyy-MM-dd
* @return 返回long =0相等,>0 t1>t2,<0 t1<t2
*/
private static long compareStringTime(String t1, String t2, String parrten) {
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(parrten);
java.text.ParsePosition pos = new java.text.ParsePosition(0);
java.text.ParsePosition pos1 = new java.text.ParsePosition(0);
java.util.Date dt1 = formatter.parse(t1, pos);
java.util.Date dt2 = formatter.parse(t2, pos1);
long l = dt1.getTime() - dt2.getTime();
return l;
}


public static void main(String[] args) {

}

}
...全文
64 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
linprince 2004-03-09
  • 打赏
  • 举报
回复
好好学习。。。
qqbz 2004-03-09
  • 打赏
  • 举报
回复
主要把功能实现,至于效率,现在硬件发展这么快。。。。。。
到实际中去测试啊,关键看功能对否。
junxi 2004-03-09
  • 打赏
  • 举报
回复
学习!!~~~
TIANHEI 2004-03-09
  • 打赏
  • 举报
回复
学习
zhaolihhy 2004-03-09
  • 打赏
  • 举报
回复
引用“
你是不是用户每访问一个页面就调用addUser这个方法?
如果人多了,点击频繁的话
//循环list
for (int i = 0; i < list.size(); i++)
这个循环的开销挺大的~~
"
?????????
Eraserpro 2004-03-09
  • 打赏
  • 举报
回复
用Listener效率应该更高,而且更准确,因为每台浏览器进程在服务器上的SESSION是唯一的
aaronyes 2004-03-09
  • 打赏
  • 举报
回复
UP
jfmike 2004-03-09
  • 打赏
  • 举报
回复
不错,可以借鉴
kkcncry 2004-03-09
  • 打赏
  • 举报
回复
up`!
myxd 2004-03-09
  • 打赏
  • 举报
回复
还有可不可以用hashtable代替arraylist?

忘记thinking in java说的怎么用list和hashtable了!
wuyue-tiger 2004-03-09
  • 打赏
  • 举报
回复
何必这么麻烦用session listener可以方便实现这些功能,看我的例子
至于数据是否入库,看访问量和机器硬件指标决定

public class UserMonitor implements HttpSessionListener {

/** 用户 session 的列表 */
private static HashMap sessions = new HashMap();

public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
String id = session.getId();
sessions.put(id, event.getSession());
}

public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
String id = session.getId();
sessions.remove(id);
}

/**
* 得到所有已登录的用户的 session 信息
* @return 已登录的用户的 session 信息(key 为 sessionId, value 为 session)
*/
static public HashMap getUserSessions()
{
return sessions;
}

}
桃_花_仙 2004-03-09
  • 打赏
  • 举报
回复
up
myxd 2004-03-09
  • 打赏
  • 举报
回复
都加到list中会不会内存溢出
想一想日访问量3万。可需要不小的内存
说说。愿意挨骂!!!
zhujj81 2004-03-09
  • 打赏
  • 举报
回复
接分
lysk 2004-03-09
  • 打赏
  • 举报
回复
学习!顶
liuty2006 2003-08-20
  • 打赏
  • 举报
回复
up
sanck 2003-08-19
  • 打赏
  • 举报
回复
up
喝醉的咖啡 2003-08-15
  • 打赏
  • 举报
回复
对了,数据库负载不会很大的,我对SQLServer2000的效率还很满意,呵呵。
喝醉的咖啡 2003-08-15
  • 打赏
  • 举报
回复
c_crazyren(楚狂人)

我的目的和你稍微有些不同,但基本思路是一样的。
只不过换成了用数据库来实现比较简单一些。其实,你的类里面也判断过期时间。如果有工夫把你这个类扩展一下,分成几个不同的部分。

一个部分专门负责SessionList的维护,一个类访问(支持多种分布式访问方式)SessionList对List的内容进行分析形成应用(比如获取在线列表和验证SessionKey),这样即便不用数据库,而且也能实现跨站,这样就更强了,hoho

所以,我给你补充一下,不仅仅是统计在线人数,因为可以通过SessionKey反查,就形成了自己的 Session 机制,不依赖于 ApplicationServer(比如3.4万美刀一个CPU License的WebLogic Server Cluster)可以实现一些简单的负载“分流”,还可以把多个不容的应用组合在一个身分验证和统一Session系统里。




cbhyk 2003-08-15
  • 打赏
  • 举报
回复
对list的操作应该进行同步
加载更多回复(13)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧