2012-05-02 10 views
5

Tengo la necesidad de almacenar algunos metadatos en una aplicación node.js que estoy escribiendo. En lugar de crear mi propio formato de archivo y administrar ese archivo, me gustaría usar un almacén de valores clave persistentes en proceso.Almacén de valores-clave persistentes en proceso para node.js

Estaba viendo mongodb, pero parece que mongodb siempre debe estar fuera de proceso (es decir, primero debe iniciar un servidor mongo, luego conectarse a node.js.) Exijo que lo que sea almacenar esto es, que existe por completo dentro del proceso node.js, o al menos que la biblioteca gestiona completamente los procesos externos de forma transparente y los elimina cuando la aplicación cierra la conexión.

No me importa mucho el rendimiento, pero sería bueno admitir I/O asíncrona a la tienda para mantenerse al día con toda la asincrónica de Node.

También sería bueno si la tienda admite índices, ya que definitivamente voy a consultar los datos de una manera en que los índices serían útiles.

Estoy bastante seguro de que 'sqlite' me funcionaría, excepto que realmente no lo veo tan conveniente como una tienda de valores-clave. Idealmente, debería poder hablar en JSON, no en SQL. Pero sqlite funcionará si no existe nada mejor.

Gracias!

+0

Por favor, ¿podría explicar _por qué_ usted mismo sujetos a esta restricción? –

+0

Utilice un objeto Javascript. Si solo tiene un proceso, entonces la asincronía es irrelevante. –

+0

¿realmente necesitas una base de datos para persistir "algunos metadatos"? No lo creo. –

Respuesta

2

Usted podría estar interesado en utilizar Redis http://redis.io/

Hay una biblioteca de ayuda popular para el nodo https://github.com/mranney/node_redis

entonces usted puede hacer esto:

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

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

Gracias, pero lamentablemente esto no parece estar en proceso; requiere un proceso de servidor que se ejecute externamente. – eblume

+1

Al final, fui con esto. Para que parezca un proceso único para el usuario final, configuro un servidor redis local en un puerto no privilegiado desde el nodo utilizando 'child_process.spawn', y me aseguro de cortarlo antes de salir. Gracias por la sugerencia! – eblume

+0

Es un enfoque bastante novedoso. Me alegra que lo hayas hecho funcionar. Esperemos que empacar la instalación de redis como parte de su aplicación no sea demasiado problemático. – 250R

-1

¿Qué tal ...

var store = { }; 

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

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

También, buscar en Google con casi exactamente el título de la pregunta, se habrían encontrado http://pgte.github.com/alfred/

Yo no creo realmente que hay muchas otras particularily estables disponibles por el momento . Las ofertas externas son bastante bueno, aunque (por ejemplo Redis.)

+0

¡Gracias por la sugerencia! Alfred es una posibilidad real, pero tienes razón, no me parece que sea muy estable, pero definitivamente vale la pena intentarlo. Una tienda de objetos simple como la que propones podría funcionar, pero sospecho que se ahogará cuando ejecuto 'consultas' como "obtener todos los objetos con propiedad X mayor que dicho valor", dado que tendré unos cientos de miles de entradas. – eblume

+0

@eblume, sí, es bastante posible ... Tendría que idear algún esquema de indexación para ello. Realmente iría con mongo o redis si es posible, ambos son bastante simples de configurar. –

+0

Acepto que parece sencillo interactuar con una instancia de redis existente o iniciar una instancia de redis local permanente ... pero me pregunto qué difícil/razonable sería comenzar una instancia de redis desde una aplicación de nodo, usarla poco, luego cerrarlo cuando haya terminado? Supongo que usar el módulo 'child_process' podría funcionar. – eblume

3

Echa un vistazo a https://github.com/sergeyksv/tingodb. Es estrechamente compatible con MongoDB API para que pueda actualizar a MongoDB cuando lo necesite.

+0

Gracias, buen consejo. Útil en casos en los que desee agrupar un DB en la biblioteca de su nodo, pero también desea admitir mejores soluciones escalables –

1

Creo que le puede interesar final-db.

FinalDB usa el sistema de archivos para almacenar sus datos. No es un almacén de valores clave, pero basado en documentos solución nosql. Admite índices (mapas): puede especificar funciones de mapa en cada colección y, por supuesto, es una solución en proceso.

0

Eche un vistazo a levelup. Esto es un contenedor alrededor de leveldb. El contenedor de niveles instala leveldb a través de npm y se ejecuta por completo dentro del proceso de su nodo.

Hay muchas bases de datos construidas encima de leveldb. Eche un vistazo a https://github.com/rvagg/node-levelup/wiki/Modules para obtener una lista.

Para mayor comodidad se puede usar el paquete level el cual agrupa tanto LevelUp y leveldown juntos

Cuestiones relacionadas