¿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 .
scan
no es la opción @EranH., es la mejor práctica para iterar claves.scan
se usa para iterar de manera incremental sobre una colección de elementos.$redis->delete($redis->keys('user:password:*'));
Utilizamos dos puntos (:) como separador de espacio de nombres y un hash (#) para las partes de identificación de las teclas, por ejemplo:
fuente
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:
¿Dónde lo tenemos almacenado? Usamos Redis y barras, por lo que la clave es obvia:
Esta es la clave única para el juguete. La clave ahora se puede usar también en el lado del cliente:
Un usuario solicita un objeto con clave
toy/666
. ¿Cómo obtenerlo de Redis? Un ejemplo relacionado con Node.js: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.fuente
curl http://example.com/api/user/1/password
'd, o similar. (Solo diciendo.)User#23:uploads:my/path/to/file.ext
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.
fuente
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:
o:
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.
fuente