La forma más rápida de comprobar si existe un objeto.
-
25-09-2019 - |
Pregunta
Estoy usando GAE/Java con Objectify y estoy tratando de encontrar la manera más rápida de verificar si un objeto determinado existe en el almacén de datos, dada la clave.Lo que estoy haciendo ahora es .get(key)
con @Cached
activado, pero de cualquier manera aún recupera el objeto completo, lo cual es innecesario.
¿Alguna idea sobre cómo hacer esto con un índice único?También estaba pensando en una consulta de solo claves, pero veo (en el panel de estado del sistema ) que la latencia es mucho más que una get
.
Solución
¿Alguna idea sobre cómo hacer esto con un índice solo golpe?También estaba pensando en una consulta de solo llaves
Una consulta de solo claves es la única forma de obtener un resultado de solo índice.Si es más rápido que get depende del tamaño de su entidad y del tamaño de su índice.En un ejemplo trivial, obtengo alrededor de 8 ms para una obtención y 13 ms para una consulta.Puedes utilizar AppStats para determinar cuál es más barato para ti con datos reales.
Otros consejos
Sólo realice get () con la caché de encendido. A menos que tenga una gran cantidad de lógica en un método caro @PostLoad, debería ser significativamente más barato para recuperar los datos de Memcache de lo que es ir todo el camino hasta el almacén de datos, incluso para una consulta de solo claves. La memoria caché es su amigo.
Como nota al margen, esto suena como la optimización prematura. Construir su aplicación utilizando el código conveniente más, Appstats a continuación, ejecutar y averiguar si los costes reales están en su aplicación. Es probable que encuentres que las partes caros no son lo que piensan.
Un claves sólo consulta con un filtro en __key__
será sustancialmente más rápido que las consultas de punto de referencia en el panel de estado. Si es o no es más rápido que simplemente ir a buscar la entidad no estoy seguro - prueba y se deja en contacto con nosotros
Puede probar unas teclas única consulta de Objectify como esto:
public static boolean objectExists(String id, Class<?> objectClass) {
return OfyService.ofy().load().filterKey(Key.create(objectClass, id)).keys().first() != null;
}