Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Spring Data Redis:Redis Pipeline gibt immer null zurück

Die meisten Ihrer Fragen sind in der Spring Data Redis-Referenzdokumentation verfügbar.

Bevor Sie sich mit Pipelining befassen, erfordert ein einzelner Multi-Get von einem Hash kein Pipelining, da es sich nur um einen einzigen Befehl handelt. Pipelining wird die Leistung/Stabilität/… Ihrer Redis-Interaktion nicht verbessern.

Pipelining ist als Callback ausgelegt und soll mehrere Befehle ausgeben, ohne sofort auf das Ergebnis zu warten – stellen Sie sich das als Batch vor, bei dem Sie später alle Ergebnisse erhalten. Da beim Pipelining die Antworten ganz am Ende synchronisiert werden, erhalten Sie Ergebniswerte nicht innerhalb des Callbacks, sondern ganz am Ende, wenn die Pipelining-Sitzung synchronisiert und executePipelined(…) ausgeführt wird beendet.

Ihr Code sollte eher so aussehen:

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);

Sie müssen nur die Verbindung verwenden, die Sie als Callback-Argument erhalten, da die Verbindung in den Pipelining-Modus gewechselt ist. Erhalten einer Verbindung von außerhalb des Callbacks (wie template.getConnectionFactory().getConnection() ) öffnet eine neue Verbindung und führt Redis-Befehle aus, während auf Antworten gewartet wird – es wird kein Pipelining auf extern erhaltene Verbindungen angewendet.

Sie können auch Methoden von RedisTemplate verwenden anstatt mit der einfachen Verbindung zu arbeiten. executePipelined(…) bindet die im Callback verwendete Verbindung an den aktuellen Thread und verwendet diese gebundene Verbindung erneut, wenn Sie Vorlagen-API-Methoden aufrufen.

Zu deiner Lua-Frage:Die Code-/Methodenaufrufe werden nicht auf Lua übertragen.