【问题标题】:How to set value without expiry using EasyCache如何使用 EasyCache 设置值而不过期
【发布时间】:2020-12-22 04:25:48
【问题描述】:

我正在将简易缓存集成到应用程序中。我看到他们已经设置了将缓存添加到到期中的方法,但是这种方法对于到期时间是强制性的。 有没有办法可以添加/设置缓存而不会过期?

【问题讨论】:

  • 您是否考虑过将持续时间设置为非常长的时间段(例如 3 年)?
  • @mjwills:不想明确设置。只是想延长服务器寿命。
  • 我明白你想要什么 - 但我建议的解决方法很简单并且会奏效。没有服务器可以运行 3 年,不间断...
  • 你能告诉我你在内存或redis中使用了哪个提供者吗?
  • @BrandoZhang:我同时使用 InMemory 和 Redis。

标签: c# asp.net-core caching redis in-memory


【解决方案1】:

根据源码,我发现有一个ExpirationScanFrequency属性会检查缓存的过期时间,如果缓存超过了过期时间,它会删除它。

Source codes 如下:

    private void StartScanForExpiredItems()
    {
        var utcNow = SystemClock.UtcNow;
        if (TimeSpan.FromSeconds(_options.ExpirationScanFrequency) < utcNow - _lastExpirationScan)
        {
            _lastExpirationScan = utcNow;
            Task.Factory.StartNew(state => ScanForExpiredItems((InMemoryCaching)state), this,
                CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
        }
    }

    private void ScanForExpiredItems(InMemoryCaching cache)
    {
        var now = SystemClock.UtcNow;
        foreach (var entry in cache._memory.Values.Where(x => x.ExpiresAt < now))
        {
            cache.Remove(entry.Key);
        }
    }

如果您希望这些缓存永不过期,您可以将此值设置为 0,然后它将永远不会检查过期时间。

更多细节,您可以参考以下代码:

注意:该设置只对内存缓存有效,redis中没有设置。

    //configuration
    services.AddEasyCaching(options => 
    {

         options.UseInMemory(config => 
        {
          config.DBConfig = new InMemoryCachingOptions
            {
                // scan time, default value is 60s
                ExpirationScanFrequency = 0, 
                // total count of cache items, default value is 10000
                SizeLimit = 100 
             };
     
         }, "m2");

    });  

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多