Redis, ¿cómo cargar datos clave de forma selectiva?
Para decirlo sin rodeos, los pasos de implementación específicos son los siguientes:
1. Cree un nuevo archivo de texto que contenga el comando redis.
Establecer valor de clave 0 0
Establecer valor de clave 1 1
...
Establecer valor de clave n
No es difícil construir este archivo si tiene datos sin procesar, como Shell y Python.
2. ¿Convertir estos comandos a Redis? Protocolo.
¿Porque la función de canalización de Redis es compatible con Redis? protocolo en lugar de comandos directos de Redis.
Cómo convertir, puede consultar el siguiente script.
3. Usar inserción de tubería
cat data.txt | redis-cli - pipe
¿Shell VS? Tubería de Redis
Utilicemos pruebas para ver la eficiencia entre la importación masiva de Shell y la tubería de Redis.
Idea de prueba: insertar 6,5438 millones de datos idénticos en la base de datos a través del script de shell y la canalización de Redis respectivamente, y verificar el tiempo necesario para cada uno.
Shell
El script es el siguiente:
#!/bin/bash for((I = 0;我lt100000;i)do echo-en " hola mundo " | redis-CLI-x set name $ I gt; gtredis.log
Completo
El valor insertado cada vez es helloworld, pero las claves son diferentes, nombre0, nombre1..Nombre 99999.
Canalización de Redis
La canalización de Redis será un poco más problemática
1 gt; primero, construya el archivo de texto del comando redis;
Aquí elegí Python.
#!/usr/bin/python para I en rango(100000): print 'set name' str(i), 'helloworld'
# python 1. py gt; redis_commands.txt
# head -2 redis_commands.txt?
Establecer nombre 0 helloworld
establecer nombre1 helloworld
2 gt? ¿Convertir estos comandos en Redis? Borrador
Aquí, utilicé un script de shell en github,
#!/bin/bash mientras leía CMD para hacer
#Cada comando comienza con * {The número de parámetros en el comando} comienza\r\n
XS =($ CMD "*${#XS[@]}\r\n "
#); Para cada parámetro, agregamos ${length}\r\n{argument}\r\n? Para X representado por $CMD; haga printf " \ $ $ { # X } \ r \ n $ >
# head -7 redis_data.txt?
*3 conjuntos por $3
$5 nombre 0
$10helloworld
En este punto, la estructura de datos está completa
Los resultados de la prueba
están. de la siguiente manera:
El consumo de tiempo no es el mismo en absoluto.
Finalmente, echemos un vistazo al principio de implementación de pipe.
redis-. cli - pipe intenta enviar datos al servidor lo más rápido posible
Al mismo tiempo, lee los datos disponibles e intenta procesarlos para analizarlos
una vez allí. no hay datos para leer desde stdin, envía un comando especial ? echo? con una cadena aleatoria de 20 bytes: estamos seguros de que este es el último comando enviado, y estamos seguros de que si recibimos los mismos 20 bytes que la respuesta masiva. , podemos hacer coincidir la verificación de respuesta
Una vez que se envía este comando final especial, el código que recibe la respuesta comienza a coincidir con estos 20 bytes. Cuando se alcanza una respuesta coincidente, puede salir con éxito. /p>
Es decir, enviará los datos al servidor Redis lo antes posible y leerá y analizará el contenido del archivo de datos lo antes posible. Cuando se lea el contenido, enviará un comando de eco. con una cadena de 20 bytes, y el servidor Redis confirmará que los datos se han insertado según el comando
Resumen:
Para aquellos que tengan curiosidad, es hora de construir. el comando redis y el tiempo para convertir el comando al protocolo se publican aquí:
[root @ MySQL-server 1 ~]# time python 1. py redis _ commands.txt
real 0m0.110s
Usuario 0m0.070s
sys 0m0.040s
[root @ MySQL-server 1 ~]# time sh 20 . sh gt; redis_data.txt
real 0m7.112s
usuario 0m5.861s
sys 0m1.255s