Colección de citas famosas - Diccionario de frases chinas - Redis, ¿cómo cargar datos clave de forma selectiva?

Redis, ¿cómo cargar datos clave de forma selectiva?

En la versión 2.6, el gobierno introdujo una nueva característica: el modo canalización, que permite importar directamente archivos de texto que admiten el protocolo Redis al servidor a través de una canalización.

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