La maggior parte delle tue domande è disponibile nella documentazione di riferimento di Spring Data Redis.
Prima di scavare in Pipelining, un singolo multi-get da un hash non richiede Pipelining perché è solo un singolo comando. La pipeline non migliorerà le prestazioni/stabilità/... della tua interazione Redis.
La pipeline è organizzata come callback e ha lo scopo di emettere più comandi senza attendere immediatamente il risultato:pensalo come un batch in cui ottieni tutti i risultati in un secondo momento. Poiché il pipelining sincronizza le risposte alla fine, non ricevi i valori dei risultati all'interno del callback ma alla fine, quando la sessione di pipelining è sincronizzata e executePipelined(…)
termina.
Il tuo codice dovrebbe invece assomigliare 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);
Devi utilizzare solo la connessione che ricevi come argomento di callback perché la connessione è entrata in modalità pipelining. Ottenere una connessione dall'esterno del callback (come template.getConnectionFactory().getConnection()
) aprirà una nuova connessione ed eseguirà i comandi Redis in attesa di risposte:nessuna pipeline viene applicata a nessuna connessione esterna ottenuta.
Puoi anche usare i metodi di RedisTemplate
invece di lavorare con la semplice connessione. executePipelined(…)
associa la connessione utilizzata nel callback al thread corrente e riutilizza quella connessione associata se chiami i metodi dell'API modello.
Per quanto riguarda la tua domanda su Lua:le chiamate di codice/metodo non vengono trasferite a Lua.