2

我目前正在研究 REST API。API返回的资源预计是来自数据库的海量数据(DB中的数千万行)。分页是必须的,以避免在将数据写入 HTTP 响应时消耗大量内存。

在客户端请求之间删除/添加数据库中的行时,如何确保数据完整性?

例如:

page 1: [ John, Mary, Harry, David, Joe ]
page 2: [ Mike, Don, Alex ]

客户端请求第1页并将其存储在本地(文件/内存)中后,在请求第2页之前,数据变为:

page 1: [ John, Mary, Harry, David, **Mike** ]
page 2: [ Don, Alex, **Terry** ]
4

2 回答 2

3

一个真正的 RESTful(因此是服务器端无状态)答案是:

  • 询问前五条记录(最后一条是“Joe”),
  • 然后要求五个记录优于“乔”,[1],
  • 等等。

使用此策略,您将在第 2 页中获得“Mike”和“Terry”。

[1] 它们必须具有排序顺序(字母顺序或其他顺序)。

于 2013-03-08T09:00:11.517 回答
1

对此的一种解决方案是返回一个表示查询结果集的“临时”资源,然后允许客户端使用 GET 对其进行分页。

例如:

GET /big-query/all-users
Returns: /query-results/12345 

GET /query-results/12345?page=1
Returns: users 1-20

GET /query-results/12345?page=2
Returns: users 21-40

此解决方案的明显问题是对实际用户的更改不会反映在查询结果集中,因此您应该在 API 文档中明确说明。此外,最好在合理的时间后使结果集“过期”,以 (a) 防止它变得陈旧,以及 (b) 允许您的服务器获取它所持有的内存。

另一种方法是每次重新发出查询,然后分页到结果集中以找到要返回的正确数据块。这是无状态的,不需要像之前的想法那样的驱逐策略,但这确实意味着每次都会重新运行查询。它的好处是每次分页的结果都将尽可能准确。

于 2013-03-08T03:46:03.627 回答