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.