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

Redis Expirar não funciona


Desculpe, mas não consigo ler seu código muito bem para saber se/o que você está fazendo de errado.

Eu tenho alguns testes para operações Expire, ExpireAt, aqui estão alguns abaixo que podem demonstrar melhor como usá-lo:

https://github.com/ServiceStack/ServiceStack.Redis/blob/master/tests/ServiceStack.Redis.Tests/RedisClientTests.cs
[Test]
public void Can_Expire()
{
    Redis.SetEntry("key", "val");
    Redis.Expire("key", 1);
    Assert.That(Redis.ContainsKey("key"), Is.True);
    Thread.Sleep(2000);
    Assert.That(Redis.ContainsKey("key"), Is.False);
}

[Test]
public void Can_ExpireAt()
{
    Redis.SetEntry("key", "val");

    var unixNow = DateTime.Now.ToUnixTime();
    var in1Sec = unixNow + 1;

    Redis.ExpireAt("key", in1Sec);

    Assert.That(Redis.ContainsKey("key"), Is.True);
    Thread.Sleep(2000);
    Assert.That(Redis.ContainsKey("key"), Is.False);
}

Se o problema persistir, você pode postar um snippet de código executável ou uma essência para que eu possa ler melhor seu código.

EDIT:Resposta ao exemplo de código

Quando você usa um cliente digitado, a chave que é armazenada no Redis se parece com:
'urn:CacheRecord:' + p_sParentKey

Qual é uma chave diferente para o que você está usando no seu exemplo:
redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);

Portanto, há algumas maneiras de obter a chave de urna que é usado no Redis. Se você tiver a entidade, poderá usar o método de extensão ToUrn(), por exemplo.
var cacheKey = foundKey.ToUrn();

Caso contrário, se você tiver apenas o 'Id', poderá criar a chave de urna Como:
var cacheKey = IdUtils.CreateUrn<CacheRecord>(p_sParentKey);

A partir daí, você pode expirar sua entrada:
redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);

Embora eu entenda como isso não é intuitivo, tentarei adicionar um RedisTypedClient.ExpiryIn método em uma versão futura que faria isso automaticamente para você. isso deve permitir que você faça algo como:
cacheRecords.ExpireIn(p_sParentKey, TimeSpan.FromMinutes(validityPeriodInMinutes));

EDIT:Sobrecargas de método adicionadas:

Eu adicionei o método acima na versão mais recente do Redis Client (v2.07) que você pode baixar aqui:https://github.com/ServiceStack/ServiceStack.Redis/downloads

Com testes usando seu CacheRecord.

BTW:o Redis Client na verdade não precisa do atributo [Serializer].