De flesta av dina frågor finns i Spring Data Redis referensdokumentation.
Innan du gräver i Pipelining kräver en enda multi-get från en Hash inte Pipelining eftersom det bara är ett enda kommando. Pipelining kommer inte att förbättra prestanda/stabilitet/... av din Redis-interaktion.
Pipelining är arrangerad som callback och avsedd att utfärda flera kommandon utan att invänta resultatet omedelbart – se det som en batch där du får alla resultat senare. Eftersom pipelining synkroniserar svar i slutet, får du inte resultatvärden inom callbacken utan i slutet, när pipelining-sessionen är synkroniserad och executePipelined(…)
avslutas.
Din kod borde snarare se ut så här:
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 måste bara använda anslutningen som du får som återuppringningsargument eftersom anslutningen har gått in i pipelining-läge. Få en anslutning utanför återuppringningen (som template.getConnectionFactory().getConnection()
) kommer att öppna en ny anslutning och köra Redis-kommandon med väntande svar – ingen pipelining tillämpas på någon extern erhållen anslutning.
Du kan också använda metoder för RedisTemplate
istället för att arbeta med den vanliga anslutningen. executePipelined(…)
binder anslutningen som används i återuppringningen till den aktuella tråden och återanvänder den bundna anslutningen om du anropar mall-API-metoder.
Angående din Lua-fråga:Kod-/metodanropen överförs inte till Lua.