База данных ключ-значение, которая обслуживает только очень быстрое чтение?

Мы делаем проект на Scala, и мне нужна база данных типа ключ-значение (например, карта), которая требуется в основном для обслуживания операций чтения и делает это очень быстро:

  • Никакой экзотической поддержки запросов или сложной логики поиска, просто дайте ключ и получите значение, как карту. никаких условий, никаких соединений, ничего. Ключ -> Значение
  • Значение, кстати, само по себе является картой какого-то списка каких-то строк или что-то в этом роде. это означает, что это немного длинно (если вообще имеет значение)
  • Мы используем его только для чтения. Никакой записи не ожидается для первоначального заполнения базы данных или некоторых очень редких обновлений, или, возможно, это может быть обработано вне базы данных...

Я был направлен на MangoDB и memcachedDB, но Mango хорош в запросах (что не добавляет мне ценности), а memcacheDB — это все о распределении (это не проблема в моем проекте). Пока что я думаю об использовании RDBMS (например, MySQL), но, возможно, есть лучшие варианты в мире NoSQL?


person Ashkan Kh. Nazary    schedule 26.02.2011    source источник


Ответы (6)


Альтернативой может быть просто использование плоского файла, данные звучат относительно просто, и вам не нужно часто записывать в файл. Похоже, что существует также scala-реализация memcached с открытым исходным кодом. Этот доступ был бы очень быстрым. https://github.com/victori/smemcached

person Brandon Frohbieter    schedule 26.02.2011
comment
Интересное замечание. Я полагаю, что проблема с плоским файлом будет заключаться в неэффективности произвольного доступа, поскольку значения и ключи не имеют фиксированной длины. Или я что-то упустил из старых книг по программированию ;-)? - person Ashkan Kh. Nazary; 26.02.2011

Я бы предложил SQLite или Berkeley DB (с SQLite-совместимым SQL API). Обе представляют собой простые встроенные библиотеки баз данных — они связаны с вашим приложением, поэтому нет необходимости в отдельном сервере. Они оба очень быстро выполняют запросы. Berkeley DB имеет лучшую масштабируемость для очень больших баз данных. Если вы заинтересованы в использовании API пары "ключ-значение" (NoSQL), Berkeley DB также имеет такой API.

Удачи в Вашем поиске.

person dsegleau    schedule 28.02.2011

Я бы посоветовал вам взглянуть на Кабинет Киото. Я нахожусь в процессе написания некоторых оболочек Scala вокруг него, что позволит вам получить к нему доступ как к простой старой ванильной карте Scala. Я еще не проводил тесты сам, но, судя по имеющимся тестам, он быстрее, чем Berkeley DB. (Однако, возможно, пока рано говорить об этом, поскольку нет документации о накладных расходах на интеграцию с Java.)

Ознакомьтесь с JavaDoc API здесь. Я играл с ним на 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
person Wilfred Springer    schedule 01.03.2011

Chronicle Map – это встраиваемое постоянное хранилище ключей и значений на чистом языке Java.

PalDB — это однократная запись, встраиваемое постоянное хранилище ключей и значений для Java.

person leventov    schedule 08.07.2016

MongoDB, вероятно, будет простым решением для этого.

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

person Mike Geise    schedule 26.02.2011

MemcacheDB кажется подходящим инструментом для работы, даже если вам не нужна часть распределенной сети (вам не нужно ничего делать не, чтобы использовать ее).

Более того, redis должен быть очень быстрым, а также имеет встроенную поддержку хранения структур данных, таких как списки или наборы.

person mhanisch    schedule 02.03.2011