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.