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:
- Obtener claves contenidas en la intersección de índices secundarios, usando
SINTER
- 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.