Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Redis Expire không hoạt động

Xin lỗi nhưng tôi thực sự không thể đọc rất rõ mã của bạn để biết nếu / bạn đang làm gì sai.

Tôi có một vài thử nghiệm hợp lý cho các hoạt động Expire, ExpireAt, đây là một số bài kiểm tra dưới đây có thể chứng minh tốt hơn cách sử dụng nó:

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

Nếu bạn vẫn gặp sự cố, bạn có thể vui lòng đăng đoạn mã hoặc ý chính có thể chạy được để tôi có thể đọc mã của bạn tốt hơn không.

CHỈNH SỬA:Câu trả lời cho ví dụ về mã

Khi bạn sử dụng một ứng dụng khách đã nhập, khóa cuối cùng được lưu trữ trong Redis trông giống như sau:

'urn:CacheRecord:' + p_sParentKey

Đó là một khóa khác với những gì bạn đang sử dụng trong ví dụ của mình:

redisClient.Expire(p_sParentKey, validityPeriodInMinutes * 60);

Vì vậy, có một số cách để lấy khóa urn được sử dụng trong Redis. Nếu bạn có thực thể, bạn có thể sử dụng phương thức Tiện ích mở rộng ToUrn (), ví dụ:

var cacheKey = foundKey.ToUrn();

Nếu không, nếu bạn chỉ có 'Id', bạn có thể tạo khóa urn như:

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

Từ đó, bạn có thể hết hạn mục nhập của mình:

redisClient.Expire(cacheKey, validityPeriodInMinutes * 60);

Mặc dù tôi hiểu cách này không trực quan, vì vậy tôi sẽ tìm cách thêm RedisTypedClient.ExpiryIn trong một phiên bản tương lai sẽ tự động thực hiện việc này cho bạn. điều này sau đó sẽ cho phép bạn làm một cái gì đó như:

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

CHỈNH SỬA:Đã thêm quá tải phương thức:

Tôi đã thêm phương thức ở trên vào phiên bản mới nhất của Redis Client (v2.07) mà bạn có thể tải xuống tại đây:https://github.com/ServiceStack/ServiceStack.Redis/downloads

Với các bài kiểm tra bằng CacheRecord của bạn.

BTW:Redis Client không thực sự cần thuộc tính [Serializer].




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. 2 cách tiếp cận để theo dõi người dùng trực tuyến với Redis. Cái nào nhanh hơn?

  2. Hết thời gian chờ giải cứu ::Lỗi từ Redis Gem (Ruby)

  3. Sử dụng nginx để phân phát nội dung trực tiếp từ bộ nhớ đệm redis

  4. Cách hủy công việc đã xếp hàng trong Laravel hoặc Redis

  5. Node.js &Redis; Chờ một vòng kết thúc