redis统计APP在线人数

   最近有个需求,需要统计APP的在线人数,其实以前也统计过,采取的是上线发送一个请求$this->cache->incr()加1,下线的时候$this->cache->decr()减1,可是这样做的后果是,发现在线人数错的离谱,几千人同是在线。why?原来APP端如果卸载的时候,那么就不会发请求,还有如果非正常终止的时候,也不会发送下线请求?于是乎找一个准备的统计方式

1:客户端十分钟发送一次请求,带上序列号,服务器端set('前缀.序列号',过期时间),然后服务器端统计 keys 前缀*

    可是你看keys之后的数据格式:

    var_dump(); 

array (size=2)
  0 => string 'c_001dddddddddddddddddddddddddddddddd' (length=37)
  1 => string 'c_001ddddddddddddddddddddddddddddddddd' (length=38)
  print_r();

  Array( [0] => c_001dddddddddddddddddddddddddddddddd [1] => c_001ddddddddddddddddddddddddddddddddd)


    数据keys *之后数据格式乱糟糟的,不是数组,根本没有办法处理。也许可以把他看成一个文件,然后正则匹配,再出处理,可是这样有多慢呢,keys *本来就有些慢,还存入文件,正则匹配,然后循环,获取数组长度,就更加慢了。keys *之后出来是列表吧,更本不是数字,redis也没有这种获取某个特殊的键前缀的数量的函数。如果APP就一个的话,大家可以把这个键值存储到一个库里面,然后用dbsize()直接获取库数量,这个库不存储其他的键值。可是现在我要统计六个APP的在线情况,不可能一个APP存储一个库吧

2:利用序列,$date = date("Ymdh",time()); $this->_cache->sadd($date.$head,$client,7200); 获取当前时间,之后加上客户端类型前缀,作为键,存入序列,本次方法是一个小时存取一次,就是一个小时之内的都算在线人数,具体多久算在线人数,大家可以自我把握。

  存的时候:

    $date = date("Ymdh",time());

   $this->_cache->sadd($date.$head,$client,7200);//存入集合 1个小时存入一次

取数量的时候

            $date = date("Ymdh",time());//当前时间
            $hour = date("Ymdh",time()-3600);//上一个小时时间
            $score = date("i",time());//当前时间分数
            $datedata= $this->_cache->scard($date.$head);//这个小时数量
            $hourdata= $this->_cache->scard($hour.$head);//上个小时数量
            if($score == '00'){
                $online = $hourdata;//如果当前时间是整点,那么一个小时人数,就是上个小时人数
            }else{
                $online = intval(((60-$score)/60)*$hourdata)+ $datedata;//如果不是整点,那么计算当前多少分钟,当前的数量,加上上个小时比例数量  凑够一个小时数量
            }

             $online就是在线数量


你可能感兴趣的:(redis统计APP在线人数)