Redis
 sql >> Base de données >  >> NoSQL >> Redis

Redis expire ne fonctionne pas

Désolé mais je ne peux pas vraiment bien lire votre code afin de savoir si/ce que vous faites mal.

J'ai pas mal de tests pour les opérations Expire, ExpireAt, en voici quelques-uns ci-dessous qui peuvent mieux montrer comment l'utiliser :

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

Si vous rencontrez toujours un problème, pouvez-vous s'il vous plaît poster un extrait de code exécutable ou l'essentiel afin que je puisse mieux lire votre code.

EDIT :réponse à l'exemple de code

Lorsque vous utilisez un client typé, la clé qui est finalement stockée dans Redis ressemble à :

'urn:CacheRecord:' + p_sParentKey

Ce qui est une clé différente de celle que vous utilisez dans votre exemple :

redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);

Il existe donc plusieurs façons d'obtenir la clé de l'urne qui est utilisé dans Redis. Si vous avez l'entité, vous pouvez utiliser la méthode d'extension ToUrn(), par exemple

var cacheKey = foundKey.ToUrn();

Sinon, si vous n'avez que l''Id', vous pouvez créer la clé d'urne comme :

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

À partir de là, vous pouvez faire expirer votre entrée :

redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);

Bien que je comprenne que ce n'est pas intuitif, je vais donc chercher à ajouter un RedisTypedClient.ExpiryIn méthode dans une future version qui le ferait automatiquement pour vous. cela devrait alors vous permettre de faire quelque chose comme :

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

EDIT :surcharges de méthodes ajoutées :

J'ai ajouté la méthode ci-dessus dans la dernière version du client Redis (v2.07) que vous pouvez télécharger ici :https://github.com/ServiceStack/ServiceStack.Redis/downloads

Avec des tests utilisant votre CacheRecord.

BTW :le client Redis n'a pas réellement besoin de l'attribut [Serializer].