Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis Expire funktioniert nicht

Tut mir leid, aber ich kann deinen Code nicht wirklich lesen, um zu wissen, ob/was du falsch machst.

Ich habe ein paar Tests für Expire-, ExpireAt-Operationen, hier sind einige unten, die vielleicht besser zeigen, wie man es benutzt:

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);
}

Wenn Sie immer noch ein Problem haben, können Sie bitte ein lauffähiges Code-Snippet oder eine Zusammenfassung posten, damit ich Ihren Code besser lesen kann.

EDIT:Antwort auf Codebeispiel

Wenn Sie einen typisierten Client verwenden, sieht der Schlüssel, der letztendlich in Redis gespeichert wird, folgendermaßen aus:

'urn:CacheRecord:' + p_sParentKey

Das ist ein anderer Schlüssel als in Ihrem Beispiel:

redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);

Es gibt also mehrere Möglichkeiten, an den Urnenschlüssel zu kommen das wird in Redis verwendet. Wenn Sie die Entität haben, können Sie die ToUrn() Extension-Methode verwenden, z. B.

var cacheKey = foundKey.ToUrn();

Andernfalls können Sie, wenn Sie nur die „ID“ haben, den urn key erstellen wie:

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

Von dort aus können Sie Ihren Eintrag verfallen lassen:

redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);

Obwohl ich verstehe, dass dies nicht intuitiv ist, werde ich versuchen, ein RedisTypedClient.ExpiryIn hinzuzufügen -Methode in einer zukünftigen Version, die dies automatisch für Sie erledigen würde. dies sollte Ihnen dann Folgendes ermöglichen:

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

BEARBEITEN:Methodenüberladungen hinzugefügt:

Ich habe die obige Methode in der neuesten Version des Redis-Clients (v2.07) hinzugefügt, die Sie hier herunterladen können:https://github.com/ServiceStack/ServiceStack.Redis/downloads

Mit Tests unter Verwendung Ihres CacheRecord.

Übrigens:Der Redis-Client benötigt eigentlich kein [Serializer]-Attribut.