在 .Net Core 3.1 中使 IDistributedCache 线程安全

alv*_*peo 4 c# caching distributed-caching .net-core

我需要IDistributedCache在我的应用程序中使用它,它可以是MemoryDistributedCacheRedisCache作为底层实现。我的理解是这些不是线程安全的,所以我使用ReaderWriterLockSlim.

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();
            }
        }
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 5

所有IDistributedCache实现都应该是线程安全的。如果不是,那么请创建一个错误报告以修复它。

即使其中之一不是线程安全的,ReaderWriterLockSlim用于保护async代码也是无效的。从文档

ReaderWriterLockSlim 管理线程关联;也就是说,每个 Thread 对象必须调用自己的方法来进入和退出锁定模式。没有线程可以改变另一个线程的模式。

最简单的解决方法是使用SemaphoreSlim而不是ReaderWriterLockSlim.