在现如今电商盛行的时期,会出现很多促销活动,最为常见的就是秒杀。在秒杀系统中最为常见的问题就是会出现超卖的情况,那么如何来杜绝超卖的情形了,在业务逻辑层面可以使用缓存以及加锁的手法来避免超卖的情形。
现如今nosql已经非常流行和稳定了,在此我将通过redis和php来说明如何实现锁机制。当然我使用redis加锁并不是我的秒杀系统,而是最近做的一个项目有个用户提现,初期没有考虑到会有人恶意刷新接口,而导致用户无限制提现。经过查看nginx日志,发现用户在同一时间段,通过刷接口的方法超额提现,导致亏损
起初的提现代码如下:
$uid = $this->user_id;if (empty($uid)) {return $this->responseJson(300, '请先登录');
}$money = $this->request->get('money', 'trim');$formId = $this->request->get('formId', 'trim', '');$user_model = newUser();$user_info = $user_model->getUserInfoById($uid);$balance = $user_info['balance'] / 100;$phone = $this->request->get('phone', 'trim');if ($money < 1) {return $this->responseJson(300, '最小提现金额为1元');
}if ($balance < $money) {return $this->responseJson(300, '账户余额不足');
}$openid = $user_info['openId'];if (in_array($openid, ['oMl_x0DiSCYqQuqJOKV9bAqR1Ugk', 'oMl_x0B1zoY70dbiwxAt4lg2fmL4', 'oMl_x0E0jYOK6NpbzwmTVJowpfpk', 'oMl_x0GHeAdKCZ8Iv1KD0CmdZLQ0', 'oMl_x0FBU1eWya1fG5xtVxryUYG4', 'oMl_x0CIMr5tItEy1QPtpI9eFJak', 'oMl_x0JWFdGOnf80W5oZOX-XfGcw'])) {return $this->responseJson(300, '正在处理中');
}if (!empty($phone)) {if (!isset(