Det finns en grundläggande egenskap hos redis MULTI/EXEC-enheter som betyder att du inte kan få resultat under operationen. Som sådan finns det två vanliga sätt att göra det du ber om:
- Använd Lua (
ScriptEvaluate[Async]
); ett Lua-skript körs på servern från början till slut, är effektivt och undviker alla problem som är förknippade med tur och returtid (latens eller bandbredd) eller konkurrens från andra anslutningar - Använd en optimistisk loop som läser av det aktuella värdet och skapar sedan en transaktion i SE-Redis som lägger till en begränsning att värdet du just läste är detsamma, och verkställer biverkningarna i transaktionen; biblioteket kommer att koordinera den nödvändiga WATCH etc maskineriet för att göra detta robust, men om begränsningsvillkoret visar sig vara ogiltigt (dvs. biblioteket returnerar
false
), måste du göra om allt från början
Ärligt talat, nuförtiden skulle jag alltid vägleda människor till alternativ 1; alternativ 2 är bara "tilltalande" (och jag använder den termen helt felaktigt) om Lua-skript på serversidan inte är tillgängligt.
Jag sitter inte vid en PC, men jag gissar att manuset skulle se ut ungefär så här:
local id = redis.call("incr", KEYS[1])
redis.call("hset", KEYS[2], tostring(id), ARGV[1])
return id