问一下大家,签到超出前十名额外奖励积分的问题

        //今天签到排名
        $today_ranking = Sign::query()->where('sign_date', '=', $sign_date)->count();
        if ($today_ranking < 10) {
            //签到前十名增加额外的积分
            $extra_point = rand(4, 6);
        }
        $today_ranking = (int)$today_ranking + 1;
        dd($today_ranking);

如果同时很多人签到,如何避免超出十个人还奖励额外的积分?是不是要在数据库增加一个记录签到前十的字段?希望大家给一点思路,谢谢~

什么时候开始都不晚,学到老
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

利用 redis 锁

$lock = Cache::lock('sign_count_lock', 10);
if ($lock->get()) {
    // 今天签到排名
    $today_ranking = Cache::remember('sign_count', Carbon::tomorrow()->subSecond(), fn() => 0);
    if ($today_ranking < 10) {
        Cache::increment('sign_count');
        // 签到前十名增加额外的积分
        $extra_point = rand(4, 6);
    }
    $lock->release();
}
2年前 评论
haodudecao (作者) 2年前
芝麻开门 (楼主) 2年前
芝麻开门 (楼主) 2年前
讨论数量: 1

利用 redis 锁

$lock = Cache::lock('sign_count_lock', 10);
if ($lock->get()) {
    // 今天签到排名
    $today_ranking = Cache::remember('sign_count', Carbon::tomorrow()->subSecond(), fn() => 0);
    if ($today_ranking < 10) {
        Cache::increment('sign_count');
        // 签到前十名增加额外的积分
        $extra_point = rand(4, 6);
    }
    $lock->release();
}
2年前 评论
haodudecao (作者) 2年前
芝麻开门 (楼主) 2年前
芝麻开门 (楼主) 2年前

利用 redis 锁

$lock = Cache::lock('sign_count_lock', 10);
if ($lock->get()) {
    // 今天签到排名
    $today_ranking = Cache::remember('sign_count', Carbon::tomorrow()->subSecond(), fn() => 0);
    if ($today_ranking < 10) {
        Cache::increment('sign_count');
        // 签到前十名增加额外的积分
        $extra_point = rand(4, 6);
    }
    $lock->release();
}
2年前 评论
haodudecao (作者) 2年前
芝麻开门 (楼主) 2年前
芝麻开门 (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!