您可以在 Amazon s3 存储桶中拥有无限的对象,并使用getBucket API 调用列出您的对象。有趣的是,您可以使用任何字符作为分隔符(如 Linux 文件系统中的“/”)。面对大量对象,S3 API 如何实时响应?你不能指望全面扫描,对吧?s3存储架构背后的技术是什么?
这是我到目前为止的一些搜索工作结果。有谁知道更详细的吗?
您可以在 Amazon s3 存储桶中拥有无限的对象,并使用getBucket API 调用列出您的对象。有趣的是,您可以使用任何字符作为分隔符(如 Linux 文件系统中的“/”)。面对大量对象,S3 API 如何实时响应?你不能指望全面扫描,对吧?s3存储架构背后的技术是什么?
这是我到目前为止的一些搜索工作结果。有谁知道更详细的吗?
我添加作为答案是因为评论部分没有足够的空间:
有几个设计决策可以避免使用完整扫描,例如索引或简单的前缀树。
尽管一些 S3 客户端应用程序会将前缀列为文件夹,但 S3 中没有这样的概念。在一个存储桶中,所有文件都分层地处于同一级别。文件的组织方式是键/值方式,而不是树方式(就像人们期望在类似“文件夹”的系统中所期望的那样)。请参阅此相关问题以获取更多信息。因此,如果您想列出您的“文件夹”,是的,您可能需要列出您的前缀,即根据前缀获取对象并跳过具有附加信息的对象。
您可以避免使用存储桶名称上的索引进行完整搜索。我在 MySQL 中做了一个关于这个的实验。MySQL 只真正支持此应用程序的 B-Trees,这不是一个完美的解决方案,但应该会显着加快速度。我创建了下表并用我系统上 /usr/ 下的所有文件(446594 个文件)填充它:
CREATE TABLE `files` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`filename` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`dirname` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `filename` (`filename`)
) ENGINE=InnoDB AUTO_INCREMENT=446722 DEFAULT CHARSET=utf8 \
COLLATE=utf8_unicode_ci;
结果意义重大。
mysql> select count(*) from files where filename like "/usr/lib/%" \
and filename regexp "^/usr/lib/[^/]*";
+----------+
| count(*) |
+----------+
| 68678 |
+----------+
1 row in set (0.21 sec)
mysql> select count(*) from files where filename regexp "^/usr/lib/[^/]*";
+----------+
| count(*) |
+----------+
| 68678 |
+----------+
1 row in set (3.06 sec)