sql >> Database >  >> NoSQL >> Redis

Redis Verlopen werkt niet

Sorry, maar ik kan je code niet zo goed lezen om te weten of/wat je verkeerd doet.

Ik heb een flink aantal tests voor Expire, ExpireAt-bewerkingen, hier zijn er enkele die misschien beter laten zien hoe u het moet gebruiken:

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

Als je nog steeds een probleem hebt, kun je een uitvoerbaar codefragment of kernwoord posten, zodat ik je code beter kan lezen.

EDIT:antwoord op codevoorbeeld

Wanneer u een getypte client gebruikt, ziet de sleutel die uiteindelijk wordt opgeslagen in Redis er als volgt uit:

'urn:CacheRecord:' + p_sParentKey

Dat is een andere sleutel dan wat u in uw voorbeeld gebruikt:

redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);

Er zijn dus een aantal manieren om de urn-sleutel . te verkrijgen dat wordt gebruikt in Redis. Als u de entiteit heeft, kunt u de ToUrn() Extension-methode gebruiken, bijvoorbeeld

var cacheKey = foundKey.ToUrn();

Anders, als je alleen de 'Id' hebt, kun je de urn-sleutel . maken zoals:

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

Van daaruit kunt u uw invoer laten verlopen:

redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);

Hoewel ik begrijp dat dit niet intuïtief is, zal ik proberen een RedisTypedClient.ExpiryIn toe te voegen. methode in een toekomstige versie die dit automatisch voor u zou doen. dit zou je dan iets moeten laten doen als:

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

EDIT:Methode-overbelasting toegevoegd:

Ik heb de bovenstaande methode toegevoegd in de nieuwste versie van de Redis Client (v2.07) die je hier kunt downloaden:https://github.com/ServiceStack/ServiceStack.Redis/downloads

Met tests met uw CacheRecord.

Trouwens:de Redis-client heeft het kenmerk [Serializer] niet echt nodig.




  1. Model.find() retourneert leeg in mangoest

  2. Microservices-architectuur voor zeer frequente gegevenstoegang; in geheugenoplossingen?

  3. Hoe voeg ik HTML in Mongodb in?

  4. Hoe Redis-oproepen in Lua-scriptbeperkingen vermijden?