sql >> Databáze >  >> NoSQL >> Redis

Redis Expire nefunguje

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].




  1. Získejte hodnoty jako pole prvků po $lookup

  2. Jedis – Kdy použít returnBrokenResource()

  3. Jak nasadit databáze s otevřeným zdrojovým kódem

  4. Jak otestovat celer s django na počítači se systémem Windows