2010-10-28 6 views
8

Estamos utilizando Redis como un servidor de almacenamiento en caché, y a menudo tenemos que lidiar con la lista de almacenamiento en caché. Cuando guardamos en caché objetos simples hacemos un GET y Redis devolverá nulo si el objeto no existe y sabremos que el objeto no está en la memoria caché y debe cargarse desde la base de datos.¿Cuál es la mejor práctica para el manejo de listas y conjuntos en Redis?

Pero, ¿cómo podemos manejar lo mismo para las listas? Una lista vacía puede ser un valor válido. ¿Necesitamos llamar a EXISTS para verificar si existe la lista (pero haciendo las llamadas de la operación 2 en lugar de una) o alguien tiene una mejor idea de cómo manejar este escenario?

/Gracias

Respuesta

9

Si es absolutamente necesario hacer eso, cuando se crea la lista puede insertar un "centinela" como primer elemento que nunca se elimina. Para hacer esto atómicamente, puede usar MULTI/EXEC/WATCH, pero Watch solo está disponible en Redis 2.2, que actualmente es una vista previa (aunque bastante estable, puede tomarlo de la rama principal de Github).

Creo que en su caso de uso es posible que también desee RPUSHX y LPUSHX, que presionarán atómicamente contra una lista solo si ya existe.

Nota que desde Redis 2,2 a existir medios para tener al menos 1 elemento de una lista, como listas que llegarán a cero elementos se eliminan automáticamente, por muchas buenas razones;)

+1

Después de un poco más de consideración, creo que mi solución será simplemente no regenerar la lista automáticamente, sobre la marcha. Mi preocupación era la siguiente: inserté un registro en una base de datos y lo agregué a una lista de Redis simultáneamente. Si Redis se bloqueara (y quizás pierda el último segundo de las transacciones), ¿cómo podría llegar a un estado en el que la base de datos y Redis estén sincronizados de nuevo? Creo que he encontrado una solución que significa que si Redis fallara, la situación tendrá que recuperarse manualmente al volver a sincronizar las listas desde la base de datos. Ah, y gracias por el buen trabajo :-) – Micael

+0

+1 por ser la respuesta correcta. ¿Pero podría señalarme sus "buenas razones"? Los conjuntos vacíos y las listas son diferentes de los que no existen. – Crisfole

-1

Si está utilizando php, me asignar el valor devuelto a una variable y luego verificar si se trata de una matriz. (Esto es cómo funciona usando la biblioteca Predis)

$res = $redis->get('Key'); 
if(is_array($res)) 
    do code here 
3

Por desgracia, no parecen Lista/set comandos de recuperación tales como LRANGE y SMEMBERS distinguir entre una lista vacía/set y una lista inexistente/set.

Si necesita absolutamente distinguir entre los dos casos, supongo que primero tendrá que hacer un EXISTO. Intente canalizar sus comandos para un mejor rendimiento. La mayoría de las bibliotecas de clientes de Redis admiten la canalización.

O puede que reconsidere su estrategia de almacenamiento en caché para que no tenga que distinguirlos.

+0

Desde redis v2.0 trata a listas vacías , SET, ZSET y HASHE del mismo modo que los existentes. Cuando haya eliminado todos los elementos de una lista, ¡el comando EXISTS devolverá falso! –

+0

@Ludger Sprenker Wow, ¡yo no sabía eso! Solo había probado esto con 1.2.6 antes. Esta es la estrategia de almacenamiento en caché de Micael. – kijin

Cuestiones relacionadas