De fleste af dine spørgsmål er tilgængelige i Spring Data Redis referencedokumentation.
Før du graver i Pipelining, kræver en enkelt multi-get fra en Hash ikke Pipelining, fordi det kun er en enkelt kommando. Pipelining forbedrer ikke ydeevne/stabilitet/... af din Redis-interaktion.
Pipelining er arrangeret som tilbagekald og beregnet til at udstede flere kommandoer uden at afvente resultatet med det samme - tænk på det som en batch, hvor du får alle resultater senere. Fordi pipelining synkroniserer svar til allersidst, modtager du ikke resultatværdier i tilbagekaldet, men til allersidst, når pipelining-sessionen er synkroniseret og executePipelined(…)
afsluttes.
Din kode skal hellere se sådan ud:
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);
Du skal kun bruge den forbindelse, du modtager som tilbagekaldsargument, fordi forbindelsen er gået i pipelining-tilstand. Opnåelse af en forbindelse uden for tilbagekaldet (som template.getConnectionFactory().getConnection()
) vil åbne en ny forbindelse og udføre Redis-kommandoer med afventende svar – ingen pipelining anvendes på nogen ekstern opnået forbindelse.
Du kan også bruge metoder til RedisTemplate
i stedet for at arbejde med den almindelige forbindelse. executePipelined(…)
binder forbindelsen, der bruges i tilbagekaldet, til den aktuelle tråd og genbruger den bundne forbindelse, hvis du kalder template API-metoder.
Med hensyn til dit Lua-spørgsmål:Kode-/metodekaldene transponeres ikke til Lua.