Er is een fundamenteel kenmerk van redis MULTI/EXEC-eenheden dat betekent dat u niet resultaten krijgen tijdens de operatie. Als zodanig zijn er twee veelvoorkomende manieren om te doen wat u vraagt:
- Gebruik Lua (
ScriptEvaluate[Async]
); een Lua-script wordt van begin tot eind op de server uitgevoerd, is efficiënt en vermijdt alle problemen die verband houden met retourtijd (latentie of bandbreedte) of concurrentie van andere verbindingen - Gebruik een optimistische lus die de huidige waarde leest en maak vervolgens een transactie in SE-Redis die een beperking toevoegt dat de waarde die u zojuist hebt gelezen hetzelfde is, en de bijwerkingen binnen de transactie uitvoeren; de bibliotheek coördineert de benodigde WATCH enz. machines om dit robuust te maken, maar als de beperkingsvoorwaarde ongeldig blijkt te zijn (d.w.z. de bibliotheek retourneert
false
), moet je alles vanaf het begin opnieuw doen
Eerlijk gezegd zou ik mensen tegenwoordig altijd naar optie 1 begeleiden; optie 2 is alleen "aantrekkelijk" (en ik gebruik die term nogal verkeerd) als Lua-scripting aan de serverzijde niet beschikbaar is.
Ik zit niet achter een pc, maar ik vermoed dat het script er ongeveer zo uit zou zien:
local id = redis.call("incr", KEYS[1])
redis.call("hset", KEYS[2], tostring(id), ARGV[1])
return id