sql >> Base de Datos >  >> NoSQL >> Redis

Redis caducar no funciona

Lo siento, pero realmente no puedo leer tu código muy bien para saber si/qué estás haciendo mal.

Tengo algunas pruebas para las operaciones Expire, ExpireAt, aquí hay algunas a continuación que pueden demostrar mejor cómo usarlas:

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 aún tiene problemas, ¿podría publicar un fragmento de código ejecutable o una esencia para que pueda leer mejor su código?

EDITAR:Respuesta al ejemplo de código

Cuando usa un cliente escrito, la clave que finalmente se almacena en Redis se ve así:

'urn:CacheRecord:' + p_sParentKey

Que es una clave diferente a la que estás usando en tu ejemplo:

redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);

Entonces, hay un par de formas de obtener la llave de urna que se usa en Redis. Si tiene la entidad, puede usar el método de extensión ToUrn(), por ejemplo,

var cacheKey = foundKey.ToUrn();

De lo contrario, si solo tiene el 'Id', puede crear la clave de urna como:

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

Desde allí puede caducar su entrada:

redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);

Aunque entiendo que esto no es intuitivo, buscaré agregar un RedisTypedClient.ExpiryIn método en una versión futura que haría esto automáticamente por usted. esto debería permitirte hacer algo como:

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

EDITAR:sobrecargas de método agregadas:

Agregué el método anterior en la última versión de Redis Client (v2.07) que puede descargar aquí:https://github.com/ServiceStack/ServiceStack.Redis/downloads

Con pruebas usando tu CacheRecord.

Por cierto:el cliente de Redis en realidad no necesita el atributo [Serializador].