问题:
活动描述:有一个签到活动,就是用户每天只能签到一次, 签到后并发放奖励,就是因为会发放奖励
所以导致活动,有好多人开挂来刷这个活动,导致有些人,一天领取多个奖励的现象,
php代码逻辑:部门一个同事php代码逻辑是这样的,签到用redis来记录是否签到,签到成功就发奖励
逻辑顺序是:先判断是否满足签到条件,然后发奖再签到。
解决:
redis排查:直接用php代码模拟测试出问题所在,发现很怪异,redis对象能new成功,但是一执行connect
方法时就出现对象不存在的现象,而且不抛出异常,php代码不抛出错误,问题是redis负载的问题,导致连
接数被占满所致,解决方法就是,增加redis机器,并增加监控,重启原有的redis,redis出问题,估计是被刷
所致。
php代码逻辑排查:发现逻辑顺序有问题,应当是先要签到然后在发奖,这样才能防止住并发,这里可以用两个
概念来解释一下,被刷的代码采用的是乐观锁说机制,我们redis就相当于锁了,不是在代码一执行就开始锁住
而是把代码看的太乐观了,后来改成了悲观锁机制,问题就得到了解决,一开始就锁住,然后就去执行下面发奖
流程,这样的就不会多发了。
时间: 2024-11-05 16:02:40