2011-04-25 31 views
5

Supongamos que tengo algunas noticias almacenadas en un hash. Tengo diferentes valores hash (cada uno de hash representan uno de noticias):Redis: ¿Cómo puedo ordenar mi hash por claves?

news:1 
news:2 
news:3 
... 

Quiero recuperar todas las claves con las teclas de comando así:

KEYS news:* 

El problema de las teclas no se ordenan:

news:3 
news:1 
news:2 

Me gustaría recuperar la lista de claves en el orden correcto. No estoy seguro de que el hash sea la estructura que necesito. Pero, de acuerdo con el redis documentation:

Redis hashes son mapas entre campo de cadena y los valores de cadena, por lo que son el tipo de datos perfecta para representar objetos (por ejemplo, a los usuarios una serie de campos como nombre, apellido, edad, y así sucesivamente):

Almacenar mi objeto de noticias en un hash parece ser una buena idea.

¿Alguna sugerencia?

+0

Si desea las claves ordenadas, ¿está seguro de que es un hash y no una lista que desea? – Theo

+0

@Theo, es parte de mi pregunta. Consulte a continuación;) –

Respuesta

5

Piense en los hashes de Redis como documentos indexados.

HSET news:1 title levy_breaks 
HSET news:1 type breaking_news 
HSET news:1 byline alphazero 
HSET news:1 date 04:25:2011 
HSET news:1 content <the story> 

HSET news:2 ... 
.. 

En lo anterior, news:1 es la 'clave hash', seguido de un 'campo de hash' y el valor finalmente su asociado.

Dicho esto, parece que simplemente desea ordenar sus 'claves hash'.

Utilice una construcción MULTI/EXEC para establecer todos los campos de una noticia (que tiene n campos) y, finalmente, también agregue la clave hash, p. Ej. su noticia - a un conjunto ordenado. Alternativamente, puede agregarlos a una lista y usar el comando SORT en esa lista.

The Redis docs.

+0

¿Es posible detectar cuándo se agrega una clave a mi diccionario y luego agregar esta clave a mi lista ordenada?Sin esa característica, ¿cómo puedo estar seguro de que mi lista ordenada contiene la clave completa en mi hash en cualquier momento? Gracias. –

+0

Redis admite semántica de pub/sub. Por lo tanto, podría agregar una publicación de noticias: clave xxx (a "noticias: canal", por ejemplo) en el bloque multi/exec. Ver http://redis.io/topics/pubsub. Pregúntele al grupo de redis google ya que es muy posible que sea mucho más eficiente para lograr esto. – alphazero

+0

Gracias @alphazero! –

2

Lo que puede hacer es almacenar un conjunto o una lista de las noticias que existen. Por ejemplo, cuando crea una nueva noticia, digamos noticias: 4, podría agregar el índice 4 a un conjunto, por ejemplo, lista: noticias, que ahora tendría [1, 2, 3, 4].

Supongamos ahora que su estructura hash de noticias es fecha, autor. Con esto en su lugar se podría ejecutar lo siguiente: lista

tipo: noticias get * -> some_value_a -> * -> some_value_b

¿Eso tiene sentido? Espero que ayuda

0

tal vez usted puede intentar HSCAN, que se puede obtener una matriz 2D le gusta
[[key3, value3], [key1, value1], [key2, value2]]
cuales ordenar por orden de inserción claves. Pero solo está disponible desde Redis 2.8.0

Cuestiones relacionadas