Red de conocimiento informático - Problemas con los teléfonos móviles - ¿El tipo de valor de los campos de tipo hash en Redis puede ser solo cadena? Redis es más que una simple base de datos clave-valor en memoria: el sitio web de Redis se define a sí mismo como un "servidor de estructura de datos". Al diseñar cuidadosamente el almacenamiento de datos de varios tipos de estructuras de datos, se pueden realizar algunas funciones de consulta de datos. Porque en el diseño de Redis, la clave es todo y es visible para Redis, mientras que el valor es una matriz de bytes, Redis no sabe qué está almacenado en su valor, por lo que debe implementar algo como 'select*fromuserswhereuser Para. consultas como .location="shanghai"', Redis no puede comparar los resultados por valor. Pero puedes hacerlo a través de diferentes tipos de estructuras de datos. 1usuarios: 2{nombre: Frank, edad: 30, ubicación: beijing}usuarios: ubicación: shanghai[1] donde usuarios: 1usuarios: 2{nombre: Frank, edad: 30, ubicación: shanghai}usuarios: ubicación: shanghai[1 ] Entre ellos, usuarios.1 usuarios: 2 definen respectivamente la información de dos usuarios, que se implementa a través de la estructura de datos hash en Redis y usuarios: ubicación: Shanghai registra las ID de todos los usuarios en Shanghai, que se implementa a través de la recopilación de datos; estructura. jedisjedis=jedisPool.getResource(); SetshanghaiIDs=jedis.members("usuarios: ubicación: shanghai"); //Recorre el conjunto////, a través de hgetall jedis.hgetAll("usuarios: " shanghaiIDs[0]); arriba Diseñado para implementar consultas condicionales simples. Pero hay muchos problemas al hacer esto. En primer lugar, es necesario mantener una colección de índices de ID. En segundo lugar, no se puede hacer nada para algunas consultas complejas (por supuesto, no se puede esperar que Redis implemente consultas como una base de datos relacional). Redis no puede hacer esto). Sin embargo, Redis 2.6 integra scripts Lua. Puede usar el comando eval para ejecutar scripts Lua directamente en el entorno RedisServer y llamar a los comandos Redis en scripts Lua. De hecho, es decir, puede usar el lenguaje de secuencia de comandos Lua para operar con los valores clave almacenados en Redis. Esto es de gran importancia. Incluso puede escribir los diversos negocios necesarios en su sistema en una secuencia de comandos Lua y cargarlos. en Redis con anticipación y luego, para la solicitud de respuesta, solo necesita llamar a un script Lua. Por supuesto que es un poco exagerado, pero ese es el punto.

¿El tipo de valor de los campos de tipo hash en Redis puede ser solo cadena? Redis es más que una simple base de datos clave-valor en memoria: el sitio web de Redis se define a sí mismo como un "servidor de estructura de datos". Al diseñar cuidadosamente el almacenamiento de datos de varios tipos de estructuras de datos, se pueden realizar algunas funciones de consulta de datos. Porque en el diseño de Redis, la clave es todo y es visible para Redis, mientras que el valor es una matriz de bytes, Redis no sabe qué está almacenado en su valor, por lo que debe implementar algo como 'select*fromuserswhereuser Para. consultas como .location="shanghai"', Redis no puede comparar los resultados por valor. Pero puedes hacerlo a través de diferentes tipos de estructuras de datos. 1usuarios: 2{nombre: Frank, edad: 30, ubicación: beijing}usuarios: ubicación: shanghai[1] donde usuarios: 1usuarios: 2{nombre: Frank, edad: 30, ubicación: shanghai}usuarios: ubicación: shanghai[1 ] Entre ellos, usuarios.1 usuarios: 2 definen respectivamente la información de dos usuarios, que se implementa a través de la estructura de datos hash en Redis y usuarios: ubicación: Shanghai registra las ID de todos los usuarios en Shanghai, que se implementa a través de la recopilación de datos; estructura. jedisjedis=jedisPool.getResource(); SetshanghaiIDs=jedis.members("usuarios: ubicación: shanghai"); //Recorre el conjunto////, a través de hgetall jedis.hgetAll("usuarios: " shanghaiIDs[0]); arriba Diseñado para implementar consultas condicionales simples. Pero hay muchos problemas al hacer esto. En primer lugar, es necesario mantener una colección de índices de ID. En segundo lugar, no se puede hacer nada para algunas consultas complejas (por supuesto, no se puede esperar que Redis implemente consultas como una base de datos relacional). Redis no puede hacer esto). Sin embargo, Redis 2.6 integra scripts Lua. Puede usar el comando eval para ejecutar scripts Lua directamente en el entorno RedisServer y llamar a los comandos Redis en scripts Lua. De hecho, es decir, puede usar el lenguaje de secuencia de comandos Lua para operar con los valores clave almacenados en Redis. Esto es de gran importancia. Incluso puede escribir los diversos negocios necesarios en su sistema en una secuencia de comandos Lua y cargarlos. en Redis con anticipación y luego, para la solicitud de respuesta, solo necesita llamar a un script Lua. Por supuesto que es un poco exagerado, pero ese es el punto.

Por ejemplo, ahora queremos implementar una consulta como "todos los usuarios mayores de 28 años", luego, a través del siguiente script Lua, podemos implementar publicstaticfinalStringSCRIPT="localresultKeys={}; " " fork, vinipairs(KEYS)do " "localtmp= redis.call('hget', v, 'age'); " "iftmpgt;ARGV[1]luego " "table.insert(resultKeys, v); " "end; " "end; " "returnresultKeys; "; Ejecutar código de script Jedisjedis=jedisPool.evalsha(funcKey, claves, args); returnresultKeys; Tenga en cuenta que el código anterior utiliza el comando evalsha, que no es una cadena de script Lua directa. No es una cadena de script Lua directa, sino un índice de función SHA que se ha cargado en Redis de antemano. Todas las funciones que deben ejecutarse en el sistema se cargan en Redis de antemano a través del siguiente código. , si necesita implementar alguna función más adelante, simplemente obtenga el índice SHA de la función correspondiente de la tabla de funciones y llámelo a través de evalsha. StringshaFuncKey=jedis.scriptLoad(SCRIPT); // Cargue el script y obtenga el índice SHA funcTable.put(funcName_age, shaFuncKey); // Agregar a la tabla de funciones A través del método anterior, se pueden entregar consultas más complejas a Redis. para su ejecución, mejorando la eficiencia.