sql >> Base de Datos >  >> NoSQL >> Redis

Buscando en valores de una redis db

Redis es para casos de uso en los que necesita acceder y actualizar datos con una frecuencia muy alta y en los que se beneficia del uso de estructuras de datos (hashes, conjuntos, listas, cadenas o conjuntos ordenados). Está hecho para llenar casos de uso muy específicos. Si tiene un caso de uso general, como una búsqueda muy flexible, sería mucho mejor que algo creado para este propósito, como la búsqueda elástica o SOLR.

Dicho esto, si debe hacer esto en Redis, así es como lo haría (suponiendo que los usuarios puedan compartir nombres y números de teléfono):

name:some_name -> set([id1, id2, etc...])
name:some_other_name -> set([id3, id4, etc...])

phone:some_phone -> set([id1, id3, etc...])
phone:some_other_phone -> set([id2, id4, etc...])

id1 -> {'name' : 'bob', 'phone' : '123-456-7891', etc...}
id2 -> {'name' : 'alice', 'phone' : '987-456-7891', etc...}

En este caso, estamos creando una nueva clave para cada nombre (con el prefijo "nombre:") y cada número de teléfono (con el prefijo "teléfono:"). Cada clave apunta a un conjunto de ID que tienen toda la información que desea para un usuario. Cuando busque un teléfono, por ejemplo, hará lo siguiente:

HGETALL 'phone:123-456-7891'

y luego recorra los resultados y devuelva cualquier información sobre cada uno (nombre en nuestro ejemplo) en el idioma de su elección (puede hacer todo esto en Lua del lado del servidor en el cuadro Redis para ir aún más rápido y evitar la red de ida y vuelta). adelante, si quieres):

for id in results:
    HGET id 'name'

Su costo aquí será O(m) donde m es la cantidad de usuarios con el número de teléfono dado, y esta será una operación muy rápida en Redis debido a lo optimizado que está para la velocidad. Será excesivo en su caso porque probablemente no necesite que las cosas vayan tan rápido y preferiría tener una búsqueda flexible, pero así es como lo haría.