使用 Amazon S3 作为键值存储(生产中)

xyb*_*rek 5 java database algorithm amazon-s3 amazon-web-services

我在我的项目中使用 Wasabi 作为 S3 存储,并且我一直在考虑利用 S3 作为键值存储。Wasabi 不对 API 请求收费,如此处所述https://wasabi.com/cloud-storage-pricing/

任何人都可以轻松地(也许使用任何编程语言)实现 Amazon S3 的如此简单的接口:

value = store.get(key)
store.put(key, value)
store.delete(key)
Run Code Online (Sandbox Code Playgroud)

其中key是字符串,value是二进制数据。有效地将其用作高度分布式和弹性的键值存储。

因此可以存储一个 User 对象,例如

userid:1234567890:username -> johnsmith
userid:1234567890:username:johnsmith:password -> encrypted_password
userid:1234567890:username:johnsmith:profile_picture -> image_binary
userid:1234567890:username:johnsmith:fav_color -> red
Run Code Online (Sandbox Code Playgroud)

值被序列化为二进制。

等等。

我有几个问题,对于那些尝试使用 S3 作为数据库或数据存储的人来说,使用 Amazon S3 作为键值存储的最佳策略是什么。尽管我认为通过查询带有前缀的键并执行代码中所需的逻辑来检索此处描述的整个用户对象相当容易userid:1234567890,但这样做的明显缺点是您无法搜索值。

  1. 这里可以使用什么算法来实现一个简单的键搜索功能,例如搜索用户名以“j”开头的用户或用户名fav_color“red”,查看非常基本的键值接口 get 和 put 我认为这个不可能,但也许有人知道解决方法?
  2. 对于原始数据类型(字符串、数字、布尔值等)和 Blob 数据(图像、音频、视频和任何类型的文件),哪种序列化策略最适合这种键值存储?另外,这个简单的键值没有办法定义键中存储什么类型的值(是字符串、数字、二进制等?),如何解决?
  3. 在这种场景下如何才能实现交易呢?就像上面的例子一样,当username johnsmith且仅当其他键也存储或根本不存储时才存储,我在想S3批量操作足以解决这个问题吗?
  4. 当计划将其用作应用程序(和生产用途)的主数据库时,无论是从算法角度还是考虑到 S3 本身的局限性,主要的设计考虑因素是什么?