【问题标题】:Does ignite removes caches after expirations?ignite 是否会在过期后删除缓存?
【发布时间】:2020-10-07 12:14:46
【问题描述】:

我正在使用 Apache Ignite .NET 瘦客户端为应用程序数据创建缓存。对于缓存,我将超时设置为 10 分钟。最近我通过 DBeaver 注意到,过期缓存仍然存在于 Ignite 中,没有任何数据。我在 Apache.Ignite.Examples 解决方案 (LinqExample.cs) 中尝试了超时,并且行为是相同的:缓存在 Ignite 中仍然存在,并且可以通过 DBeaver 和 .NET 瘦客户端(GetCacheNames 方法)查看。 我已尝试执行以下操作:

  1. 通过 ICacheclient.WithExpiryPolicy 方法设置超时
  2. 设置 CacheClientConfiguration.EagerTtl = true
  3. 设置 CacheClientConfiguration.ExpiryPolicyFactory
    var cacheNames = ignite.GetCacheNames(); // here I see that expired caches still exist

    var expiryPolicy = new ExpiryPolicy(TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1));
        
    var employeeCache = ignite.GetOrCreateCache<int, Employee>(
                        new CacheClientConfiguration(EmployeeCacheName, new QueryEntity(typeof(int), typeof(Employee))) { EagerTtl = true })
                        .WithExpiryPolicy(expiryPolicy);

        var employeeCacheColocated = ignite.GetOrCreateCache<AffinityKey, Employee>(
                    new CacheClientConfiguration(EmployeeCacheNameColocated,
                        new QueryEntity(typeof(AffinityKey), typeof(Employee)))
                    { ExpiryPolicyFactory = new ExpiryPolicyFactory() })
                    .WithExpiryPolicy(expiryPolicy);

        var organizationCache = ignite.GetOrCreateCache<int, Organization>(
                    new CacheClientConfiguration(OrganizationCacheName, new QueryEntity(typeof(int), typeof(Organization))) { EagerTtl = true })
                    .WithExpiryPolicy(expiryPolicy);

        // Populate cache with sample data entries.
        PopulateCache(employeeCache);
        PopulateCache(employeeCacheColocated);
        PopulateCache(organizationCache);

...

    public class ExpiryPolicyFactory : IFactory<IExpiryPolicy>
    {
        public IExpiryPolicy CreateInstance()
        {
            return new ExpiryPolicy(TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1));
        }
    }

我做错了吗?如何在 Ignite 中移除过期缓存?

【问题讨论】:

  • 过期策略仅适用于缓存条目。 Ignite 从不自动删除缓存。你能解释一下用例吗,为什么还要删除缓存?
  • Pavel,对于应用程序中的每个屏幕,我都会在 Ignite 中创建一个带有记录的信号缓存,并发出 LINQ 请求以进行排序、过滤。当数据过期时,我希望缓存被销毁,应用程序将向数据库发出请求并再次缓存数据。相反,应用程序找到没有数据的缓存并显示没有数据的空屏幕。即使我找到了一种解决方法并在缓存中存储了一些过期标志,仍然不清楚为什么缓存没有被破坏。应用程序可以创建数百个缓存,具体取决于用户将访问多少个屏幕。我认为我的用例相当典型
  • 这种情况一点都不典型,你在其他产品上见过吗? Ignite Cache 更像是常规 SQL 数据库中的表。想象一下,当 SQL 表为空时,它会被删除——这很奇怪,对吧? @alamar 在答案下方的评论中有一个很好的建议。

标签: c# .net ignite


【解决方案1】:

Apache Ignite 缓存是长期存在的,它们的创建/销毁是昂贵的操作。

因此,它们不会自动删除,我建议不要使用经常删除缓存的工作流。我建议重复使用。

【讨论】:

  • 在我的应用程序中,我需要临时缓存数据。我的意思是,10 分钟后应该从实际数据源中检索数据并再次缓存。如何区分缓存是否由于过期或空数据集合被缓存而为空?为什么缓存数据删除不是缓存销毁的昂贵操作?
  • 数据删除操作成本取决于数据量,但可以并行化。缓存破坏会导致短暂的集群范围锁定(分区映射交换)因此,您最好单独跟踪此缓存状态。也许在不同的缓存中。
猜你喜欢
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 2016-05-07
  • 2021-08-12
  • 2011-12-28
  • 2021-08-11
相关资源
最近更新 更多