马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
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企服之家,中国第一个企服评测及商务社交产业平台。 |