Der er en grundlæggende egenskab ved redis MULTI/EXEC-enheder, som betyder, at du ikke kan få resultater under operationen. Som sådan er der to almindelige måder at gøre det, du beder om:
- Brug Lua (
ScriptEvaluate[Async]
); et Lua-script udføres på serveren fra start til slut, er effektivt og undgår alle problemer forbundet med rundturstid (latens eller båndbredde) eller konkurrence fra andre forbindelser - Brug en optimistisk loop, der aflæser den aktuelle værdi, og opretter derefter en transaktion i SE-Redis, der tilføjer en begrænsning at den værdi, du lige har læst, er den samme, og udfører bivirkningerne i transaktionen; biblioteket vil koordinere det nødvendige WATCH etc maskineri for at gøre dette robust, men hvis begrænsningsbetingelsen viser sig at være ugyldig (dvs. biblioteket returnerer
false
), skal du lave alt om fra starten
Helt ærligt, i disse dage ville jeg altid guide folk til mulighed 1; mulighed 2 er kun "tiltalende" (og jeg bruger det udtryk helt forkert), hvis Lua-scripting på serversiden ikke er tilgængelig.
Jeg er ikke ved en pc, men jeg gætter på, at scriptet ville se nogenlunde sådan ud:
local id = redis.call("incr", KEYS[1])
redis.call("hset", KEYS[2], tostring(id), ARGV[1])
return id