2012-05-02 10 views
5

Mam potrzebę przechowywania niektórych metadanych w aplikacji node.js, którą piszę. Zamiast wymyślać własny format plików i zarządzać tym plikiem, chciałbym użyć stałego ciągu klucz-wartość w procesie.Przechowywanie w postaci ciągłej przechowalni kluczy dla pliku node.js

Patrzyłem na mongodb, ale wygląda na to, że mongodb zawsze musi być uruchamiany poza procesem (to znaczy najpierw trzeba uruchomić serwer mongo, a następnie połączyć się z nim w node.js.) jest to, że istnieje całkowicie w ramach procesu node.js - lub przynajmniej że wszystkie procesy zewnętrzne są w całości zarządzane w sposób przejrzysty przez bibliotekę i zabija je, gdy aplikacja zamyka połączenie.

Nie zależy mi zbytnio na wydajności, ale miło byłoby wspierać asynchroniczne IO w sklepie, aby nadążyć z całą asynchronizacją Node.

Byłoby również miło, gdyby indeksy obsługiwane przez magazyn, ponieważ na pewno będę sprawdzać dane w sposób, w jaki indeksy byłyby pomocne.

Jestem prawie pewny, że "sqlite" będzie działał dla mnie, z tym, że tak naprawdę nie uważam tego za prawie tak wygodne, jak sklep z kluczem wartości. Idealnie powinienem móc mówić w JSON, nie w SQL. Ale sqlite będzie działać, jeśli nic lepszego nie istnieje.

Dzięki!

+0

proszę można wytłumaczyć _why_ ty przedmiotem sobie tego ograniczenia? –

+0

Użyj obiektu Javascript. Jeśli masz tylko jeden proces, to asynchrony są dyskusyjne. –

+0

Czy naprawdę potrzebujesz bazy danych do utrzymywania "niektórych metadanych"? Nie sądzę. –

Odpowiedz

2

Możesz być zainteresowany wykorzystaniem REDiS http://redis.io/

Istnieje popularne biblioteki pomocnika do węzła https://github.com/mranney/node_redis

Następnie można to zrobić:

var redis = require("redis"); 
var client = redis.createClient(); 

client.set("foo_rand000000000000", "OK"); 
+5

Dzięki, ale niestety to nie wygląda na proces - wymaga zewnętrznego procesu serwera. – eblume

+1

W końcu poszedłem z tym. Aby sprawić, że wydaje się to pojedynczemu procesowi dla użytkownika końcowego, uruchamiam lokalny serwer redis na nieuprzywilejowanym porcie z poziomu węzła, używając "child_process.spawn", i upewnij się, że oderwałeś go przed wyjściem. Dzięki za sugestię! – eblume

+0

To całkiem nowatorskie podejście. Cieszę się, że to działa. Mam nadzieję, że pakowanie instalacji redis jako części aplikacji nie będzie zbyt kłopotliwe. – 250R

-1

Jak o ...

var store = { }; 

//store 'myKey' 
store.myKey = { foo: 'bar' }; 

//fetch 'myKey' 
var x = store.myKey; 

Również Googling z niemal dokładnie w tytule pytanie, byś znalazł http://pgte.github.com/alfred/

Naprawdę nie sądzę istnieje bardzo wiele particularily stabilne te dostępne jeszcze . Ofiary zewnętrzne są dość dobre, choć (np Redis.)

+0

Dzięki za sugestię! Alfred to realna możliwość, ale masz rację, nie wydaje mi się, że jest bardzo stabilny - ale zdecydowanie wart strzał. Prosty magazyn obiektów, taki jaki proponujesz, może działać, ale podejrzewam, że będzie się dusić, gdy uruchomię "zapytania", takie jak "pobierz wszystkie obiekty z właściwością X większą niż taka wartość", biorąc pod uwagę, że będę mieć kilkaset tysięcy wpisów. – eblume

+0

@telume tak, to całkiem możliwe .. Musisz wymyślić jakiś schemat indeksowania dla niego. Tak naprawdę po prostu pójdę z mongo lub redis jeśli to możliwe, oba są dość proste w konfiguracji. –

+0

Zgadzam się, że wydaje się, że łatwo jest połączyć się z istniejącą instancją redis lub uruchomić stałą lokalną instancję redis ... ale zastanawiam się, jak trudne/sensowne byłoby uruchomienie instancji redis z aplikacji węzła, użyj jej mało, a potem zamknij, kiedy skończysz? Przypuszczam, że przy użyciu modułu 'child_process' może działać. – eblume

2

Spróbuj nStore.

Jest w procesie przechowywania para klucz-wartość. Prosty w użyciu.

3

Spójrz na https://github.com/sergeyksv/tingodb. Jest ściśle zgodny z MongoDB API, więc możesz go uaktualnić do MongoDB, kiedy będziesz go potrzebować.

+0

Dzięki, dobra wskazówka. Przydatne w przypadkach, gdy chcesz połączyć DB w bibliotekę węzłów, ale chcesz również obsługiwać lepiej skalowalne rozwiązania –

1

Myślę, że możesz być zainteresowany final-db.

FinalDB używa systemu plików do przechowywania danych. Nie jest to sklep z kluczowymi wartościami, lecz oparte na dokumentach rozwiązanie: 01q. Obsługuje indeksy (mapy) - możesz określić funkcji mapy dla każdej kolekcji i oczywiście jest to rozwiązanie w procesie.