Většina vašich otázek je k dispozici v referenční dokumentaci Spring Data Redis.
Než se pustíte do zřetězení, jeden multi-get z jednoho hash nevyžaduje zřetězení, protože je to pouze jeden příkaz. Pipelining nezlepší výkon/stabilitu/… vaší interakce s Redis.
Zřetězení je uspořádáno jako zpětné volání a je určeno k vydávání více příkazů bez okamžitého čekání na výsledek – berte to jako dávku, kde všechny výsledky získáte později. Protože zřetězení synchronizuje odpovědi na samém konci, neobdržíte výsledné hodnoty v rámci zpětného volání, ale až na samém konci, když je relace zřetězení synchronizována a executePipelined(…)
končí.
Váš kód by měl spíše vypadat takto:
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);
Musíte použít pouze připojení, které obdržíte jako argument zpětného volání, protože připojení vstoupilo do režimu zřetězení. Získání spojení mimo zpětné volání (jako template.getConnectionFactory().getConnection()
) otevře nové připojení a provede příkazy Redis s čekajícími odpověďmi – na žádné externí získané připojení není aplikováno žádné zřetězení.
Můžete také použít metody RedisTemplate
místo práce s prostým připojením. executePipelined(…)
sváže připojení použité ve zpětném volání k aktuálnímu vláknu a znovu použije toto vázané připojení, pokud zavoláte metody API šablony.
Pokud jde o vaši otázku Lua:Volání kódu/metody nejsou transponována do Lua.