Większość Twoich pytań jest dostępna w dokumentacji referencyjnej Spring Data Redis.
Przed zagłębieniem się w Pipelining, pojedynczy multi-get z jednego Hash nie wymaga Pipelining, ponieważ jest to tylko pojedyncze polecenie. Potokowanie nie poprawi wydajności/stabilności/… interakcji z Redis.
Pipelining jest zorganizowany jako wywołanie zwrotne i ma na celu wydawanie wielu poleceń bez natychmiastowego oczekiwania na wynik – pomyśl o tym jako o partii, w której później otrzymujesz wszystkie wyniki. Ponieważ potokowanie synchronizuje odpowiedzi na samym końcu, nie otrzymujesz wartości wyników w ramach wywołania zwrotnego, ale na samym końcu, gdy sesja potokowania jest zsynchronizowana i executePipelined(…)
kończy się.
Twój kod powinien wyglądać tak:
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);
Musisz użyć tylko połączenia, które otrzymasz jako argument wywołania zwrotnego, ponieważ połączenie weszło w tryb potoku. Uzyskiwanie połączenia spoza wywołania zwrotnego (np. template.getConnectionFactory().getConnection()
) otworzy nowe połączenie i wykona polecenia Redis z oczekiwaniem na odpowiedzi – żadne potokowanie nie jest stosowane do żadnego zewnętrznego uzyskanego połączenia.
Możesz także użyć metod RedisTemplate
zamiast pracować z prostym połączeniem. executePipelined(…)
wiąże połączenie używane w wywołaniu zwrotnym z bieżącym wątkiem i ponownie wykorzystuje to powiązane połączenie, jeśli wywołasz metody interfejsu API szablonu.
Odnośnie twojego pytania Lua:Wywołania kodu/metody nie są transponowane do Lua.