Я нашел это полезным, и он, кажется, делает то, что я хочу: https://redis.io/topics/distlock, более конкретно: https://github.com/samcook/RedLock.net
Регистрация:
services.AddSingleton<IDistributedLockFactory, RedLockFactory>(x =>
RedLockFactory.Create(new List<RedLockEndPoint> { new DnsEndPoint(options.Host, options.Port) }));
Использование:
public RedisCache(IDistributedCache cache, IDistributedLockFactory lockFactory)
{
_cache = cache;
_lockFactory = lockFactory;
}
public async Task<T> GetOrAddAsync(string key, Func<T> createItem)
{
...
using (var redLock = await _lockFactory.CreateLockAsync(key, _expire, _wait, _retry))
{
if (redLock.IsAcquired)
{
// do stuff here
_cache.Set(.....);
}
}
return cacheEntry;
}