2012-05-02 7 views
5

Ho bisogno di memorizzare alcuni metadati in un'applicazione node.js che sto scrivendo. Piuttosto che inventare il mio formato di file e gestire quel file, mi piacerebbe utilizzare un archivio di valori-chiave persistenti in-process.Archivio chiavi permanenti in-process per node.js

Stavo guardando mongodb ma sembra che mongodb debba sempre essere eseguito fuori processo (cioè, è necessario avviare prima un server mongo, quindi collegarsi ad esso in node.js.) Richiedo che qualunque memorizza questo, che esiste interamente all'interno del processo node.js - o almeno che tutti i processi esterni sono interamente gestiti in modo trasparente dalla libreria e li uccide quando l'applicazione chiude la connessione.

Non mi interessa molto delle prestazioni, ma sarebbe bello supportare l'IO asincrono nello store per stare al passo con l'intera cosa asincrona di Node.

Sarebbe anche bello se l'archivio supportasse gli indici, perché sicuramente interrogherò i dati in un modo in cui gli indici sarebbero utili.

Sono abbastanza sicuro che "sqlite" potrebbe funzionare per me, tranne per il fatto che non lo ritengo davvero conveniente come un archivio di valori-chiave. Idealmente dovrei essere in grado di parlare in JSON, non in SQL. Ma sqlite funzionerà se non esiste nulla di meglio.

Grazie!

+0

prega Ci può spiegare _perché_ voi stessi soggetti a questo vincolo? –

+0

Utilizzare un oggetto Javascript. Se hai solo un processo, allora l'asincronia è discutibile. –

+0

hai davvero bisogno di un database per persistere di "alcuni metadati"? Io non la penso così –

risposta

2

potreste essere interessati a utilizzare Redis http://redis.io/

C'è una libreria di supporto popolare per il nodo https://github.com/mranney/node_redis

allora si può fare questo:

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

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

Grazie, ma sfortunatamente questo non sembra essere in-process - richiede un processo server in esecuzione esternamente. – eblume

+1

Alla fine, sono andato con questo. Per farlo apparire come un singolo processo per l'utente finale, faccio ruotare un server redis locale su una porta non privilegiata dal nodo usando 'child_process.spawn', e assicurati di distruggerlo prima di uscire. Grazie del suggerimento! – eblume

+0

Questo è un approccio abbastanza nuovo. Sono contento che tu abbia funzionato. Si spera che impacchettare l'installazione di redis come parte della tua app non sia troppo problematico. – 250R

-1

ne dite ...

var store = { }; 

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

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

Inoltre, Googling con quasi esattamente il vostro titolo della domanda, si sarebbe trovato http://pgte.github.com/alfred/

Io in realtà non credo che ci sono ancora molti quelli particularily stabili disponibili . Le offerte esterne sono abbastanza buone anche se (ad es Redis.)

+0

Grazie per il suggerimento! Alfred è una possibilità reale, ma hai ragione, non mi sembra di essere estremamente stabile - ma ne vale sicuramente la pena. Un semplice negozio di oggetti come si propone potrebbe funzionare, ma ho il sospetto che soffocherà quando eseguo 'query' come "ottenere tutti gli oggetti con la proprietà X superiore a tale valore", dato che avrò poche centinaia di migliaia di voci. – eblume

+0

@eblume si, è abbastanza possibile .. Avresti bisogno di inventare uno schema di indicizzazione per questo. Mi piacerebbe davvero andare con mongo o redis se possibile, entrambi sono abbastanza semplici da configurare. –

+0

Sono d'accordo che sembra semplice interfacciarsi con un'istanza redis esistente o avviare un'istanza redis locale permanente ... ma mi chiedo quanto sia difficile/ragionevole iniziare un'istanza redis da un'app nodo, usarla piccolo, quindi spegnilo quando hai finito? Suppongo di usare il modulo 'child_process' che potrebbe funzionare. – eblume

3

Dai uno sguardo a https://github.com/sergeyksv/tingodb. È strettamente compatibile con l'API MongoDB, quindi è possibile eseguire l'aggiornamento a MongoDB quando ne avrai bisogno.

+0

Grazie, buon consiglio. Utile nei casi in cui desideri raggruppare un DB nella libreria dei nodi, ma vuoi anche supportare soluzioni scalabili –

1

Penso che potresti essere interessato a final-db.

FinalDB utilizza il file system per archiviare i suoi dati. Non è un negozio a valore-chiave ma è la soluzione nosql basata su documenti basata su documenti. Supporta gli indici (mappe) - è possibile specificare le funzioni di mappa su ciascuna raccolta e, naturalmente, è una soluzione nella procedura.

0

Dai uno sguardo allo levelup. Questo è un wrapper intorno a leveldb. Il wrapper levelup installa leveldb via npm e viene eseguito interamente all'interno del processo del nodo.

Ci sono molti database costruiti sopra a leveldb. Dai un'occhiata a https://github.com/rvagg/node-levelup/wiki/Modules per un elenco.

Per comodità è possibile utilizzare il pacchetto level quali bundle sia LevelUp e leveldown insieme

Problemi correlati