當前位置:網站首頁>【Redis實現秒殺業務①】秒殺流程概述|基本業務實現
【Redis實現秒殺業務①】秒殺流程概述|基本業務實現
2022-06-24 09:05:07【步爾斯特】
小夥伴們,從今天開始,我們一起用Redis來實現秒殺業務,要一起加油啊!
我們大概的思路就是設計一個水果秒殺小項目。
首先我們會有一種水果,該水果擁有名字、數量、搶購開始時間和搶購結束時間。
業務流程
- 秒殺是否開始或結束,如果尚未開始或已經結束則無法下單
- 庫存是否充足,不足則無法下單
水果實體類
/** * 水果 * * @author issavior */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Fruits implements Serializable {
private static final long serialVersionUID = 1;
private Long id;
private String name;
private Integer count;
private Date startTime;
private Date endTime;
}
新增水果
Controller
/** * @author issavior */
@RestController
@RequestMapping("/seckill")
public class SeckillController {
@Autowired
private SeckillService seckillService;
/** * 新增水果 * @param fruits 水果 * @return ResponseEntity<Object> */
@PostMapping
public ResponseEntity<Object> insertFruits(@RequestBody Fruits fruits) {
return seckillService.insertFruits(fruits);
}
}
ServiceImpl
/** * @author issavior */
@Service
public class SeckillServiceImpl implements SeckillService {
@Autowired
private SeckillMapper seckillMapper;
@Autowired
private RedisIdWorker redisIdWorker;
/** * 新增水果 * * @param fruits 新增的水果數據 * @return ResponseEntity<Object> */
@Override
public ResponseEntity<Object> insertFruits(Fruits fruits) {
// 全局唯一ID工具類,詳情可見系列文章上一篇
long id = redisIdWorker.nextId("seckill:fruits");
fruits.setId(id);
int successFlag = seckillMapper.insertFruits(fruits);
if (successFlag == 0) {
return ResponseEntity.status(400).body("新增失敗");
}
return ResponseEntity.ok("新增成功");
}
}
秒殺業務基本實現
/** * 搶購水果 * * @param id 搶購水果的主鍵ID * @return ResponseEntity<Object> */
@PostMapping("/{id}")
public ResponseEntity<Object> seckillFruits(@PathVariable("id") Long id) {
return seckillService.seckillFruits(id);
}
/** * 搶購水果 * * @param id 搶購水果的ID * @return ResponseEntity<Object> */
@Override
public ResponseEntity<Object> seckillFruits(Long id) {
Fruits fruits = seckillMapper.selectFruits(id);
if (fruits == null) {
return ResponseEntity.status(400).body("水果賣光了,下次再來吧!");
}
LocalDateTime startTime = fruits.getStartTime();
LocalDateTime endTime = fruits.getEndTime();
Integer count = fruits.getCount();
if (startTime.isAfter(LocalDateTime.now())) {
return ResponseEntity.status(400).body("活動還沒開始,去步爾斯特的主頁看看吧!!");
}
if (endTime.isBefore(LocalDateTime.now())) {
return ResponseEntity.status(400).body("活動已經結束了,去步爾斯特的主頁看看吧!!");
}
if (count < 1) {
return ResponseEntity.status(400).body("沒有庫存了,去步爾斯特的主頁看看吧!!");
}
int updateFruits = seckillMapper.updateFruits(id);
if (updateFruits == 0) {
return ResponseEntity.status(400).body("水果賣光了,下次再來吧!");
}
return ResponseEntity.ok("搶購水果成功,去步爾斯特的主頁看看吧!");
}
版權聲明
本文為[步爾斯特]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/175/202206240728174421.html
邊欄推薦
猜你喜歡
隨機推薦
- 你真的理解LDO的輸出電容嗎!?
- 二維激光SLAM( 使用Laser Scan Matcher )
- MySQL使用ReplicationConnection導致的連接失效分析與解决
- Go寫文件的權限 WriteFile(filename, data, 0644)?
- 在線文本過濾小於指定長度工具
- quartus調用&設計D觸發器——仿真&時序波驗證
- 【深入理解TcaplusDB技術】TcaplusDB構造數據
- 等保備案是什麼意思?應該去哪裏辦理備案?
- 建議自查!MySQL驅動Bug引發的事務不回滾問題,也許你正面臨該風險!
- 百萬獎金等你來拿,首届中國元宇宙創新應用大賽聯合創業黑馬火熱招募中!
- 力扣解法匯總513-找樹左下角的值
- 快速排序的簡單理解
- 139. 單詞拆分
- Web篇_01 了解web開發
- ADB 按鍵名、按鍵代碼數字、按鍵說明對照錶
- leetcode:面試題 08.13. 堆箱子【自頂而下的dfs + memory or 自底而上的排序 + dp】
- 解答02:Smith圓為什麼能“上感下容 左串右並”?
- MySQL的 安裝、配置、卸載
- 【ESP8266-01s】獲取天氣,城市,北京時間
- Redis 集群
- 【華中科技大學】考研初試複試資料分享
- 傑理之串口設置好以後打印亂碼,內部晶振沒有校准【篇】
- 【NOI2014】15.起床困難綜合症【二進制】
- 函數的定義和函數的參數
- JDBC 在性能測試中的應用
- 35歲危機?內卷成程序員代名詞了…
- SQL聯合查詢(內聯、左聯、右聯、全聯)的語法
- Outlook開機自啟+關閉時最小化
- 北大、加州伯克利大學等聯合| Domain-Adaptive Text Classification with Structured Knowledge from Unlabeled Data(基於未標記數據的結構化知識的領域自適應文本分類)
- 為什麼你的數據圖譜分析圖上只顯示一個值?
- sql server常用sql
- MySQL事務隔離
- STM32-------外部中斷
- 2022年信息安全工程師考試知識點:訪問控制
- 高仿書旗小說 Flutter 版,學起來
- 工作中一些常用的工具函數
- docker 部署redis
- 如何利用數倉創建時序錶
- version `ZLIB_1.2.9‘ not found (required by /lib64/libpng16.so.16)
- 【Flutter】如何使用Flutter包和插件