¿Cómo establece Redis el valor para incluir espacios?
Al configurar pares clave-valor, hay espacios en los valores de las estructuras de datos de tipo cadena en Redis. La interfaz API de Redis que uso se ha encapsulado en una capa. Solo necesito pasar la cadena de comando, por lo que primero uniré la cadena de comando y luego llamaré a la interfaz correspondiente. Como resultado, la operación falló.
La interfaz API de Redis analizará la cadena de comando utilizando espacios como delimitadores, lo que dará como resultado parámetros incorrectos.
Por ejemplo, SET k "V V", después de dividirse, se convierte en SET, K, V, V. Finalmente, Redis determinará un error de sintaxis al ejecutar el comando porque los parámetros exceden el límite del comando SET. .
Cuando encontré este problema por primera vez, mi primera reacción fue procesar la cadena de la línea de comando y realizar un procesamiento especial en la parte del valor de la cadena, como "" para incluir la cadena con espacios, pensando que esto No se dividirá. El resultado real es que todavía no funciona. La razón es la siguiente: al empalmar, se utiliza el formato prinf en el método de empalme estándar y la cadena "incluir" se procesa especialmente. Cuando la cadena "contiene" se pasa nuevamente a la API de Redis, vuelve a ser una cadena normal y el resultado aún no funciona.
Por supuesto, hay otra forma, que es transcodificar la cadena y luego decodificarla cuando la sacas, pero este método es obviamente ofensivo e inaceptable, así que decidí tomarme un momento para Ver el Código fuente de la API correspondiente de Redis.
La API de Redis para ejecutar comandos es redisCommand.
Después de observar detenidamente el código fuente, encontrará que la API proporciona el mismo formato de entrada estándar que printf, lo que significa que el uso directo de redisCommand puede manejar valores con espacios en blanco, solo porque encapsulamos una capa. Por eso el formateo causa problemas. El formateo falla y se dividirá cuando encuentre espacios, lo que finalmente resultará en un error de sintaxis en el comando.
El formato de entrada de redisCommand es básicamente el mismo que el de prinf, incluso una versión mejorada, como se describe a continuación.
|longitud de datos|d i|u o x X|
|:--:|:-:|:-:|:-:|:-:|:-:|: -:|:
|none|int|unsigned int|
|hh|signed char|unsigned char|
|h|short unsigned short| int|
|h|int corto sin signo int corto|
|l|int largo| sin signo int largo|
|ll|int largo sin signo| long long int|
Nota: La tabla anterior muestra que diferentes prefijos representan diferentes rangos de datos
Salida:
Si tiene cuidado, debe haber notado que la entrada es -161, pero solo hay una salida sin formato que es -161, y eso obliga a que la salida sea de tipo largo. Esto implica conversión de tipos.
Los principios básicos son los siguientes:
Descripción de la última imagen:
Cuando enfrento problemas, lo que pienso es en evitarlos, no en resumir y resolver. Nos volveremos a encontrar algún día.
Tienes que llenar el agujero que tú mismo cavaste por pereza.