申し訳ありませんが、あなたが間違っているかどうか/何をしているのかを知るために、あなたのコードをうまく読むことができません。
Expire、ExpireAtの操作についてはかなりの数のテストがあります。以下に、その使用方法をより適切に示す可能性のあるいくつかのテストを示します。
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);
}
それでも問題が解決しない場合は、実行可能なコードスニペットまたは要点を投稿して、コードを読みやすくしてください。
編集:コード例への回答
型付きクライアントを使用する場合、最終的にRedisに保存されるキーは次のようになります。
'urn:CacheRecord:' + p_sParentKey
これは、例で使用しているものとは異なるキーです:
redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);
したがって、urnキーを取得する方法はいくつかあります。 これはRedisで使用されています。エンティティがある場合は、ToUrn()拡張メソッドを使用できます(例:
)。var cacheKey = foundKey.ToUrn();
それ以外の場合、「Id」しかない場合は、urnキーを作成できます。 のように:
var cacheKey = IdUtils.CreateUrn<CacheRecord>(p_sParentKey);
そこからエントリを期限切れにすることができます:
redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);
これが直感的ではないことは理解していますが、 RedisTypedClient.ExpiryInを追加することを検討します。 これを自動的に行う将来のバージョンのメソッド。これにより、次のようなことができるようになります:
cacheRecords.ExpireIn(p_sParentKey, TimeSpan.FromMinutes(validityPeriodInMinutes));
編集:メソッドのオーバーロードを追加しました:
上記のメソッドを最新バージョンのRedisクライアント(v2.07)に追加しました。これは、https://github.com/ServiceStack/ServiceStack.Redis/downloads
からダウンロードできます。CacheRecordを使用したテストで。
ところで:Redisクライアントは実際には[Serializer]属性を必要としません。