在主回圈內,我已 Math.min() 比較這次交易的買單跟賣單後後算出本次成交量,然後同步更新兩者的剩餘量。
我提供 DELETE /v1/order/cancel,收一個 OrderCancelEvent。流程是 Controller → Service → Redis 服務。
// OrderController.java
@DeleteMapping("cancel")
public boolean cancelOrder(@RequestBody OrderCancelEvent event) {
return orderCancelService.execute(event);
}
// OrderCancelService.java
public boolean execute(OrderCancelEvent cancelEvent) {
return redisService.cancelOrder(cancelEvent);
}
// RedisOrderBookService.cancelOrder(...)
public boolean cancelOrder(OrderCancelEvent event) {
String orderIdKey = "order:" + event.getOrderId();
String json = redisTemplate.opsForValue().get(orderIdKey);
if (json == null) return false;
OrderCreatedEvent order = objectMapper.readValue(json, OrderCreatedEvent.class);
String bookKey = order.getOrderType().equalsIgnoreCase("BUY") ? BUY_ORDERBOOK_KEY : SELL_ORDERBOOK_KEY;
boolean removed = redisTemplate.opsForZSet()
.remove(bookKey, event.getOrderId().toString()) > 0;
if (removed) {
redisTemplate.delete(orderIdKey);
redisTemplate.opsForSet()
.remove("user:" + order.getUserId() + ":orders", event.getOrderId().toString());
}
return removed;
}
我在這裡的選擇