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

Consulta de campos múltiples en Redis usando Redis Spring

Consulte Spring Data Redis - 8.5. Índices secundarios y:

  • 8.6. Consulta por ejemplo
  • 8.10. Consultas y métodos de consulta

La anotación @Indexed indica a Spring Data Redis (SDR) que cree un índice secundario como un conjunto para indexar el campo del hash.

Esto significa que cuando inserte datos, SDR ejecutará siete comandos en Redis:

HMSET "OrgWork:19315449-cda2-4f5c-b696-9cb8018fa1f9" "_class" "OrgWork" 
    "id" "19315449-cda2-4f5c-b696-9cb8018fa1f9" 
    "CorpDetails" "CorpDetailsValueHere" "ContractType" "ContractTypeValueHere" 
    ... "Country" "Costa Rica"
SADD  "OrgWork" "19315449-cda2-4f5c-b696-9cb8018fa1f9"                           
SADD  "OrgWork:CorpDetails:CorpDetailsValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
SADD  "OrgWork:ContractType:ContractTypeValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
...
SADD  "OrgWork:Country:Costa Rica" "19315449-cda2-4f5c-b696-9cb8018fa1f9"

Uso de consulta por ejemplo:

Quiere crear un repositorio:

interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
}

Y luego implemente la consulta como en el servicio de ejemplo a continuación:

class OrgWorkService {

  @Autowired OrgWorkRepository orgWorkRepository;

  List<OrgWork> findOrgWorks(OrgWork probe) {
    return orgWorkRepository.findAll(Example.of(probe));
  }
}

Y usar como:

OrgWork orgWorkExample = new OrgWork();                          
orgWorkExample.setCorpDetails("CorpDetailsValueHere"); 
orgWorkExample.setContractType("ContractTypeValueHere");
...
List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);

Detrás de escena, SDR se encargará de convertir esto en comandos de Redis para obtener sus datos, usando una combinación de SINTER y HGETALL:

SINTER   …:CorpDetails:CorpDetailsValueHere   …:ContractType:ContractTypeValueHere   ...
HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3" 
HGETALL ...

Este es un proceso de dos pasos:

  1. Obtener claves contenidas en la intersección de índices secundarios, usando SINTER
  2. Obtenga cada clave devuelta por <1> individualmente, usando HGETALL

Una carga de trabajo de 100 000 por minuto debería ser manejable para Redis, suponiendo que tenga un servidor de calidad, un tamaño de conjunto de datos razonable y que las consultas sean algo específicas en promedio.

SINTER tiene una complejidad temporal de O(N*M) en el peor de los casos, donde N es la cardinalidad del conjunto más pequeño y M es el número de conjuntos. Tiene un conjunto para cada dimensión de su consulta.

HGETALL es O(N) donde N es el tamaño del hash, 7 en su caso.

Como siempre, se recomienda que realice algunas evaluaciones comparativas para comprobar si está obteniendo el rendimiento deseado y ajustar si es necesario.