一、 防止惡意刷單解決
在生產場景下,可能會有一些人會惡意訪問當前網站,來進行惡意的刷單。這樣會造成當前系統出現一些業務上的業務混亂,出現臟數據,或者造成后端訪問壓力大等問題。
一般要解決這個問題的話,前端可以進行控制,如點一次立即搶購后,置灰立即搶購按鈕。同時對于后端來說也需要進行控制。后端實現可以通過Redis incrde 原子性遞增來進行解決。
實現思路:
獲取登錄人名稱和商品ID,自定義RedisKey,用戶第一次訪問放行,并對當前Key設置一個5分鐘的有效期,用戶在 5分鐘內不能重復訪問。
步驟一: 更新秒殺服務下單方法
更新秒殺服務下單方法,防止惡意刷單。
步驟二: 防重方法實現
//防止重復提交
private String preventRepeatCommit(String username,Long id) {
?String redisKey = "seckill_user_" + username+"_id_"+id;long count = redisTemplate.opsForValue().increment(redisKey, 1);if (count == 1){//設置有效期五分鐘redisTemplate.expire(redisKey, 5, TimeUnit.MINUTES);return "success";}
?if (count>1){return "fail";}
?return "fail";
?
}
二、 防止相同商品重復秒殺
防止同一個人,對于相同商品的重復秒殺。項目的需求是:同一個人對于相同的商品只能買一次。并且每次只能買一個。
實現思路:
當用戶購買完商品之后,會在秒殺訂單表中產生一條記錄,這條記錄里包含當前購買的商品ID,以及當前的用戶名稱。現在明確了每一個
訂單中都有這兩個信息的話,我們需要完成防止同一個人對于同一個商品的重復秒殺。只需要根據秒殺ID和秒殺商品ID來查詢秒殺訂單表
,如果里面有相關數據的話,代表用戶下過單,就不讓用戶下單了,如果沒有的話再來完成下單流程。
步驟一: 修改下單業務層實現
判斷用戶是否已經購買過該商品。
步驟二: dao層新增查詢方法
public interface SeckillOrderMapper extends Mapper<SeckillOrder> {
?/*** 查詢秒殺訂單信息* @param username* @param id* @return*/@Select("select * from tb_seckill_order where user_id=#{username} and seckill_id=#{id}")SeckillOrder getSecKillOrderByUserNameAndGoodsId(String username, Long id);
}