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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!