2012-04-11 14 views
6

Me preguntaba cuáles eran los beneficios de usar ID de usuario en lugar de simplemente usar el nombre de usuario único para las claves.Nombre de usuario o ID para las claves en Redis

  • usuario: NOMBRE DE USUARIO => {contraseña: HASH, edad: 45}
  • usuario: 0 => {El nombre de usuario, contraseña: HASH, edad: 45}

en cuenta que yo desearía buscar usuarios por nombre, por lo tanto, requiere un segundo conjunto de pares clave-valor para relacionar los nombres de usuario con los ID.

Dado que cada nombre de usuario es único y tiene que ser alfanumérico, ¿hay alguna razón en particular por la cual puede ser beneficioso usar el sistema de identificación?

La razón principal por la que pregunto esto es porque utilicé principalmente ID, ya que disminuyeron los tiempos de búsqueda en mi base de datos, especialmente cuando la base de datos se normalizó de alguna manera. Pero Redis no obtiene este beneficio, por lo que me pregunté qué otras razones podría haber para usar ID de usuario en lugar de solo los nombres de usuario.

Gracias por cualquier ayuda,

Pluckerpluck

P. S. Debido a la forma en que Redis maneja hashes, en realidad no estoy seguro de las diferencias de memoria entre los dos métodos, así que la información sobre esto puede ser buena, aunque puedo ir y probarlo yo mismo más adelante.

Respuesta

13

No importa en el caso de uso que haya definido, pero el uso de identificadores de usuario enteros tiene otras ventajas.

Tarde o temprano, querrá hacer referencia a los identificadores de usuario en otros objetos. Por ejemplo, "Friends of user pluckerpluck". Para crear un modelo que, tendría dos alternativas -

friendsof:pluckerpluck -> SET{tom, dick, harry}

VS

friendsof:1 --> SET{2, 3, 4}

El primer enfoque utiliza una tabla hash regular para almacenar los elementos, y utiliza una gran cantidad de memoria. El último enfoque utiliza una matriz de enteros y es extremadamente eficiente con la memoria.

Esta codificación especial para conjuntos de enteros se denomina IntSet. Puede controlar el comportamiento de Redis utilizando la propiedad set-max-intset-entries

# Sets have a special encoding in just one case: when a set is composed 
# of just strings that happens to be integers in radix 10 in the range 
# of 64 bit signed integers. 
# The following configuration setting sets the limit in the size of the 
# set in order to use this special memory saving encoding. 
set-max-intset-entries 512 
+0

Gracias por señalar ese escenario. Solo una pregunta rápida: si tuviera que usar ID. Entonces necesitaría una relación de usuario ID para permitir buscar nombres de usuario. ¿Crees que un conjunto ordenado (el rango es el id) sería una buena manera de hacerlo? O en su lugar, un hash? – Pluckerpluck

+2

Hash es mejor por dos motivos: a) Utiliza menos memoria que un conjunto ordenado, yb) No existe un orden definido de usuarios, por lo que conceptualmente no tiene sentido utilizar un conjunto ordenado. –

+0

Usaría un hash para indexar nombres de usuario. Son mucho más compactos que zset en la memoria. Usar un zset solo sería útil si tuviera que admitir consultas de rango en nombres ... –

Cuestiones relacionadas