¿Convenciones de nombres de claves de Redis?


¿Cuál es la convención de nomenclatura normal para las claves en redis? He visto valores separados por : pero no estoy seguro de cuál es la convención normal, o por qué.

Para un usuario haría algo como...

user:00

Si el id del usuario era 00

¿Puede consultar solo el principio de la clave para devolver todos los usuarios?

Principalmente solo espero evitar cualquier problema futuro investigando las formas en que funcionan para las personas y por qué las eligieron.

Author: d-_-b, 2011-08-06

4 answers

¿Cuál es la convención de nomenclatura normal para las claves en redis? He visto valores separados por: pero no estoy seguro de cuál es la convención normal, o por qué.

Sí, el signo de dos puntos : es una convención al nombrar claves. En se indica este tutorial en el sitio web de redis: Intenta seguir un esquema. Por ejemplo "object-type: id: field" puede ser una buena idea, como en "usuario:1000:contraseña". Me gusta usar puntos para campos de varias palabras, como en "comment:1234:reply.to".

¿Puede consultar solo el principio de la clave para devolver todo los usuarios?

Si te refieres a una consulta directa de todas las claves que comienza con user:, hay un comando keys para eso. Sin embargo, este comando debe usarse solo con fines de depuración, ya que es O(N) porque está buscando a través de todas las claves strored en la base de datos.

La solución más apropiada para este problema es crear dedicated key, let's name is users, que almacenará todas las claves de los usuarios, por ejemplo, en list o set data structure.

 144
Author: yojimbo87,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-07 07:37:53

Usamos dos puntos (:) como separador de espacio de nombres y un hash ( # ) para las partes id de las claves, por ejemplo:

logistics:building#23
 22
Author: The Nail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-29 21:52:43

Una convención parece ser dos puntos (:) pero Soy un desarrollador web, así que personalmente prefiero slash (/) para el separador. Slash ya es un separador importante dentro de las URL que están destinadas a ser Localizadores de recursos uniformes así que tipo de claves para los recursos. ¿Por qué tomar un enfoque diferente con colon (:)? ¿Ayuda en algo?

Considere este ejemplo:

Tenemos una API RESTful para objetos de juguete. Hay una:

http://example.com/api/toy/234 

Donde lo tenemos almacenado? Usamos Redis y barras para que la clave sea obvia:

toy/234

Esta es la clave única para el juguete. La clave ahora se puede usar también en el lado del cliente:

{
    key: "toy/234",
    color: "red",
    url: function () {
        return API_BASE_URL + this.key;
    }
}

Un usuario solicita un objeto con clave toy/666. ¿Cómo obtenerlo de Redis? nodo.js ejemplo relacionado:

redis.get(key, function reply_callback(error, toystring) {
    var toy = JSON.parse(toystring);
    ...
}

No es necesario convertir barras a dos puntos y viceversa. Conveniente, no crees?

Nota: siempre asegúrese de que el usuario pueda acceder solo a las cosas que pretendía. El enfoque de URL a clave sin procesar arriba es capaz de obtener user/1/password también, como han señalado los comentaristas. Esto no debería ser un problema si usa Redis como caché pública de solo lectura.

 12
Author: Akseli Palén,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 11:11:39

Todavía no se si realmente existen "mejores prácticas" generalizadas para el nombramiento de claves de Redis.

He experimentado con el uso de caracteres ASCII NUL como mis separadores (ya que Redis y Python están limpios de 8 bits). Se ve un poco feo si estás mirando claves raw, pero la idea es esconderlo detrás de una capa de abstracción. Los dos puntos y los símbolos de tubo son alternativas obvias siempre y cuando los componentes de su espacio de nombre estén garantizados para no usarlos o esté dispuesto a codificar cada uno componente según sea necesario. Sin embargo, si los codificara, entonces querría desarrollar la capa de abstracción y evitar ver las claves raw de todos modos ... lo que me trajo de vuelta a usar \0 en mi razonamiento.

Voy a ser interesante en ver si se articulan otras opiniones sobre esto.

 5
Author: Jim Dennis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-10 16:39:23