2009-06-22 14 views
5

Tengo una situación en la que realmente podría beneficiarme tener un sistema como memcached, pero con la capacidad de almacenar (por cada clave) una lista ordenada de elementos y modificar la lista mediante la adición de valores.¿Hay algo así como memcached, pero para listas ordenadas?

Por ejemplo:

something.add_to_sorted_list('topics_list_sorted_by_title', 1234, 'some_title') 
something.add_to_sorted_list('topics_list_sorted_by_title', 5436, 'zzz') 
something.add_to_sorted_list('topics_list_sorted_by_title', 5623, 'aaa') 

que luego podría utilizar como esto:

something.get_list_size('topics_list_sorted_by_title') 
// returns 3 
something.get_list_elements('topics_list_sorted_by_title', 1, 10) 
// returns: 5623, 1234, 5436 

Sistema necesario permitiría que consiga fácilmente elementos cuentan en cada matriz, a buscar cualquier número de valores de la matriz, con la suposición de que los valores se ordenan utilizando el valor adjunto.

Espero que la descripción sea clara. Y la pregunta es relativamente simple: ¿hay algún sistema de este tipo?

Respuesta

4

Redis admite listas y conjuntos.Puede deshabilitar el almacenamiento de disco y usarlo como Memcached en lugar de ir a MongoDB que guardará los datos en el disco.

6

Eche un vistazo a MongoDB. Utiliza archivos mapeados en memoria, por lo que es increíblemente rápido y debe funcionar en un nivel comparativo con MemCached.

MongoDB es una base de datos sin esquema que debe apoyar lo que está buscando (movimiento/clasificación)

+0

Según entiendo los documentos, la ordenación se realiza en tiempo de recuperación, lo cual no es realmente útil para mí, incluso el almacenamiento basado en memoria, la clasificación de elementos de 1 millón, utilizando valores de texto de hasta 200 caracteres será bastante lento. Pero tal vez lo entendí mal - revisará los documentos en profundidad. –

3

MongoDB encajará. Lo importante que tiene índices, por lo que puede añadir un índice por título para la recolección de los temas y luego recuperar los elementos ordenados por el índice:

db.topics.ensureIndex({"title": 1}) 
db.topics.find().sort({"title": 1}) 
0

por qué no sólo almacenar una matriz en memcached? al menos en python y PHP, las API memcached admiten esto (creo que Python usa pickle pero no lo recuerdo).

si necesita almacenamiento de datos permanente o copia de seguridad, memcacheDB usa la misma API.

ejemplo pseudopython básica:

conseguir almacenan los datos almacenados = cache.get (storedDataName) Lista

initialize si no se ha almacenado nada previamente si (almacenado == Ninguno): almacenado = {}

---------------- artículos Buscando a almacenado

intento: alreadyHaveItem = almacenada [itemKey] excepto KeyError: de impresión 'ningún resultado en caché'

--------------- - la adición de nuevos elementos

para el punto en newItemsDict: almacenan [artículo] = newitems [artículo]

---------------- guardando los resultados en el caché cache.set (storedDataName, stored, TTL)

+0

porque es difícil mantener ordenada la lista en caso de que tengamos más de 1 proceso añadiéndole elementos –

+0

, también podría mantener una lista de dictados o incluso objetos o una/varias listas ordenadas de claves para dichos objetos. .etc ... y usa la ordenación por inserción ... hago este tipo de cosas para los rankings de usuarios. de hecho, tengo mis múltiples procesos soltando trabajos en la misma cola (que TAMBIÉN está almacenada en memcached) y luego se procesan en orden, formando una fuente para la inserción ... de todos modos, estoy seguro de que conoces mejor tu espacio problemático que Sí, no puedo determinar la complejidad de lo que escribiste. buena suerte –

+0

En realidad, puede hacer la clasificación en el lado del cliente y CAS de forma segura, independientemente de la concurrencia. Hay algunas estrategias para hacer tal cosa. – Dustin

Cuestiones relacionadas