Oi Marcus, complementando sobre a primeira pergunta, onde eu falei que você podia recuperar o valor da chave com o GET
e atribuir pra outra. Você pode utilizar a transação do Redis. A transação irá garantir a atomicidade. Ou executa tudo, ou não executa.
Você pode encontrar mais sobre transações na documentação do Redis: http://redis.io/topics/transactions
No Redis, você pode utilizar o comando MULTI
:
> MULTI
OK
> INCR acessos
QUEUED
> INCR visitas
QUEUED
> EXEC
1) (integer) 1
2) (integer) 1
Todos os comandos que você digita após chamar o MULTI só serão executados quando você chamar o EXEC
, e você também tem a atomicidade garantida.
Existe também o comando WATCH
, que quando aplicado a uma chave fica monitorando e, em caso o valor da chave mude antes de chamarmos o EXEC
, a transação irá falhar.
Abaixo, mostro um exemplo de como poderia fazer, utilizando a biblioteca Jedis, um cliente do Redis pro Java. O Redis possui clientes para várias linguagens de programação. Você pode consultar aqui: http://redis.io/clients.
Jedis jedis = new Jedis("localhost", 6379);
jedis.set("ultimo_sorteio", "2, 15, 18, 30, 35, 42");
jedis.watch("ultimo_sorteio");
String ultimoSorteio = jedis.get("ultimo_sorteio");
Transaction multi = jedis.multi();
multi.set("resultado:17-05-2015:megasena", ultimoSorteio);
multi.exec();
System.out.println("ultimo_sorteio: " + jedis.get("ultimo_sorteio"));
System.out.println("resultado:17-05-2015:megasena: " + jedis.get("resultado:17-05-2015:megasena"));
Nesse caso, recuperamos o valor de "ultimo_sorteio" para a variavel ultimoSorteio do Java, e utilizamos o set
para atribuir seu valor à chave resultado:17-05-2015:megasena
.
Como utilizamos o watch
em "ultimo_sorteio", caso algum outro cliente altere o valor de "ultimo_sorteio" nesse meio tempo, a transação vai falhar.
Faz sentido?
Abraço!