苍穹外卖业务整理
1.简历写法西南村小吃校园送
本项目是专门为天大西南村小吃街店铺定制的一款点餐平台。商家可以对餐厅的菜品、套餐等信息进行维护。学生可以在小程序端下单。
责任描述:
使用 JWT 令牌封装用户 Token,自定义封装了拦截器校验 JWT 令牌的有用性
使用 OSS 存储菜品和套餐素材、使用 Redis 缓存数据,提升用户访问速率
基于 AOP 实现公共字段(比方创建时间、创建人)的自动填充功能,镌汰代码,低落耦合
使用 Redisson 内置的延迟队列 RDelayedQueue 实现超时订单自动取消订单功能。
使用 WebSocket 实现来单提示和客户催单功能,并使用 Redis 实现催单频率限定功能
2. 超时订单自动取消功能
实现思绪:
使用 Redisson 提供的内置延迟队列 RDelayedQueue 来管理超时订单的自动取消。通过将超时订单放入延迟队列,系统可以在指定时间后自动执行取消操纵。
具体步调:
[*]订单创建时: 当用户下单时,系统会记载订单的创建时间和超时时间(比方 15 分钟后)。
[*]将订单放入延迟队列:
[*]使用 RDelayedQueue 将须要超时取消的订单放入队列。可以指定延迟时间,比方将订单信息对象放入队列,延迟 15 分钟。
[*]示例代码: RDelayedQueue<Order> delayedQueue = redissonClient.getDelayedQueue("order-cancel-queue");
delayedQueue.offer(order, 15, TimeUnit.MINUTES);
[*]订单取消处理:
[*]创建一个斲丧者来监听延迟队列,一旦超时订单到达,斲丧者会自动取消该订单,更新订单状态为“已取消”。
[*]示例代码: delayedQueue.consume(order -> {
orderService.cancelOrder(order.getId());
});
上风:
[*]自动化: 无需人工干预,镌汰了管理成本。
[*]高效: 通过使用延迟队列,系统可以或许在规定时间后自动处理超时订单,提高了用户体验。
Redisson 的 RDelayedQueue 详解
RDelayedQueue 是 Redisson 提供的一个延迟队列实现,它允许将任务延迟执行,适用于处理超时订单的自动取消。这是通过将任务放入队列并指定延迟时间来实现的。以下是对 RDelayedQueue 的具体解释和怎样使用它来管理超时订单的自动取消。
1. 根本概念
[*]延迟队列: 延迟队列是一种特别的队列,允许在特定的延迟后才将任务从队列中取出并执行。在处理超时订单时,可以将订单放入延迟队列,设置延迟时间,其时间到达后,系统会自动执行相应的操纵(如取消订单)。
2. 使用场景
在一个点餐系统中,用户下单后,如果在规定时间内(比方 15 分钟)未完成支付,系统须要自动取消该订单。使用 RDelayedQueue 可以轻松实现这一点。
3. 实现步调
以下是使用 RDelayedQueue 进行超时订单管理的具体步调:
a. 引入依赖
起首,确保你的项目中已经引入了 Redisson 的依赖。通常在 Maven 项目中,依赖如下:
xml
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.16.4</version> <!-- 使用最新版本 -->
</dependency>
b. 创建 RDelayedQueue 实例
在服务中,注入 Redisson 客户端并创建 RDelayedQueue 实例。
@Autowired
private RedissonClient redissonClient;
// 创建延迟队列
RDelayedQueue<Order> delayedQueue = redissonClient.getDelayedQueue("order-cancel-queue");
c. 放入延迟队列
在用户下单时,将订单放入延迟队列,并设置延迟时间(比方 15 分钟)。
public void placeOrder(Order order) {
// 处理订单逻辑
orderMapper.insert(order);
// 将订单放入延迟队列,15分钟后执行取消
delayedQueue.offer(order, 15, TimeUnit.MINUTES);
}
d. 处理超时订单
创建一个斲丧者来处理延迟队列中的订单。当订单超时到达时,从队列中斲丧订单,并执行取消操纵。
public void processDelayedOrders() {
delayedQueue.consume(order -> {
// 执行取消订单的逻辑
cancelOrder(order.getId());
});
}
e. 取消订单的方法
实现取消订单的具体逻辑,根据订单 ID 更新订单状态。
public void cancelOrder(Long orderId) {
Orders order = orderMapper.findById(orderId);
if (order != null && order.getStatus() == Orders.PENDING_PAYMENT) {
order.setStatus(Orders.CANCELLED);
order.setCancelReason("订单超时,自动取消");
orderMapper.update(order);
}
}
4. 长处
[*]简化代码: 使用 RDelayedQueue 使得超时处理逻辑更清晰,克制了复杂的定时任务管理。
[*]高效: 延迟队列在 Redis 中高效实现,可以或许处理大量的超时订单。
[*]可靠性: Redisson 提供的集群支持和恒久化机制,使得延迟队列在高并发情况下也能稳定工作。
5. 留意事项
[*]Redis 配置: 确保 Redis 配置精确,以支持延迟队列的使用。
[*]任务处理: 斲丧者须要处理异常情况,比方订单已经被取消的情况,确保系统的健壮性。
[*]监控: 监控队列的状态,确保没有长时间堆积的任务,克制系统负担。
RDelayedQueue比Spring Task处理超时订单的自动取消的上风
使用 RDelayedQueue 和 Spring Task 处理超时订单的自动取消各有上风,但在某些方面,RDelayedQueue 提供了明显的上风。以下是两者的比较:
1. 延迟处理机制
[*] RDelayedQueue:
[*]提供内置的延迟队列功能,可以将任务放入队列中并指定一个延迟时间。
[*]任务会在指定的延迟时间后自动处理,简化了超时管理的实现。
[*] Spring Task:
[*]通常使用定时任务(如 @Scheduled 注解)来定期检查超时订单。
[*]须要额外的逻辑来判断哪些订单已经超时,增加了复杂性。
2. 实时性和效率
[*] RDelayedQueue:
[*]任务一旦到达设置的延迟时间,会立即被处理,确保实时性。
[*]适用于须要快速响应的系统,克制了不须要的轮询。
[*] Spring Task:
[*]依赖于定时任务的执行频率(比如每分钟一次),大概导致超时处理的延迟。
[*]在高并发场景下,大概会出现检查不实时的情况。
3. 资源斲丧
[*] RDelayedQueue:
[*]在 Redis 中实现,使用 Redis 的高效存储和操纵能力,可以或许轻松处理大量延迟任务。
[*]不会斲丧应用的 CPU 资源用于轮询检查。
[*] Spring Task:
[*]须要定期执行任务,大概导致 CPU 资源浪费,尤其是在任务间隔较短时。
[*]在高并发情况下,大概导致任务执行的竞争和资源争用。
4. 代码简洁性
[*] RDelayedQueue:
[*]通过简单的 API 调用就能实现延迟处理,代码更简洁明白。
[*]镌汰了冗余的逻辑,易于维护。
[*] Spring Task:
[*]须要编写额外的逻辑来遍历订单,检查状态,增加了代码复杂性。
[*]维护起来相对贫苦,尤其在处理复杂业务逻辑时。
5. 错误处理与重试机制
[*] RDelayedQueue:
[*]可以使用 Redis 的特性,轻松实现失败重试机制,确保任务的可靠性。
[*]可以在任务失败时重新放入队列,指定新的延迟时间。
[*] Spring Task:
[*]须要手动实现重试机制,增加了代码复杂性。
[*]错误处理大概不敷灵活,尤其在高并发情况下。
6. 可扩展性
[*] RDelayedQueue:
[*]通过 Redis 集群可以很容易地扩展,以支持更高的并发和更大的数据量。
[*]得当大规模应用,处理大量超时订单。
[*] Spring Task:
[*]受限于单个应用实例的能力,扩展性较差。
[*]在高并发场景下,大概会出现性能瓶颈。
3. 订单催单提示功能
实现思绪:
使用 WebSocket 实现实时的订单催单提示,并使用 Redis 来限定催单的频率,防止用户频繁催单。
具体步调:
[*] WebSocket 毗连:
[*]客户端在下单后与服务端建立 WebSocket 毗连。如许,服务端可以实时向客户端推送消息。
[*]示例代码: @OnOpen
public void onOpen(Session session) {
// 记录用户的 WebSocket 会话
}
[*] 催单请求:
[*]当用户点击“催单”按钮,客户端会发送催单请求到服务端。
[*]服务端吸收到催单请求后,起首检查催单的频率:
[*]使用 Redis 记载每个用户的催单时间戳,比方使用用户 ID 作为键,存储迩来一次催单的时间。
[*]如果在规定的时间内再次催单,则拒绝请求并返回提示信息。
[*]示例代码: String key = "user:" + userId + ":last催单时间";
Long last催单时间 = redisTemplate.opsForValue().get(key);
if (last催单时间 != null && System.currentTimeMillis() - last催单时间 < 60000) {
// 超过频率限制,拒绝催单
return;
}
// 更新催单时间
redisTemplate.opsForValue().set(key, System.currentTimeMillis());
[*] 发送催单消息:
[*]如果催单请求被接受,服务端通过 WebSocket 向对应的餐厅商家发送催单提示。
[*]示例代码: java
复制
session.getBasicRemote().sendText("用户催单提醒");
上风:
[*]实时交互: 使用 WebSocket 实现了实时的用户与商家的互动,提高了用户体验。
[*]频率控制: 通过 Redis 实现的频率限定功能,克制了用户的恶意催单,保护了商家的正常运营。
4.业务逻辑总结
苍穹外卖项目总结_苍芎外卖怎样实现的跨域-CSDN博客
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]