Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo realizar consultas difusas mediante el tipo hash en Redis?

¿Cómo realizar consultas difusas mediante el tipo hash en Redis?

Redis es más que una simple base de datos en memoria de valores clave: 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 implementarlo, por ejemplo

<. p>'select * from usuarios donde user.location="Shanghai"'

No hay forma de comparar resultados por valor en Redis. Pero puedes utilizar diferentes tipos de estructuras de datos para lograrlo. Por ejemplo, la siguiente definición de datos

usuarios:1 {nombre:Jack,edad:28,ubicación:shanghai}

usuarios:2 {nombre:Frank,edad:30,ubicación :beijing }

usuarios:ubicación:shanghai [1]

Entre ellos, usuarios:1 y usuarios:2 definen respectivamente la información de dos usuarios, que se implementan mediante datos hash. la estructura en Redis Usuarios: ubicación: shanghai registra las identificaciones de todos los usuarios en Shanghai y se implementa mediante una estructura de recopilación de datos. De esta manera, solo necesitamos llamar a dos comandos simples de Redis para implementar la consulta anterior.

Jedis jedis = jedisPool.getResource();

Establecer shanghaiIDs = jedis.smembers("usuarios:ubicación:shanghai");

/ / Recorrer la colección

//...

// Obtenga la información del usuario correspondiente a través de hgetall

jedis.hgetAll("users:" + shanghaiIDs[ 0 ]);

A través del diseño anterior, puede implementar consultas condicionales simples. Pero también hay muchos problemas al hacerlo. En primer lugar, es necesario mantener una colección de índices de ID. En segundo lugar, no hay nada que pueda hacer para algunas consultas complejas (por supuesto, no puede esperar que Redis pueda implementar consultas como una relacional). base de datos, Redis no puede hacer esto).

Sin embargo, Redis 2.6 integra scripts Lua. Puede ejecutar scripts Lua directamente en el entorno RedisServer a través del comando eval y llamar a los comandos de Redis en el script Lua. De hecho, es decir, puede usar el lenguaje de script Lua para operar con los valores clave almacenados en Redis, lo cual es de gran importancia. Incluso puede escribir los diversos negocios necesarios en su sistema en un script Lua y cargarlos. en Redis con anticipación. 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", lo cual se puede lograr mediante el siguiente script Lua.

public static final String SCRIPT =

" local resultKeys={};"

+ "for k,v in ipairs(KEYS) do"

+ " local tmp = redis.call ('hget ', v, 'edad');"

+ " if tmp > ARGV[1] entonces"

+ " table.insert(resultKeys,v);"

+ " end;"

+ "end;"

+ "return resultKeys;";

Ejecutar código de script

Jedis jedis = jedisPool.getResource();

jedis.auth(auth);

Lista claves = Arrays.args = new ArrayList<>( );

args.add("28");

Lista resultKeys = (List)jedis.evalsha(funcKey

jedis.evalsha(funcKey);

jedis.evalsha(funcKey)evalsha); (funcKey, claves, args);

Devuelve resultKeys;

Tenga en cuenta que el comando evalsha utilizado en el código anterior no es una cadena de script Lua directa, sino el índice SHA de la función. cargado en Redis por adelantado. Una vez que la función se carga en Redis por adelantado, nuestro sistema mantendrá una tabla hash de funciones. Si es necesario implementar alguna función más adelante, podemos obtener el índice SHA de la función correspondiente de la tabla de funciones y llamarla a través de evalsha.

String shaFuncKey = jedis.scriptLoad(SCRIPT);//carga el script, obtén el índice sha

funcTable.put(funcName_age, shaFuncKey);//agrégalo a la función table

Con el método anterior, puede realizar consultas más complejas en Redis, mejorando así la eficiencia.