【发布时间】:2020-10-20 21:28:42
【问题描述】:
目前我们使用 Apache Ignite.NET 瘦客户端来缓存不同的数据集。当数据请求到来时,我们检查数据是否已经存储在缓存中,如果没有,则从数据库中请求数据并将其放入缓存中。
如果同时出现两个数据请求,我想阻止多个数据库请求。 有没有办法在第一个数据库请求开始之前手动锁定缓存?因此第二个数据请求可以等到第一个请求完成。
我无法解决使用 .NET 并发原语的任务,因为缓存可以被多个客户端实例使用(负载平衡)。
我已经找到 ICache.Lock(TK key) 方法,但它似乎只锁定缓存中的指定行,并且仅在自托管模式下受支持,不适用于 Ignite.NET 这个客户端。
说明问题的一小段代码:
var key = "cache_key";
using (var ignite = Ignition.StartClient(new Core.Client.IgniteClientConfiguration { Host = "127.0.0.1" }))
{
var cacheNames = ignite.GetCacheNames();
if (cacheNames.Contains(key))
{
return ignite.GetCache<int, Employee>(key).AsCacheQueryable();
}
else
{
var data = RequestDataFromDatabase();
var cache = ignite.CreateCache<int, Employee>(new CacheClientConfiguration(
EmployeeCacheName, new QueryEntity(typeof(int), typeof(Employee))));
cache.PutAll(data);
return cache.AsCacheQueryable();
}
}
【问题讨论】: