Há um recurso fundamental das unidades redis MULTI/EXEC que significa que você não pode obter resultados durante a operação. Como tal, existem duas maneiras comuns de fazer o que você pede:
- Usar Lua (
ScriptEvaluate[Async]
); um script Lua é executado no servidor do início ao fim, é eficiente e evita todos os problemas associados ao tempo de ida e volta (latência ou largura de banda) ou concorrência de outras conexões - Use um loop otimista que lê o valor atual e, em seguida, cria uma transação no SE-Redis que adiciona uma restrição que o valor que você acabou de ler seja o mesmo e execute os efeitos colaterais dentro da transação; a biblioteca irá coordenar o maquinário WATCH etc necessário para tornar isso robusto, mas se a condição de restrição for inválida (ou seja, a biblioteca retornará
false
), você precisa refazer tudo desde o início
Francamente, hoje em dia eu sempre orientava as pessoas para a opção 1; a opção 2 é apenas "atraente" (e eu uso esse termo incorretamente) se o script Lua do lado do servidor não estiver disponível.
Não estou em um PC, mas acho que o script seria algo como:
local id = redis.call("incr", KEYS[1])
redis.call("hset", KEYS[2], tostring(id), ARGV[1])
return id