2011-03-06 10 views
5

Me gustaría eliminar la dependencia de sql de pequeños fragmentos de datos que cargo en (casi) cada solicitud en una aplicación web. La mayoría de los datos son de valor clave/documento estructurado, pero no se excluye una solución relacional. Los datos no son demasiado grandes, así que quiero mantenerlos en la memoria para una mayor disponibilidad.Recomendación para una base de datos en memoria

¿Qué solución recomendarías?

+0

¿Puedes compartir qué pila web estás utilizando? LAMP o .NET o? – DuckMaestro

Respuesta

6

El almacenamiento de clave-valor en memoria más simple y más utilizado es MemcacheD. La página de introducción reitera lo que está pidiendo:

Memcached es un almacén de claves-valor en memoria de los pequeños trozos de datos arbitrarias (cuerdas, objetos) a partir de los resultados de las llamadas bases de datos, llamadas a la API, o la página representación.

La lista de clientes es impresionante. Ha sido por un largo tiempo. Buena documentación. Tiene API para casi todos los lenguajes de programación. La escala horizontal es bastante simple. Según mi experiencia, Memcached es bueno.

Es posible que también desee consultar MemBase.

1

No estoy seguro de que esto sea lo que está buscando, pero debe buscar en un marco de almacenamiento en caché (algo que puede estar incluido en las herramientas que está utilizando ahora). Con un patrón de repositorio, solicita los datos, allí verifica si los tiene en caché por clave. Yo no, lo traes de la base de datos, si lo haces, lo traes del caché.

Depende del tipo de datos que maneje, por lo que depende de usted decidir durante cuánto tiempo mantener los datos en el caché. Quizás un tiempo límite de deslizamiento es mejor ya que conservará los datos siempre que la clave siga siendo solicitada. Lo que significa que si la memoria caché tiene datos para un usuario, una vez que el usuario se va, los datos caducarán desde la memoria caché.

6

Redis es perfecto para este tipo de datos. También es compatible con algunas estructuras de datos fundamentales y proporciona operaciones sobre ellas.

Recientemente convertí mi aplicación de foro Django para usarla en todos los datos de seguimiento/en tiempo real - es tan bueno que ya no tiene la sensación desagradable que tiene cuando hace este tipo de cosas (SET views = views + 1 y otras escrituras en cada página ver) con una base de datos relacional.

He aquí un ejemplo del uso de Redis para almacenar datos necesarios para el seguimiento de la actividad del usuario, incluyendo el mantenimiento de un conjunto ordenado de últimos usuarios visto hasta la fecha, en Python:

def seen_user(user, doing, item=None): 
    """ 
    Stores what a User was doing when they were last seen and updates 
    their last seen time in the active users sorted set. 
    """ 
    last_seen = int(time.mktime(datetime.datetime.now().timetuple())) 
    redis.zadd(ACTIVE_USERS, user.pk, last_seen) 
    redis.setnx(USER_USERNAME % user.pk, user.username) 
    redis.set(USER_LAST_SEEN % user.pk, last_seen) 
    if item: 
     doing = '%s <a href="%s">%s</a>' % (
      doing, item.get_absolute_url(), escape(str(item))) 
    redis.set(USER_DOING % user.pk, doing) 
3

Si no te importa el sql pero desea mantener el db en la memoria, es posible que desee verificar sqlite (consulte http://www.sqlite.org/inmemorydb.html).

Si no quiere el sql y realmente solo tiene pares clave-valor, ¿por qué no simplemente almacenarlos en un mapa/hash/matriz asociativa y terminar con ellos?

2

Si termina necesitando una base de datos en memoria, H2 es una muy buena opción.

2

Una base de datos más a tener en cuenta: Berkeley DB. Berkeley DB le permite configurar la base de datos para que esté en la memoria, en el disco o en ambos. Admite tanto una clave-valor (NoSQL) como una API SQL. Berkeley DB se usa a menudo en combinación con aplicaciones web porque está integrado, se implementa fácilmente (se implementa con su aplicación), es altamente configurable y muy confiable.Existen varios sitios web de e-Retail que dependen de Berkeley DB para sus aplicaciones de comercio electrónico, incluido Amazon.com.

+2

Debe revelar su relación con BDB en esta respuesta. – user7116

+1

Otro problema con BerkeleyDB es su licencia de AGPL, lo que significa que si desea usarla en su aplicación, debe comprar una licencia de propiedad o abrir su aplicación de código abierto. – user1876508

0

¿Puede sincronizar esta información? ¿El patrón de acceso a los datos es simple y estable (no cambia con los requisitos comerciales cambiantes)? ¿Qué tan crítico es esta información (el contexto de la sesión, por ejemplo, no es demasiado difícil de restaurar, mientras que algunas preferencias que un usuario ha ingresado en una página de configuración no se deben perder)?

Normalmente, siempre que pueda fragmentar y sus patrones de acceso a datos sean simples y no muten demasiado, elija Redis. Si busca algo más confiable y admite patrones de acceso a datos más avanzados, Tarantool es una buena opción.

0

Por favor, echa un vistazo a esto:

http://www.mongodb.org/

Es una muy buena base de datos SQL-n con los controladores y soporte para todos los idiomas.

Cuestiones relacionadas