Azure存储表分页

本文关键字:分页 存储 Azure | 更新日期: 2023-09-27 17:58:56

要在Azure存储中实现简单分页,请使用相对直接的方法:使用Windows Azure表存储进行分页。这可以通过延续令牌功能来实现。

但是。

这只是严肃分页的一个开始。第一个问题是排序。您不能在Azure表中执行OrderBy。克服这一问题的最佳解决方案是什么?页面必须排序,这是事实。

第二个问题是,当涉及到分页时,要知道总页数,如果只有延续令牌功能,这是不可能的。在我看来,在每一页上执行".Count()"似乎效率很低(例如,因为分区可能在多个服务器上)。

第三个问题是,与第二个问题相关,即使你可以计算你有多少页面,如何将计算的页面"连接"到实际的延续令牌?这对我来说是最大的谜团。如何从特定的表行获得延续

如果能提供正确的解决方案,我将非常高兴。我必须承认我也有一个,我会把它写在下面的一个答案中。

Azure存储表分页

我知道这并不能按照您要求的方式解决您的问题,但我仍然不认为应该按照您建议的方式执行分页。我的意思是,由于Azure表存储不支持您所需的功能,它可能不太适合。

我会在本地缓存中获取数据,在那里执行顺序和分页并完成它。对于这个限制,有一个建议的解决方法,可以仔细构建rowkey/partitionkey,但我强烈建议您不要遵循这一点。

Blog blog=  new Blog();
// Note the fixed length of 19 being used since the max tick value is 19 digits long.
string rowKeyToUse = string.Format("{0:D19}", 
        DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);
blog.RowKey = rowKeyToUse;

因此,日期为2008年1月10日上午10:00:00的博客b1将有25217944555999999999作为RowKey,日期为08年2月10日凌晨10:00的博客b2将有25217.93591999999999作为RowKey。因此,b2将先于b1。

要检索日期在2008年1月10日上午10:00:00之后的所有博客,我们将使用以下查询:

     string rowKeyToUse = string.Format("{0:D19}", 
        DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);
var blogs = 
    from blog in context.CreateQuery<Blog>("Blogs")
    where blog.PartitionKey == "Football" 
        && blog.RowKey.CompareTo(rowKeyToUse) > 0
  select blog;

(这摘自Windows Azure Table,2008年12月微软提供的文件)

至于计算页数,这很容易,简单的除法运算就可以了;至于延续令牌,一种方法是(根据最初的请求)在每个页面上"行走"并获得延续令牌,该令牌基本上只是告诉您哪一行&分区键在后面。但拥有所有这些意味着您很容易出现一致性错误(例如,如果有人将某些内容发布到同一个表存储中)。

就我个人而言,我会根据行键进行分页,如上所述,或者,如果这是一个要求,则转到支持它的存储引擎

更详细地说,如果你知道你只有一个"OrderBy"子句,你可以选择所有的,并通过一些暗示,猜测页面边界是什么

顺便说一句,我认为提供的分页不是为了允许在前端进行分页,而是为了减轻1000个结果的限制。但这只是我的0.02美元。