【发布时间】:2020-10-07 12:14:46
【问题描述】:
我正在使用 Apache Ignite .NET 瘦客户端为应用程序数据创建缓存。对于缓存,我将超时设置为 10 分钟。最近我通过 DBeaver 注意到,过期缓存仍然存在于 Ignite 中,没有任何数据。我在 Apache.Ignite.Examples 解决方案 (LinqExample.cs) 中尝试了超时,并且行为是相同的:缓存在 Ignite 中仍然存在,并且可以通过 DBeaver 和 .NET 瘦客户端(GetCacheNames 方法)查看。 我已尝试执行以下操作:
- 通过 ICacheclient.WithExpiryPolicy 方法设置超时
- 设置 CacheClientConfiguration.EagerTtl = true
- 设置 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 在答案下方的评论中有一个很好的建议。