Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Redis C # - Usando o valor Incr em uma transação


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:
  1. 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
  2. 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