Има основна характеристика на redis MULTI/EXEC единици, което означава, че не можете да получите резултати по време на операцията. Като такива има два често срещани начина да направите това, което поискате:
- Използвайте Lua (
ScriptEvaluate[Async]
); Lua скрипт се изпълнява на сървъра от начало до край, е ефективен и избягва всички проблеми, свързани с времето за двупосочно пътуване (латентност или честотна лента) или конкуренция от други връзки - Използвайте оптимистичен цикъл, който чете текущата стойност, след което създава транзакция в SE-Redis, която добавя ограничение че стойността, която току-що прочете, е същата и изпълнява страничните ефекти в транзакцията; библиотеката ще координира необходимата машина WATCH etc, за да направи това стабилно, но ако условието за ограничение се окаже невалидно (т.е. библиотеката връща
false
), трябва да повторите всичко отначало
Честно казано, тези дни винаги бих насочвал хората към вариант 1; Вариант 2 е само "привлекателен" (и използвам този термин съвсем неправилно), ако Lua скриптовете от страна на сървъра не са налични.
Не съм на компютър, но предполагам, че скриптът ще изглежда така:
local id = redis.call("incr", KEYS[1])
redis.call("hset", KEYS[2], tostring(id), ARGV[1])
return id