Redis convenciones de nomenclatura clave?

226

¿Cuáles son las convenciones de nomenclatura normales 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 la identificación del usuario era 00

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

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

lujoso
fuente

Respuestas:

205

¿Cuáles son las convenciones de nomenclatura normales 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 este tutorial en el sitio web de redis se dice: Intenta seguir con un esquema. Por ejemplo, "object-type: id: field" puede ser una buena idea, como en "user: 1000: password". Me gusta usar puntos para campos de varias palabras, como en "comentario: 1234: respuesta.a".

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

Si quiere decir algo como consultar directamente todas las claves que comienza con user:un comando de teclas para eso. Sin embargo, este comando debe usarse solo para fines de depuración, ya que es O (N) porque está buscando en todas las claves almacenadas en la base de datos.

La solución más adecuada para este problema es crear una clave dedicada, nombremos users, que almacenará todas las claves de los usuarios, por ejemplo, en una lista o estructura de datos establecida .

yojimbo87
fuente
1
scanno es la opción @EranH., es la mejor práctica para iterar claves. scanse usa para iterar de manera incremental sobre una colección de elementos.
Kishor Pawar
2
@ yojimbo87 Entonces habrá dos comandos, digamos primero, crear una clave como: usuario: 808021: contraseña = XYZ y el segundo es poner la clave en el registro o índice (conjunto), pero qué sucederá cuando un comando se ejecute con éxito y otro falla, significa que las claves se crearon pero no se ingresa al registro
LoveToCode
1
@LoveToCode Puede usar la transacción que debería garantizar que se ejecutarán todas o ninguna de las operaciones.
yojimbo87
2
También noté que Redis Desktop Manager (una herramienta de cliente de Redis) también trata los dos puntos ':' como separador, y muestra varias claves agrupadas
Adam Rotaru
1
Soy de la opinión de que el valor único sea el último. Facilita hacer algo como:$redis->delete($redis->keys('user:password:*'));
Lápices
26

Utilizamos dos puntos (:) como separador de espacio de nombres y un hash (#) para las partes de identificación de las teclas, por ejemplo:

logistics:building#23
La uña
fuente
¿Cuál es la mejor convención de nombres si tiene más claves como configuración regional, categoría, etc.? {recurso}: {clave} # {valor}, {clave} # {valor} => textos: locale # en, categoría # 15? ¿O tienes alguna otra sugerencia?
fsasvari
1
En mi ejemplo, "edificio" es solo el nombre de la "colección", y 23 es el "id" personalizado. Si tiene una identificación compuesta con locale = en y category = 15, entonces la identificación real podría ser {en, 15}, por lo que el espacio de nombres: textos # {en, 15}, o para ser más detallado: espacio de nombres: textos # {locale = es, categoría = 15}. Pero esto es solo una idea, nunca lo he usado así. Tenga cuidado de no cambiar el orden de los elementos id, porque la clave no se encontrará, por supuesto. En realidad, en lugar de codificar tal complejidad en sus nombres clave, considere usar estructuras de datos redis en su lugar. Echa un vistazo a redis.io/topics/indexes
The Nail el
16

Una convención parece ser dos puntos (:) pero soy un desarrollador web, así que personalmente prefiero la barra diagonal (/) para el separador. Slash ya es un separador tan importante dentro de las URL que están destinadas a ser localizadores uniformes de recursos, por lo que son un tipo de claves para los recursos. ¿Por qué tomar un enfoque diferente con dos puntos (:)? ¿Ayuda algo?

Considere este ejemplo:

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

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

¿Dónde lo tenemos almacenado? Usamos Redis y barras, por lo que la clave es 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? Un ejemplo relacionado con Node.js:

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

No es necesario convertir barras en dos puntos y viceversa. Conveniente, ¿no te parece?

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

Akseli Palén
fuente
24
... conveniente, y casi asquerosamente inseguro. Estás rogando por obtener curl http://example.com/api/user/1/password'd, o similar. (Solo diciendo.)
ELLIOTTCABLE
3
Los dos puntos, los hash y las barras pueden usarse para designar diferentes niveles de anidación, por ejemploUser#23:uploads:my/path/to/file.ext
encarnado
31
Por favor, nunca tome la entrada del usuario como clave en la base de datos.
Lyle
1
Me gusta cómo creías que preferías las barras porque eres un desarrollador web.
Héctor Ordóñez
@ELLIOTTCABLE Gracias, se agregó una nota sobre las inseguridades. ¿Ve algún problema en este enfoque si Redis se utiliza como caché pública de solo lectura?
Akseli Palén
6

No sé si realmente existen "prácticas recomendadas" generalizadas para el nombre de claves de Redis todavía.

He experimentado con el uso de caracteres ASCII NUL como mis separadores (ya que Redis y Python son limpios de 8 bits). Se ve un poco feo si está mirando claves sin formato, pero la idea es ocultarlo detrás de una capa de abstracción. Los símbolos de dos puntos y tuberías son alternativas obvias siempre y cuando se garantice que los componentes de su espacio de nombres no los usarán o que esté dispuesto a codificar cada componente según sea necesario. Sin embargo, si las codificaría, entonces desearía desarrollar la capa de abstracción y evitar ver las claves sin procesar de todos modos ... lo que me llevó a volver a usar \ 0 en mi razonamiento.

Seré interesante para ver si se articulan otras opiniones sobre esto.

Jim Dennis
fuente
0

Para su caso de uso, me parece que HSET / HGET encajaría mejor. También hay un comando HKEYS .

Todos esos comandos tienen la misma complejidad que GET / SET / KEYS, entonces, ¿por qué no usarlos?

Podría tener esta estructura entonces:

  • usuarios> 00> valor
  • usuarios> 01> valor

o:

  • usuarios: nombre de usuario> 00> valor
  • usuarios: nombre de usuario> 01> valor

Simplemente extraiga la identificación del usuario y úsela como una clave hash. Personalmente, prefiero este enfoque, ya que se siente mejor y también puede consultar fácilmente las ID de usuario existentes.

vitro
fuente