【问题标题】:Key-value db that serves only reads very fast?只提供服务的键值数据库读取速度非常快?
【发布时间】:2016-07-08 23:24:02
【问题描述】:

我们正在使用 Scala 做一个项目,我需要一个键值对数据库(如地图),它主要用于提供读取操作并且执行速度非常快:

  • 没有任何奇异的查询支持或复杂的检索逻辑,只需给出键并获取值,就像地图一样。没有条件,没有连接,什么都没有。键 -> 值
  • 顺便说一下,值本身就是一些字符串列表或类似内容的映射。这意味着它有点冗长(如果重要的话)
  • 我们只用它来阅读。对于数据库的初始填充或一些非常罕见的更新,或者可能可以在数据库之外处理......

我一直专注于 MangoDB 和 memcachedDB,但 Mango 擅长查询(这对我没有任何价值),而 memcacheDB 完全是关于分发的(在我的项目中不是问题)。到目前为止,我正在考虑利用 RDBMS(例如 MySQL),但也许在 NoSQL 领域有更好的选择?

【问题讨论】:

    标签: nosql key-value-store


    【解决方案1】:

    另一种方法是使用平面文件,数据听起来相对简单,您不必经常写入文件。似乎还有memcached的开源scala实现。这种访问会非常快。 https://github.com/victori/smemcached

    【讨论】:

    • 有趣的评论。我想,平面文件的问题是随机访问效率低下,因为值和键的长度不是固定的。还是我从旧的编程书籍中遗漏了什么;-)?
    【解决方案2】:

    我建议SQLiteBerkeley DB(它具有与SQLite 兼容的SQL API)。两者都是简单的嵌入式数据库库——它们链接到您的应用程序,因此不需要单独的服务器。他们在运行查询方面都非常快。 Berkeley DB 对于超大型数据库具有更好的可扩展性。如果您对使用 key-value pair API (NoSQL) 感兴趣,Berkeley DB 也有该 API。

    祝您搜索顺利。

    【讨论】:

      【解决方案3】:

      我建议你看看Kyoto Cabinet。我正在围绕它编写一些 Scala 包装器,允许您将它作为一个普通的老式香草 Scala Map 来访问。我自己还没有做过基准测试,但是根据那里的基准测试,它比 Berkeley DB 快。 (不过,现在说还为时过早,因为没有关于 Java 集成开销的文档。)

      检查JavaDoc APIs here。我一直在 REPL 上玩弄它,它运行良好。

      这里有一些来自 REPL 的证明:

      $ scala -Djava.library.path=/usr/local/lib
      Welcome to Scala version 2.8.0.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_15).
      Type in expressions to have them evaluated.
      Type :help for more information.
      
      scala> :cp /Users/wilfred/.m2/repository/com/fallabs/kyotocabinet/1.15/kyotocabinet-1.15.jar
      Added '/Users/wilfred/.m2/repository/com/fallabs/kyotocabinet/1.15/kyotocabinet-1.15.jar'.  Your new classpath is:
      .:/Users/wilfred/.m2/repository/com/fallabs/kyotocabinet/1.15/kyotocabinet-1.15.jar
      
      scala> import kyotocabinet._                                                                
      import kyotocabinet._
      
      scala> val db = new DB()                                                                    
      db: kyotocabinet.DB = (null): -1: -1
      
      scala> db.open("casket.kch", DB.OWRITER | DB.OCREATE)
      res0: Boolean = true
      
      scala> db.set("foo", "bar")
      res1: Boolean = true
      
      scala> db.get("foo")
      res2: java.lang.String = bar
      

      【讨论】:

        【解决方案4】:

        Chronicle Map 是一个纯 Java 可嵌入的持久键值存储。

        PalDB 是一个一次写入、可嵌入、持久的 Java 键值存储

        【讨论】:

          【解决方案5】:

          MongoDB 可能是一个简单的解决方案。

          http://www.mongodb.org/display/DOCS/Benchmarks

          【讨论】:

            【解决方案6】:

            MemcacheDB 听起来是适合这项工作的工具,即使您不需要分布式网络部分(您无需执行任何操作 即可使用它)。

            更好的是,redis 应该非常快,并且还原生支持存储列表或集合等数据结构。

            【讨论】:

              猜你喜欢
              • 2020-04-27
              • 2010-12-16
              • 2012-07-15
              • 1970-01-01
              相关资源
              最近更新 更多