Omlouvám se, ale váš kód opravdu moc dobře nečtu, abych věděl, jestli/co děláte špatně.
Mám několik testů pro operace Expire, ExpireAt, níže jsou některé, které mohou lépe demonstrovat, jak je používat:
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);
}
Pokud máte stále problém, můžete prosím zveřejnit spustitelný úryvek kódu nebo podstatu, abych mohl lépe přečíst váš kód.
EDIT:Odpověď na příklad kódu
Když používáte zadaného klienta, klíč, který se nakonec uloží do Redis, vypadá takto:
'urn:CacheRecord:' + p_sParentKey
Což je jiný klíč, než jaký používáte ve svém příkladu:
redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);
Existuje tedy několik způsobů, jak získat klíč urny který se používá v Redis. Pokud máte entitu, můžete použít metodu ToUrn() Extension, např.
var cacheKey = foundKey.ToUrn();
V opačném případě, pokud máte pouze 'Id', můžete vytvořit klíč urny jako:
var cacheKey = IdUtils.CreateUrn<CacheRecord>(p_sParentKey);
Odtud můžete vypršet platnost svého záznamu:
redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);
Ačkoli chápu, že to není intuitivní, pokusím se přidat RedisTypedClient.ExpiryIn v budoucí verzi, která to udělá automaticky za vás. to by vám pak mělo umožnit udělat něco jako:
cacheRecords.ExpireIn(p_sParentKey, TimeSpan.FromMinutes(validityPeriodInMinutes));
EDIT:Přidáno přetížení metody:
Výše uvedenou metodu jsem přidal do nejnovější verze klienta Redis (v2.07), kterou si můžete stáhnout zde:https://github.com/ServiceStack/ServiceStack.Redis/downloads
S testy pomocí vašeho CacheRecord.
BTW:Klient Redis ve skutečnosti nepotřebuje atribut [Serializer].