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;
}