Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Spring Data Redis:Redis Pipeline retornando sempre nulo


A maioria de suas perguntas está disponível na documentação de referência do Spring Data Redis.

Antes de mergulhar no Pipelining, um único multi-get de um Hash não requer Pipelining porque é apenas um único comando. O pipeline não melhorará o desempenho/estabilidade/… de sua interação Redis.

O pipeline é organizado como retorno de chamada e destina-se a emitir vários comandos sem aguardar o resultado imediatamente – pense nele como um lote no qual você obtém todos os resultados posteriormente. Como o pipelining sincroniza as respostas no final, você não recebe valores de resultado no retorno de chamada, mas no final, quando a sessão de pipelining é sincronizada e executePipelined(…) termina.

Seu código deve se parecer com:
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);

Você precisa usar apenas a conexão que recebe como argumento de retorno de chamada porque a conexão entrou no modo de pipeline. Obtendo uma conexão de fora do callback (como template.getConnectionFactory().getConnection() ) abrirá uma nova conexão e executará comandos Redis com respostas aguardando - nenhum pipeline é aplicado a nenhuma conexão externa obtida.

Você também pode usar métodos de RedisTemplate em vez de trabalhar com a conexão simples. executePipelined(…) vincula a conexão usada no retorno de chamada ao Thread atual e reutiliza essa conexão vinculada se você chamar métodos de API de modelo.

Com relação à sua pergunta sobre Lua:As chamadas de código/método não são transpostas para Lua.