sql >> Base de Datos >  >> NoSQL >> Redis

Spring Data Redis:Redis Pipeline regresa siempre nulo

La mayoría de sus preguntas están disponibles en la documentación de referencia de Spring Data Redis.

Antes de profundizar en Pipelining, una sola obtención múltiple de un Hash no requiere Pipelining porque es solo un comando único. La canalización no mejorará el rendimiento/la estabilidad/… de su interacción con Redis.

La canalización se organiza como una devolución de llamada y tiene la intención de emitir múltiples comandos sin esperar el resultado de inmediato; considérelo como un lote donde obtiene todos los resultados más tarde. Debido a que la canalización sincroniza las respuestas al final, no recibe valores de resultado dentro de la devolución de llamada, sino al final, cuando la sesión de canalización se sincroniza y executePipelined(…) termina.

Su código debería parecerse a:

List<Object> results = getRedisTemplate().executePipelined(new RedisCallback<Object>() {

    @Override
    public Object doInRedis(RedisConnection connection) {

            connection.hMGet(key.getBytes(), params);

            return null;
    }
});

List<Object> hmget = (List<Object>) results.get(0);

Debe usar solo la conexión que recibe como argumento de devolución de llamada porque la conexión ha ingresado al modo de canalización. Obtener una conexión desde fuera de la devolución de llamada (como template.getConnectionFactory().getConnection() ) abrirá una nueva conexión y ejecutará comandos de Redis con respuestas en espera; no se aplica canalización a ninguna conexión externa obtenida.

También puede usar métodos de RedisTemplate en lugar de trabajar con la conexión simple. executePipelined(…) vincula la conexión utilizada en la devolución de llamada al subproceso actual y reutiliza esa conexión vinculada si llama a los métodos API de plantilla.

Con respecto a su pregunta de Lua:las llamadas de código/método no se transponen a Lua.