Como você está fazendo um '...' é difícil dizer com certeza, mas eu diria que você está configurando mykey durante essa parte, o que efetivamente removerá a expiração.
Do manual EXPIRE
O tempo limite é limpo somente quando a chave é removida usando o comando DEL ou substituída usando os comandos SET ou GETSET
Além disso, em relação à resposta -1 do TTL
Valor de retorno
Resposta inteira:TTL em segundos ou -1 quando a chave não existe ou não tem tempo limite.
EDIT:Observe que esse comportamento mudou no Redis 2.8
A partir do Redis 2.8 o valor de retorno em caso de erro foi alterado:
O comando retorna -2 se a chave não existir.
O comando retorna -1 se a chave existe mas não tem expiração associada.
Em outras palavras, se sua chave existe, ela parece ser persistente, ou seja, não tem nenhuma expiração definida.
EDIT:Parece que posso reproduzir isso se eu criar a chave em um servidor escravo REDIS, o escravo não excluirá a chave sem entrada mestre, pois normalmente você não criaria chaves localmente em um escravo. É este o caso aqui?
Porém enquanto os slaves conectados a um master não irão expirar as chaves de forma independente (mas irão aguardar o DEL vindo do master), eles ainda irão pegar o estado completo dos expires existentes no dataset, então quando um slave for eleito para master ele será capaz de expirar as chaves de forma independente, atuando totalmente como um mestre.