Повечето от вашите въпроси са достъпни в справочната документация на Spring Data Redis.
Преди да се задълбочите в Pipelining, едно множествено получаване от един Hash не изисква Pipelining, защото това е само една команда. Конвейерирането няма да подобри производителността/стабилността/... на вашето взаимодействие с Redis.
Конвейерът е подреден като обратно извикване и има за цел да издаде множество команди, без да чакате резултата незабавно – мислете за него като за пакет, където получавате всички резултати по-късно. Тъй като конвейерирането синхронизира отговорите в самия край, вие не получавате стойности на резултата в рамките на обратното извикване, а в самия край, когато сесията на конвейер е синхронизирана и executePipelined(…)
прекратява.
Вашият код по-скоро трябва да изглежда така:
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);
Трябва да използвате само връзката, която получавате като аргумент за обратно извикване, тъй като връзката е влязла в режим на конвейериране. Получаване на връзка извън обратното извикване (като template.getConnectionFactory().getConnection()
) ще отвори нова връзка и ще изпълни команди на Redis с изчакващи отговори – не се прилага конвейер за никоя външна получена връзка.
Можете също да използвате методи на RedisTemplate
вместо да работите с обикновената връзка. executePipelined(…)
свързва връзката, използвана в обратното извикване, към текущата нишка и използва повторно тази обвързана връзка, ако извикате шаблонни API методи.
Относно вашия Lua въпрос:Извикванията на код/метод не се транспонират в Lua.