【问题标题】:Write once read many in memory key value store一次写入在内存键值存储中读取多次
【发布时间】:2016-03-22 08:23:40
【问题描述】:

我有一个特殊的用例,即内存中的多个键值映射需要非常快的查找时间。它们每天只设置一次,因此对于所有实际目的都可以认为是不可变的。 Redis 不是一个选项,因为它会在多个线程访问它的情况下限制 CPU。多实例redis因为数据复制占用了太多内存。这里要考虑的重要一点是,突发读取率非常高。大约 1000 万个请求同时来自大约 40-50 个工作人员。

我正在考虑创建一个简单的客户端服务器架构,其中多个读取器连接到服务器以从共享内存映射中读取。但是我想知道这样的架构是否已经存在并且已经针对这个用例进行了大量测试,在这种情况下我不应该重新发明轮子。

所以总结一下我最好的选择是什么? TIA。

【问题讨论】:

    标签: database key-value in-memory-database key-value-store


    【解决方案1】:

    可能不适合您,但您可以尝试 RBLDNSD 并将您的值存储在 DNS 中。它的高性能和结果将被缓存,并且很容易从几乎任何编程环境中读取值。要向其写入值,您需要直接写入其区域文件,但格式简单且易于编写。

    【讨论】:

    • 会检查一下,虽然我认为这不是这个框架的正确用法。
    【解决方案2】:

    您没有提及映射的大小,但鉴于性能如此关键,听起来您可能需要考虑为每个工作人员保留“内存中的多个键值映射”的副本。

    然后您可以实现一个简单的机制来通知每个工作人员是时候刷新他们的地图了(例如 Redis PUBLISH 或任何其他 pubsub 类型的框架)。

    【讨论】:

    • 最大地图中的地图大小从几千到大约 2000 万个条目不等。 redis 的总内存占用约为 9GB。我对每个工人都没有那么多的空闲内存。工作人员正在运行火花作业,这些作业本身就占用大量内存。
    • 所有工作人员都需要访问所有数据吗?您能否对数据集进行分区,使每个工作人员只有所需的 ?在将任务分配给工作人员时,您是否可以更喜欢已经从事过类似任务的工作人员?你能不能用内存缓存来存储热数据,用 Redis 作为较慢的网络缓存,就像stackoverflow.com does
    • 地图访问非常随机。我认为我不能以此为基础进行分区。但是您确实提到了我尚未尝试过的热缓存机制,主要是因为我不知道有多少重复查询。我的假设是重复率很低,但我很可能错了。
    【解决方案3】:

    冒着与 stackoverlow 自我推广警察发生冲突的风险 :-) eXtremeDB 可能是一个考虑因素。它不是无模式的,但您的模式可以简单地定义一个键值对。它支持 MVCC(乐观、非阻塞)并发,因此即使是相对不频繁的写入也不会妨碍阅读器,并且您将能够利用所有 CPU 内核。

    【讨论】:

    • 这是开源的吗?
    • @Sohaib 看起来不像是开源的。
    • 对,它不是开源的,虽然可以选择源代码许可证。
    猜你喜欢
    • 2019-06-16
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-26
    • 2015-07-16
    相关资源
    最近更新 更多