Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Redis Expire tidak berfungsi

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bisakah saya menggunakan Tornado+ Seledri+ RabbitMQ + Redis?

  2. JedisPoolConfig tidak dapat ditetapkan ke GenericObjectPoolConfig

  3. .NET Core menyuntikkan layanan singleton di layanan singleton lain

  4. Haruskah `StackExchange.Redis.ConnectionMultiplexer` menjadi `AddSingleton` atau `AddScope` dalam injeksi ketergantungan .NET Core?

  5. Bagaimana cara menghapus jutaan kunci yang cocok dengan pola secara atom menggunakan Redis murni?