labs - ¿La longitud del nombre afecta el rendimiento en Redis?
redis vs mongodb (4)
Me gusta usar nombres detallados en Redis, por ejemplo set-allBooksBelongToUser:$userId
.
¿Está bien o eso afecta el rendimiento?
A Redis le gusta tener todas las llaves en la memoria. Cuanto más larga sea la longitud promedio de la clave, menos se puede retener en la memoria. Entonces, sí, la longitud de la clave puede tener un gran impacto en el rendimiento, pero probablemente no de manera significativa en lo que a usted respecta. Es decir, con un espacio de teclas pequeño (por ejemplo, uno que se adapta fácilmente a la memoria), una tecla de 128 bytes y una tecla de 16 bytes no funcionarán de manera espectacularmente diferente.
La clave de la que estás hablando no es realmente tan larga.
La clave de ejemplo que proporciona es para un conjunto, los métodos de búsqueda de conjunto son O (1). Las operaciones más complejas en un conjunto (SDIFF, SUNION, SINTER) son O (N). Lo más probable es que poblar $userId
una operación más costosa que usar una clave más larga.
Redis viene con una utilidad de referencia llamada redis-benchmark
, si modifica la prueba "GET" en src / redis-benchmark.c para que la clave sea solo "foo", puede ejecutar la prueba de clave breve después de una make install
:
diff --git a/src/redis-benchmark.c b/src/redis-benchmark.c
--- a/src/redis-benchmark.c
+++ b/src/redis-benchmark.c
@@ -475,11 +475,11 @@
benchmark("MSET (10 keys)",cmd,len);
free(cmd);
- len = redisFormatCommand(&cmd,"SET foo:rand:000000000000 %s",data);
+ len = redisFormatCommand(&cmd,"SET foo %s",data);
benchmark("SET",cmd,len);
free(cmd);
- len = redisFormatCommand(&cmd,"GET foo:rand:000000000000");
+ len = redisFormatCommand(&cmd,"GET foo");
benchmark("GET",cmd,len);
free(cmd);
Aquí está la velocidad de prueba GET para 3 carreras subsiguientes de la tecla corta "foo":
59880.24 requests per second
58139.53 requests per second
58479.53 requests per second
Aquí está la velocidad de prueba GET después de modificar nuevamente la fuente y cambiar la clave a "set-allBooksBelongToUser: 1234567890":
60240.96 requests per second
60606.06 requests per second
58479.53 requests per second
Cambiar la clave una vez más a "ipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumloreipsumlorem: 1234567890" da esto:
58479.53 requests per second
58139.53 requests per second
56179.77 requests per second
Entonces, incluso las claves realmente largas no tienen un gran impacto en la velocidad de redis. Y esto es en GET, una operación O (1). Las operaciones más complejas serían aún menos sensibles a esto.
Creo que tener claves que identifiquen claramente los valores que poseen supera con creces cualquier rendimiento de velocidad minúsculo que obtendría de las teclas abreviadas.
Si desea llevar esto más allá, también hay un parámetro -r [keyspacelen]
en la utilidad redis-benchmark que le permite crear claves aleatorias (siempre y cuando tengan '': rand:'' en ellas), podría simplemente aumentar el tamaño del prefijo en el código de prueba a la longitud que quisieras.
No creo que la longitud del nombre de la variable afecte el rendimiento, la variable ocupará el mismo lugar que cualquier variable para ese tipo de datos, siempre que no exceda la longitud máxima del nombre.
No puedo responder a esta pregunta con certeza. Sin embargo, puedo hacer algunas preguntas al respecto y ofrecer algunas observaciones.
Creo que es obvio que claves extremadamente largas (nombres) y / o valores tendrían un impacto en el rendimiento general si se pueden usar. Estos impactos podrían ser en el cliente, en la red o en el servidor. Así que la primera pregunta para arrastrar de los suyos sería:
¿Cuánto tiempo pueden estar las llaves y los valores entre Redis y sus clientes?
La búsqueda en Redis , la longitud de la clave y los límites me da una entrada de blog interesante en Redis frente a memcached, que puede comenzar a responder a su pregunta. La primera respuesta a esa entrada de blog parece haber sido escrita por Salvatore Sanfilipo, creador de Redis (principios del otoño pasado: 09/2010), lo que sugiere que una versión más reciente arrojaría resultados significativamente mejores. Dos comentarios más abajo nos vinculan a Redis / memcached Benchmark de Salvatore que se publicó unos días después de haber respondido al "blagger" original (que parece ser anónimo).
Esto no responde las preguntas (¿cuánto tiempo pueden durar las claves y en qué puntos hay impactos detectables en el rendimiento)? Sin embargo, nos da una pista sobre cómo abordar la pregunta.
Los autores de ambos artículos escribieron código y lo probaron ... y graficaron los resultados.
Podríamos hacer todo tipo de conjeturas. Podríamos mirar el código e intentar razonarlo.
Sin embargo, la forma más significativa de abordar una cuestión de este tipo es escribir un código para medir un patrón de uso propuesto ... y algo más para probar otro (por ejemplo, un rango de longitudes de clave que van desde 8 caracteres hasta ... cómo Cuánto tiempo te gustaría ... 8 kilobytes?) ... y mídelo.