Redis
 sql >> Database >  >> NoSQL >> Redis

Redis Expire non funziona

Scusa ma non riesco a leggere molto bene il tuo codice per sapere se/cosa stai facendo di sbagliato.

Ho alcuni test per le operazioni Expire, ExpireAt, eccone alcuni di seguito che potrebbero dimostrare meglio come usarlo:

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 il problema persiste, puoi pubblicare uno snippet di codice eseguibile o un gist in modo che io possa leggere meglio il tuo codice.

EDIT:risposta all'esempio di codice

Quando utilizzi un client digitato, la chiave che alla fine viene archiviata in Redis è simile a:

'urn:CacheRecord:' + p_sParentKey

Che è una chiave diversa da quella che stai usando nel tuo esempio:

redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);

Quindi ci sono un paio di modi per ottenere la chiave dell'urna che è usato in Redis. Se disponi dell'entità puoi utilizzare il metodo di estensione ToUrn(), ad es.

var cacheKey = foundKey.ToUrn();

Altrimenti, se hai solo l'"ID", puoi creare la chiave urna come:

var cacheKey = IdUtils.CreateUrn<CacheRecord>(p_sParentKey);

Da lì puoi far scadere la tua voce:

redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);

Anche se capisco come questo non sia intuitivo, quindi cercherò di aggiungere un RedisTypedClient.ExpiryIn metodo in una versione futura che lo farebbe automaticamente per te. questo dovrebbe quindi farti fare qualcosa del tipo:

cacheRecords.ExpireIn(p_sParentKey, TimeSpan.FromMinutes(validityPeriodInMinutes));

EDIT:Aggiunti overload del metodo:

Ho aggiunto il metodo sopra nell'ultima versione del client Redis (v2.07) che puoi scaricare qui:https://github.com/ServiceStack/ServiceStack.Redis/downloads

Con i test utilizzando il tuo CacheRecord.

A proposito:il client Redis in realtà non ha bisogno dell'attributo [Serializer].