• 在线列表类一 dodo


    我们知道在后台管理系统中如何限制用户重复登陆是个讨论不觉的问题。一些人刚开始说在数据库里设置一个标志,当同样用户登录的时候就提示已经重复登陆,但是这里存在一个问题就是如果用户突然非法关机,那么其他的用户将永远无法登录。因此,这里要考虑两种情况,一个是用户已经登录的情况下,在有其他的用户用相同的帐号密码登录的时候可以让其他用户强制之前一个用户下线,这个很符合逻辑,既然都知道用户名和密码,那么系统就没办法判断到底哪个登录的是对的。因此,系统有权让知道密码的用户都可以登录系统。第二个还要防止用户非法关机之类的,一旦用户关机后,我们应该设置一个定时器,当然这个时间由我们自己来定义一个合理的时间,然后让服务器每到指定的时间就触发这个事件。不断的判断在线的用户列表中的用户是否已经达到指定的时间没有操作,如果是的话就把用户从在线列表中清除,让用户重新登陆。我觉得这样的设计比较合理,如果有更好的可以给我留言。

        根据这样的需求,我们就定义个管理用户的系统类,它具有用户ID,用户名,开始时间,最后操作时间,最后操作网址,用户类型,在线时间,还有IP。定义完后,我们就需要定义一个来存储这些信息的集合。系统里是定义一个缓存辞典来存储这些信息。一共定义了2个辞典和一个双向链表。第一个是 Dictionary<string, LinkedListNode<TValue>> _MemberUserList;用来存储所有的会员信息。Dictionary<TKey, LinkedListNode<TValue>> _AllUserList;定义所有的信息,包括会员和游客。在定义一个 LinkedList<TValue> _TValueLink;双向链表进行排序。因为,我们要对链表进行增删改,来达到不断维护在线链表的功能,因此,必须定义一个锁,来限制同一个时间只能对在线列表进行读或者写操作,因此系统中定义了一个 protected ReaderWriterLock _CacheDataRwl = new ReaderWriterLock();锁。接下来就是要定义一个时间,前一篇我已经提到过的system.time.timer类来时间,让它根据指定的时间不断的触发事件。这里的事件就是不断的清除那些已经过期的用户。当然这个类的功能还不限于此,既然可以删除过期用户,当然要具有可以添加新的用户,和更新新的用户的功能。因此,这个类中重载了多种删除的方法。可以根据用户给定的键值也就是key来删除,也可以通过name属性来删除,因此这里要求,name和key一样都具有唯一性。不过在删除和增加的时候都要加锁。判断用户是否长时间都没有操作的方法很简单,只要把用户最后操作时间和当前时间进行判断,如果操作系统指定时间则说明超时,当然,这样也要求用户每访问一个页面的时候都要更新最后操作的时间。

         当然也可以把用户信息存在表中,其实方法大同小异,一个是放在内存中,一个放在数据库中,一个访问快点但是占用内存,另外一个速度慢点每次都要去连接数据库,但是可以存储大量的数据,因此可以满足有大量用户在线的需求。

  • 相关阅读:
    poj 3767 I Wanna Go Home (有限制的最短路)
    gcd及扩展gcd
    2012 多校联合比赛第二场
    大整数 问题
    从数据流动看数据结构
    vc/vs常用快捷键
    函数重载
    mysql相关
    xml理解
    编译相关
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/1804795.html
Copyright © 2020-2023  润新知