Redis
 sql >> Database >  >> NoSQL >> Redis

Spring Data Redis:Redis Pipeline che ritorna sempre nullo

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.