Políticas de expiração do AppEngine Memcache
Eu estava esperando o seguinte código do AppEngine:
MemcacheService memcache = MemcacheServiceFactory.getMemcacheService();
memcache.put("Foo", "Bar", Expiration.onDate(new Date(1)));
System.out.println(memcache.get("Foo"));
System.out.println(memcache.put("Foo", "Baz", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
para produzir a seguinte saída:
null
true
I.e. ao definir uma data de validade em 1970 ao colocar a entrada no cache, esperava que ela fosse descartada imediatamente e estivesse disponível para reutilização.
Em vez disso, recebo:
Bar
false
I.e. a entrada ainda está por aí.
Agora, o estranho é que, se eu mudar meu código paraExpiration.onDate(new Date())
(sem1
), ou seja, definindo a expiração para a direita antes de realizar a operação de colocação, euFaz obtenha o esperado "nulo, verdadeiro".
O Memcache de alguma forma interpreta datas de vencimento muito distantes no passado como relativas ao agora e não ao absoluto ??? Mas mesmo isso não se encaixaria no resultado, porque 1ms da opção ainda deveria ter expirado no momento em que a exibição chegar?!?
Qual valor posso definir Expiração para garantir uma expiração imediata (e exclusão!) Da entrada de venda? Lembre-se de que o simples uso do carimbo de data / hora atual pode não funcionar de maneira confiável, pois o AppEngine não oferece nenhuma garantia de sincronização de relógio entre os servidores!
Sei que querer fazer isso parece absurdo à primeira vista (por que não excluí-lo?), Mas gostaria de usá-lo aqui:AppEngine Memcache atômico get-and-delete (frase logo acima de "Conclusão").