全部
常见问题
产品动态
精选推荐

抽奖时如果频繁点击会多次请求的解决方法。

管理 管理 编辑 删除

在给客户做二开的时候增加了一个抽奖类型,最后客户发现如果频繁点击理解请求会出现多次请求的实际返回一个的中奖信息问题,经过排查测试发现原本程序的积分抽奖功能也存在,然后做了一下优化,增加了一个锁进行限制,然后发现解决问题了。

440d3202412121558206055.png

解决方法:

1.修改app/services/activity/lottery/LuckLotteryServices.php 文件中的    public function luckLottery(int $uid, int $lottery_id)  方法代码,增加如下代码:


        // 使用更严格的锁机制
        $lockKey = 'lottery_lock_' . $uid . '_' . $lottery_id;
        $cache = CacheService::redisHandler();
        
        // 增加日志,记录请求信息
        Log::info('开始抽奖,检查锁', [
            'uid' => $uid,
            'lottery_id' => $lottery_id,
            'lockKey' => $lockKey,
            'exists' => $cache->get($lockKey),
            'time' => date('Y-m-d H:i:s'),
            'request_id' => uniqid()
        ]);

        // 先尝试设置锁
        $isLocked = $cache->setnx($lockKey, 1);
        
        // 如果设置失败,说明锁已存在
        if (!$isLocked) {
            Log::info('抽奖锁已存在,禁止重复抽奖', [
                'uid' => $uid,
                'lottery_id' => $lottery_id,
                'time' => date('Y-m-d H:i:s'),
                'request_id' => uniqid()
            ]);
            throw new ValidateException('抽奖处理中,请勿重复点击');
        }
        
        // 设置成功后设置过期时间
        $cache->expire($lockKey, 120);
        
        try {
        
        
        
        
        } catch (\Exception $e) {
            $cache->delete($lockKey);
            throw $e;
        } finally {
            // 释放锁前记录日志
            Log::info('抽奖完成,释放锁', [
                'uid' => $uid,
                'lottery_id' => $lottery_id,
                'exists' => $cache->get($lockKey),
                'time' => date('Y-m-d H:i:s'),
                'request_id' => uniqid()
            ]);
            $cache->delete($lockKey);
        }

3e118202412121600464808.png

7380c202412121601094802.png

自己看这截图 及代码 自己修改,当然我不确定其他版本有这个问题,我这边客户使用的是3.0.1版本。

修改完以后记得重启swoole,并且代码如果正常生效会输出出来响应的日志如:

[2024-12-12T15:41:28+08:00][info] 开始抽奖,检查锁

[2024-12-12T15:41:28+08:00][info] 抽奖锁已存在,禁止重复抽奖

[2024-12-12T15:41:32+08:00][info] 开始抽奖,检查锁

[2024-12-12T15:41:32+08:00][info] 抽奖锁已存在,禁止重复抽奖

[2024-12-12T15:41:37+08:00][info] 开始抽奖,检查锁

[2024-12-12T15:41:37+08:00][info] 抽奖锁已存在,禁止重复抽奖

[2024-12-12T15:42:11+08:00][info] 开始抽奖,检查锁

[2024-12-12T15:42:11+08:00][info] 抽奖锁已存在,禁止重复抽奖

[2024-12-12T15:45:39+08:00][info] 开始抽奖,检查锁

[2024-12-12T15:45:39+08:00][info] 抽奖完成,释放锁

请登录后查看

Xiao伟 最后编辑于2024-12-12 16:03:54

快捷回复
回复
回复
回复({{post_count}}) {{!is_user ? '我的回复' :'全部回复'}}
排序 默认正序 回复倒序 点赞倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level }}

作者 管理员 企业

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推荐': '推荐'}}
{{item.is_suggest == 1? '取消推荐': '推荐'}}
沙发 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暂无简介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
{{item.like_count}}
{{item.showReply ? '取消回复' : '回复'}}
删除
回复
回复

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回复 {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回复' : '回复'}}
删除
回复
回复
查看更多
146
{{like_count}}
{{collect_count}}
添加回复 ({{post_count}})

相关推荐

快速安全登录

使用微信扫码登录
{{item.label}} 加精
{{item.label}} {{item.label}} 板块推荐 常见问题 产品动态 精选推荐 首页头条 首页动态 首页推荐
取 消 确 定
回复
回复
问题:
问题自动获取的帖子内容,不准确时需要手动修改. [获取答案]
答案:
提交
bug 需求 取 消 确 定

微信登录/注册

切换手机号登录

{{ bind_phone ? '绑定手机' : '手机登录'}}

{{codeText}}
切换微信登录/注册
暂不绑定
CRMEB客服

CRMEB咨询热线 咨询热线

400-8888-794

微信扫码咨询

CRMEB开源商城下载 源码下载 CRMEB帮助文档 帮助文档
返回顶部 返回顶部
CRMEB客服