1.项目中使用的是每5分钟向接口发包,激活用户。
//用户在线激活
public function user_activate(){
$code = $this->param['code'];
$redis = new \myredis\Datasource();
$myredis = $redis::getRedis('instance1');
if(!$myredis->hexists('code',$code)) $this->getBackTo('请重新登录',1,'');
$userid = json_decode($myredis->hget('code',$code),true);
$userid = $userid['userid'];
$myredis->zadd('online',time(),$userid);
$this->getBackTo('激活成功',0);
}
查询redis里online集合中5分钟之内的数据
//统计在线人数
public function online_sum(){ //根据时间统计
$expire = isset($this->param['expire'])?$this->param['expire']:300;
$redis = new \myredis\Datasource();
$myredis = $redis::getRedis('instance1');
$data = $myredis -> zcount('online',time()-$expire,time());//统计时间段内的人数
$data = $data?$data:0;
$this->getBackTo('获取成功',0,$data);
}
2.统计活跃度
第一步数据准备
$cache = "active:2019-03-01";
$userid = 102035;
$redis = new \myredis\Datasource();
$myredis = $redis::getRedis('instance1');
$myredis->setbit($cache,$userid,1); //将用户id以二进制方式存入redis,性能更好
接着拿取redis数据
//查询最近$nums天的日期
public static function get_weeks($time = '',$nums=7, $format='Y-m-d'){
$time = $time != '' ? $time : time();
//组合数据
$date = [];
for ($i=1; $i<=$nums; $i++){
$date[$i] = 'active:'.date($format ,strtotime( '+' . $i-$nums .' days', $time));
}
return $date;
}
//查询最近七天的活跃度
public function get_activebydays(){
$days = isset($this->param['days'])?intval($this->param['days']):7;
$redis = new \myredis\Datasource();
$myredis = $redis::getRedis('instance1');
$res = self::get_weeks(time(),$days); //最近7天
$nums = 0;
foreach ($res as $k=>$v){
$nums += $myredis->bitcount($v); //查询每天的数量,累加
}
$this->getBackTo('获取成功',0,$nums);
}