C# 在.Net Core 3.1中使IDistributedCache线程安全
我需要在我的应用程序中使用C# 在.Net Core 3.1中使IDistributedCache线程安全,c#,caching,.net-core,distributed-caching,C#,Caching,.net Core,Distributed Caching,我需要在我的应用程序中使用IDistributedCache,它可以是MemoryDistributedCache或RedisCache作为底层实现。据我所知,这些都不是线程安全的,所以我使用readerwriterlocksim创建了自己的包装器 ReaderWriterLockSlim允许多线程读取或独占访问写入。现在我想知道它是否是这个工作的正确工具,以及MemoryDistributedCache和RedisCache读取方法是否线程安全 至于整体解决方案,我理解从分布式缓存(如Redi
IDistributedCache
,它可以是MemoryDistributedCache
或RedisCache
作为底层实现。据我所知,这些都不是线程安全的,所以我使用readerwriterlocksim
创建了自己的包装器
ReaderWriterLockSlim
允许多线程读取或独占访问写入。现在我想知道它是否是这个工作的正确工具,以及MemoryDistributedCache
和RedisCache
读取方法是否线程安全
至于整体解决方案,我理解从分布式缓存(如Redis)存储和读取值需要时间。但我没有太多选择,因为我存储的值获取和管理起来更慢
以下是片段:
...
public async Task<byte[]> GetAsync(string key, CancellationToken token = new CancellationToken())
{
_cacheLock.EnterReadLock();
try
{
return await _cache.GetAsync(GetCacheKey(key), token);
}
finally
{
_cacheLock.ExitReadLock();
}
}
public async Task SetAsync(string key, byte[] value, DistributedCacheEntryOptions options, CancellationToken token = new CancellationToken())
{
_cacheLock.EnterWriteLock();
try
{
await _cache.SetAsync(GetCacheKey(key), value, options, token);
}
finally
{
_cacheLock.ExitWriteLock();
}
}
public async Task RemoveAsync(string key, CancellationToken token = new CancellationToken())
{
_cacheLock.EnterWriteLock();
try
{
await _cache.RemoveAsync(GetCacheKey(key), token);
}
finally
{
_cacheLock.ExitWriteLock();
}
}
。。。
公共异步任务GetAsync(字符串键,CancellationToken token=new CancellationToken())
{
_cacheLock.EnterReadLock();
尝试
{
返回wait\u cache.GetAsync(GetCacheKey(key),token);
}
最后
{
_cacheLock.exitradlock();
}
}
公共异步任务SetAsync(字符串键,字节[]值,DistributedCacheEntryOptions选项,CancellationToken=new CancellationToken())
{
_cacheLock.EnterWriteLock();
尝试
{
wait_cache.SetAsync(GetCacheKey(key)、值、选项、令牌);
}
最后
{
_cacheLock.ExitWriteLock();
}
}
公共异步任务RemoveAsync(字符串键,CancellationToken token=new CancellationToken())
{
_cacheLock.EnterWriteLock();
尝试
{
wait_cache.RemoveAsync(GetCacheKey(key),token);
}
最后
{
_cacheLock.ExitWriteLock();
}
}
所有IDistributedCache
实现都应该是线程安全的。如果没有,那么请创建一个bug报告来修复它
即使其中一个不是线程安全的,使用readerwriterlocksim
来保护async
代码也是无效的。发件人:
ReaderWriterLockSlim已管理线程关联;也就是说,每个线程对象必须进行自己的方法调用才能进入和退出锁定模式。没有线程可以更改另一个线程的模式
最简单的解决方法是使用
SemaphoreSlim
而不是ReaderWriterLockSlim
MemoryDistributedCache
是线程安全的,因为在内部使用MemoryCache。非常感谢。但是RedisCache呢?RedisCache
不是线程安全的。他们使用IDatabase
作为单例。好的,那么我就往正确的方向走。或不确定reads.IMO所有IDistributedCache
的实现都应该是线程安全的。太好了,我不需要写任何东西了!但我如何确保它实际上是线程安全的呢?最好的方法是在文档中找到它,如果失败了,请询问作者。