代码之家  ›  专栏  ›  技术社区  ›  BenjiFB

C#内存缓存:在一次操作中追加到列表?

  •  -1
  • BenjiFB  · 技术社区  · 6 月前

    我正在使用 IMemoryCache ( Microsoft.Extensions.Caching.Memory )在ASP中。NET Core 9项目。我正在储存一个 List<string> 在该缓存中,并希望向该列表添加一个值。

    这似乎要求我:

    • 从缓存中提取列表
    • 将其复制到新列表中
    • 附加值
    • 将更新后的列表放回缓存中。
    var cacheKey = CacheKey(document.Resource.PartitionKey());
    var idsList = _memoryCache.Get(cacheKey) as List<string>;
    
    if (idsList != null)
    {
        var listCopy = new List<string>(idsList);
        idsList.Add(document.Resource.Id);
        _memoryCache.Set(cacheKey, listCopy);
    }
    

    这似乎为比赛条件创造了机会。围绕这些操作实现我自己的线程锁的最佳途径是什么?还是有更简单的方法?

    谢谢你的建议。

    1 回复  |  直到 6 月前
        1
  •  -1
  •   mjwills Myles McDonnell    6 月前

    你可以存储一个 ConcurrentBag ConcurrentBag不是列表,而是可以在没有竞争条件的情况下从多个线程并发更新。缺点是这个包被复制成 List 迭代时(foreach循环),这对于大型列表来说可能很昂贵。

    否则,如果你想快速迭代,你可以存储一个 列表 在缓存和a中 Lock ,锁将仅由线程持有,复制并替换(根据当前代码复制旧值后)缓存中的旧列表,以避免与执行相同操作的另一个写入器竞争,只读读取器可以从缓存中读取旧列表,而无需使用此锁,因为缓存是线程安全的。

    推荐文章