浅析12306售票算法(java版)

浅析12306售票算法(Java版)

前言

12306售票算法是12306官方网站采用的一种购票算法,它采用的是先进先出的算法思想,即先处理最先提交的订单。在高并发情况下,这种算法能够确保订单售出的公平性,防止订单重复抢占,提高12306网站的稳定性。

算法流程

  1. 用户提交订单,服务器接收到请求后,将订单信息放入到队列中。
  2. 售票服务不断地从队列中取出订单。
  3. 售票服务检查该订单是否符合购票规则。若符合,继续;反之,将订单状态设置为失败,并将结果返回给用户。
  4. 售票服务在库存系统中查找是否有足够的余票。若有,继续;反之,将订单状态设置为失败,并将结果返回给用户。
  5. 售票服务将订单锁定,防止其他用户抢占该订单。
  6. 售票服务扣减库存。
  7. 售票服务将订单状态设置为成功,并将结果返回给用户。

核心代码解析

加锁保证唯一性

synchronized (ticket_number) {
   if (ticket_number > 0) {
      ticket_number--;
      Thread.sleep(100);
      return true;
   } else {
      return false;
   }
}

在高并发情况下,对于库存的批量操作需要加锁,以保证线程的安全性及数据的唯一性。12306采用synchronized方法进行线程锁定,确保不会同时处理同一个订单,从而保证库存扣减的准确性。

队列解决重复抢占

private static BlockingQueue<Order> queue = new LinkedBlockingQueue<Order>();

public static boolean add(Order order) {
   boolean success = false;
   try {
      success = queue.offer(order, 2, TimeUnit.SECONDS);
   } catch (InterruptedException e) {
      e.printStackTrace();
   }
   return success;
}

在高并发情况下,为了避免订单重复抢占,需要使用队列将不同订单加入到队列中,保持先进先出的处理顺序。12306采用BlockingQueue实现订单队列,利用其阻塞的特性,确保加入队列的订单不重复,同时保证了订单处理的顺序性。

示例

订单提交

Order order = new Order("John", "K77", "Beijing", "Shanghai", 1);
boolean result = QueueService.add(order);
System.out.println("submit order result: " + result);

用户John发起了一次购买始发站是北京、终到站是上海的K77次列车的订单,并将该订单提交给了12306网站,由于库存和时间允许,该订单成功加入到了订单队列中。

订单处理

Order order = QueueService.getNext();
while (order != null) {
   boolean result = TicketService.sell(order);
   System.out.println("process order result: " + result);
   order = QueueService.getNext();
}

在一段时间后,12306售票系统的售票服务开始从订单队列中取出刚才John提交的订单,对该订单进行处理:检查订单的可行性,并扣减库存。如果订单处理成功,则将订单状态设置为成功,并将结果返回给用户;如果处理失败,则将订单状态设置为失败,并将结果返回给用户。

结语

12306售票算法是12306网站的核心算法之一,保证了网站在高并发访问情况下的稳定性和公平性。本文对其Java版算法进行了浅析,希望读者能够对其有所了解,并在此基础上进一步深入探究。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析12306售票算法(java版) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java通过httpclient比较重定向和请求转发

    Java通过httpclient比较重定向和请求转发的攻略如下: 什么是重定向和请求转发 首先我们要明确一下重定向和请求转发的概念。 重定向是服务器将请求重定向到另一个URL,常见的状态码有301和302,301表示永久重定向,302表示临时重定向。 请求转发是服务器将请求发送到另一个URL的资源,但客户端并不知道这个过程,因为浏览器只看到转发前的URL。 …

    Java 2023年6月15日
    00
  • SpringBoot概述及在idea中创建方式

    SpringBoot概述 Spring Boot是一个开源的Java框架,它摆脱了传统Spring框架的繁琐配置,建立在Spring Framework的基础之上。Spring Boot提供了一种快速简便的方式来搭建Java应用程序,并且默认设置对各种Spring组件、外部组件、配置管理等进行了很好的支持。 Spring Boot使用“约定大于配置”的方式来…

    Java 2023年5月15日
    00
  • 浅谈Maven Wrapper

    关于如何使用 Maven Wrapper,我这里提供一份完整攻略,包含以下内容: 什么是 Maven Wrapper Maven Wrapper 是 Maven 内置的一个小型 Maven 版本管理工具,是 Maven 3.5.0 版本中引入的新特性。它的主要作用是帮助使用者对 Maven 进行版本控制,防止出现版本不一致的问题。使用 Maven Wrapp…

    Java 2023年6月2日
    00
  • Java方法的返回值及注意事项小结

    当我们在编写Java程序时,有时需要从方法中获取数据。在许多情况下,我们希望方法能够返回一个值,这就是Java方法的返回值。在本文中,将介绍Java方法的返回值以及注意事项。 什么是Java方法的返回值? Java方法的返回值是指当方法被调用时,此方法所返回的数据。方法的返回值用于与另一个方法或代码交互。一般情况下,Java方法返回值可以是任何基本数据类型(…

    Java 2023年5月26日
    00
  • java 非对称加密算法RSA实现详解

    Java 非对称加密算法RSA实现详解 什么是非对称加密算法? 非对称加密算法指的是在加密和解密过程中分别使用两个不同的密钥,即公钥和私钥。公钥可以公开,任何人都可以使用公钥对信息进行加密,但只有私钥持有者才能解密被加密的信息。非对称加密算法具有安全性高、密钥分配方便等优点,因此被广泛应用于数据传输、数字证书等场景。 RSA算法简介 RSA算法是一种典型的非…

    Java 2023年5月19日
    00
  • 利用SpringDataJPA开启审计功能,自动保存操作人操作时间

    利用SpringDataJPA开启审计功能可以方便地对每次数据操作进行记录,包括操作人、操作时间等信息。这样做有利于数据追溯和安全性控制。下面是实现该功能的步骤: 添加必要的依赖 在项目的pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</group…

    Java 2023年5月20日
    00
  • jsp页面显示数据库的数据信息表

    下面是如何在JSP页面中显示数据库的数据信息表的完整攻略。 第一步:连接数据库 在JSP中连接数据库需要使用JDBC驱动程序。我们可以使用以下代码来连接MySQL数据库。 <%@ page import="java.sql.*" %> <% Connection con = null; Statement stmt = …

    Java 2023年6月15日
    00
  • 利用Jasypt如何对Spring Boot配置文件加密

    利用Jasypt对Spring Boot配置文件加密的步骤如下: 1. 引入Jasypt依赖 首先在项目的pom.xml文件中引入Jasypt的依赖: <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spri…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部