0

我正在尝试设计一个允许将注册用户添加到队列的移动应用程序。从 Web 服务请求一个号码,然后以存储的号码进行响应。下一个请求用户将获得连续号码。

我使用 C# 作为服务器端语言,使用 mySQL 作为用户数据库。

客户端发送一个 HTTP POST 请求,其中“Authentication”标头是“username:password”,“x-action”自定义标头是“joinQueue”。并在队列中获取他的号码。稍后,他可以使用“checkQueueStatus”操作轮询 Web 服务,以查看他现在在队列中的位置。

服务器端执行以下操作:

  1. 访问用户数据库并检查用户名:密码是否存在(正确)。
  2. 发送 last_number+1 并更新 HTTP 响应正文。
  3. 在队列中存储用户 ID 123123 为 31 的信息。
  4. 一旦先入队列完成服务,更新所有用户的队列。

作为网络服务的菜鸟,我不太确定如何设计服务器端部分。具体来说,使用以下信息创建一个不同的表(队列表)是否有意义:

userID  | placeInQueue 
301452        1 
444592        2 
612712        3
042125        4

并且管理员客户端现在可以发送带有“serviceFirstUser”操作的 HTTP 请求,这将减少队列中每个人的 placeInQueue?

这是一个合理的设计吗?

谢谢。

4

1 回答 1

0

使用 QueueTable 是个好主意,但您不需要这样做:

  • 一旦先入队列完成服务,更新所有用户的队列。

您可以只索引 placeInQueue 然后获取 max_place-min_place

CREATE TABLE IF NOT EXISTS `queue`
(
    `userID` INT(9) PRIMARY KEY NOT NULL,
    `placeInQueue` BIGINT(16) AUTO_INCREMENT NOT NULL,
    INDEX(placeInQueue)
) ENGINE=MyISAM;

因此,您只需获得队列中第一个用户的位置(以恒定的复杂性):

SELECT * FROM `queue` ORDER BY `placeInQueue` ASC LIMIT 1

然后您可以以对数复杂度获得用户的位置:

SELECT * FROM `queue` WHERE `userID`='<user_id>' LIMIT 1

他的真实位置是(他的placeInQueue)-(第一个placeInQueue)+1。

然后您不需要进行线性更新...删除第一个可以以对数复杂度完成(placeInQueue 索引的常数 + userID 的对数)。

于 2013-01-05T13:57:56.207 回答