4

我们有一个包含以下参数的数据库:

  • 30k 条记录,7mb 大小
  • 20 次插入/秒
  • 1000 次更新/秒
  • 1000 范围选择/秒,按二级索引,每个大约 10 行
  • 至少需要一个二级索引
  • 如果密钥在 75 秒内未更新,则需要某种机制来使密钥过期(可以通过编程垃圾收集器完成,但需要额外的“last_update”索引并增加一些负载)
  • 不需要一致性
  • 不需要耐久性
  • db 应该存储在内存中

目前我们使用 Redis,但它没有二级索引,而且keys index:foo:*速度太慢。Membase 也没有二级索引(据我所知)。MongoDB 和 MySQL 内存引擎都有表级锁。什么引擎适合我们的用例?

4

4 回答 4

2

我认为 Redis 确实支持二级索引,但它们不是隐含的:你必须明确地维护它们。排序集可用于范围扫描,但不如 MongoDB 或关系数据库中的方便。

如果您正在寻找对范围扫描提供更好支持的类似 Redis 的服务器,我建议您查看已停产的 AlchemyDB 项目或 Aerospike 3(商业)产品(其中包含 AlchemyDB 的部分功能)。

于 2012-10-19T16:03:32.393 回答
2

尝试使用http://tarantool.org/ 它有二级索引并且完全在内存中。它还使用快速异步 IProto 协议。

事实证明它稳定且速度惊人。

于 2012-12-14T09:43:05.680 回答
0

我在想他的意思是 7mb / 记录。另一种选择是在 Cassandra 之上使用 Scalable-SQL 的 PlayOrm ......更多的机器可以带来更好的性能,因为磁盘将在范围扫描等上并行工作。

于 2012-10-19T21:28:27.990 回答
0

我认为,如果您可以达到您指定的性能要求,那么数据库是否在内存中的事实将是无关紧要的。

您的性能目标完全在单个、非复制和非分片 MongoDB 实例的能力范围内。Mongo 使用内存映射文件,因此所有数据都将在内存中,但数据库将不断刷新到磁盘。默认情况下,Mongo 使用“不安全”模式,这消除了磁盘 I/O 的大部分负担。对于您的用例值得考虑,而不是尝试在应用程序代码中执行数据库应该为您执行的操作。

添加副本(Mongo 的集群术语)和/或分片将使您有机会在需要时轻松提高性能。多个索引(包括复合索引)、灵活的查询、批量插入和原子更新是有助于提高性能并减轻应用程序代码负担的好功能。

于 2012-10-20T05:30:43.233 回答