Maaf, tapi saya tidak bisa membaca kode Anda dengan baik untuk mengetahui jika/apa yang Anda lakukan salah.
Saya memiliki beberapa tes yang adil untuk operasi Expire, ExpireAt, berikut adalah beberapa di bawah ini yang mungkin lebih baik menunjukkan cara menggunakannya:
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);
}
Jika Anda masih mengalami masalah, dapatkah Anda memposting cuplikan kode atau intisari yang dapat dijalankan agar saya dapat membaca kode Anda dengan lebih baik.
EDIT:Jawaban untuk contoh kode
Saat Anda menggunakan klien yang diketik, kunci yang akhirnya disimpan di Redis terlihat seperti:
'urn:CacheRecord:' + p_sParentKey
Yang merupakan kunci yang berbeda dengan apa yang Anda gunakan dalam contoh Anda:
redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);
Jadi, ada beberapa cara untuk mendapatkan kunci urn yang digunakan di Redis. Jika Anda memiliki entitas, Anda dapat menggunakan metode Ekstensi ToUrn(), mis.
var cacheKey = foundKey.ToUrn();
Jika tidak, jika Anda hanya memiliki 'Id', Anda dapat membuat kunci urn seperti:
var cacheKey = IdUtils.CreateUrn<CacheRecord>(p_sParentKey);
Dari sana Anda dapat kedaluwarsa entri Anda:
redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);
Meskipun saya mengerti bagaimana ini tidak intuitif, jadi saya akan menambahkan RedisTypedClient.ExpiryIn metode di versi mendatang yang akan melakukan ini secara otomatis untuk Anda. ini kemudian akan membiarkan Anda melakukan sesuatu seperti:
cacheRecords.ExpireIn(p_sParentKey, TimeSpan.FromMinutes(validityPeriodInMinutes));
EDIT:Menambahkan kelebihan metode:
Saya telah menambahkan metode di atas dalam versi terbaru Redis Client (v2.07) yang dapat Anda unduh di sini:https://github.com/ServiceStack/ServiceStack.Redis/downloads
Dengan pengujian menggunakan CacheRecord Anda.
BTW:Klien Redis sebenarnya tidak membutuhkan atribut [Serializer].