我有1张表保存在线用户.
用户登录的时候会插入进表中,有一个字段记录插入的时间.
我希望转储过程能再记录插入25秒后删除这条记录.
而用户每20秒会发个消息过来表示他在线.
那么删除操作又推迟25秒...
比如 用户9:00:00 登录插入表.这条记录应该在9:00:25删除
但是因为用户20秒后发了信息表示其在线,那么 更新记录 为9:00:20,那么这条记录就应该在9:00:45删除。
也就是说如果用户每20秒发个信息表示在线,那么表中就有他的记录.如果25秒后都没收到他消息则把记录删除表示其不在线...
我对数据库不熟悉....但是我想这个放在数据库处理比放在程序里处理要好得多吧.....
希望大家帮帮我....这个表中的每条记录都是这样子...

解决方案 »

  1.   

    一般不这么设计。你可以用一张表 在线用户 (uid, refresTime)
    然后用户每 20s 刷新一次。 
    insert into 在线用户 values (123,now()) ON DUPLICATE KEY UPDATE refresTime=now();这样,你只需要通过查询 select uid,refresTime<DATE_ADD(now(),INTERVAL -20 SECOND) as isActive from 在线用户 
    就行了。
      

  2.   

    你的方法和1楼的方案比,反而多了一个每20s 的删除。反而负担重!1 楼的方法,
    你的程序只要负责每20s 
    insert into 在线用户 values (123,now()) ON DUPLICATE KEY UPDATE refresTime=now();
     就行了。其它什么都不用管。
      

  3.   

    用户不在线了我要从表里删除啊,而且如果有上万人在线的话...我程序负责每20S进行处理...用单线程肯定不行(比如用户在19S时发的消息到达,但是因为处理速度原因,那么可能导致到21S或则22S才进行处理...这样就会认为他下线了...这不是想要的)如果是多线程的话...当用户越多开的线程越多.....开销大了
    所以我希望能让数据库自己维护....(我不希望让单独的一个线程来维护1个用户是否在线...因为用户不会是同时登陆...那么就需要1个线程一直维护一个用户....天啊 开销太大了)
    你的语句意思是 先查询,如果有就更新,否则插入对吧?
    我是这样的:
    用户通过登录程序登录成功->插入在线表(想弄个触发器,当插入时自己加入当前时间).(插入操作只能通过登录程序进行).
    然后用户每20秒发个消息过来(如果不能让数据库自己维护的话,那么只能创建线程了),创建一个线程,先查询,不在则认为处于不在线状态,需要重新登录.如果存在则取当前时间和字段的时间进行比较,超过20秒 删除记录.(认为离线了,用户必须重新登录才能插入进来).存在并且没超过20秒就更新.
      

  4.   


    不是。
    insert into 在线用户 values (123,now()) ON DUPLICATE KEY UPDATE refresTime=now();