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
的实现都应该是线程安全的。太好了,我不需要写任何东西了!但我如何确保它实际上是线程安全的呢?最好的方法是在文档中找到它,如果失败了,请询问作者。