redis 连续签到功能

redis实现方案
使用bitmap来实现,bitmap是redis 2.2版本开始支持的功能,一般用于标识状态,

另外 ,用bitmap进行当天有多少人签到非常的方便,使用bitcount

$count = 0;
$count = Redis::BITCOUNT($key);
设置两个bitmap ,

一个以每天日期为key ,每个uid为偏移量

一个以用户uid为key ,当天在一年中的索引为偏移量,

这样记录一个用户一年的签到情况仅需要365*1bit

代码如下:

// 以下是签到代码
public function sigIn(Request $request){
  $uid =$request->input('uid');
  // dd($uid);
  $redis = Redis::connection(); //返回redis链接实例,可以操作所有redis原生命令
  //每天一个key
  $key = 'checkin_' . date('ymd');
  if($redis->getbit($key, $uid))
  {
    //已签到
    return json_encode(['code' => 0, 'msg' => '已签到成功']);
  }else{
    //签到
    $redis->setbit($key, $uid, 1);
    $redis->setbit('checkin_'.$uid, date('d'), 1);
  }
}
//以下是用户连续签到计算
public static function getUserCheckinCount(){
  $uid = 1;
  $redis = Redis::connection();
  $key = 'checkin_'.$uid;
  $index = date('N');
  // dd(date('N'));
  $n = 0;
  for($i = $index; $i>=0;$i--)
  {
    $bit = $redis->getbit($key, $i);
    if($bit == 0) break;
    $n++;
  }
    return $n;
}
//以下是计算一天签到用户数
public function total(){
  $key = 'checkin_' . date('ymd');
  $redis = Redis::connection();
  $count = $redis->BITCOUNT($key);
  return $count;
}

posted @ 2022-09-27 17:00  飞鹰之歌  阅读(195)  评论(0编辑  收藏  举报