首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# 高併發場景下列表去重、定時清理與實時寫入的無鎖解決方案:ConcurrentQueue 與生產者消費者模式

     編輯:程式設計疑難解答

需求痛點

  • 24/7 實時寫入,要求去重。
  • 達到閾值定時清理舊數據,但保留最近 N 條。
  • 清理期間不阻塞寫入,且清理後不與清理前數據重複。

方案:ConcurrentQueue + HashSet

var queue = new ConcurrentQueue<T>();
var set = new ConcurrentDictionary<T, byte>(); // 值無意義,利用 Key 去重
var maxSize = 200;
var cleanThreshold = 150;

// 生產者
void Enqueue(T item) {
    if (set.TryAdd(item, 0)) {
        queue.Enqueue(item);
        // 觸發清理邏輯(可用單獨 Timer 任務)
    }
}

// 清理任務
void Cleanup() {
    while (queue.Count > cleanThreshold && queue.TryDequeue(out var old)) {
        set.TryRemove(old, out _);
    }
}

優勢

  • 無鎖併發,吞吐量高。
  • ConcurrentDictionary 保證去重線程安全。
  • 清理邏輯簡單:出隊即移除集合,天然保證不重複。

替代:Channel (NET Core 3.0+)

System.Threading.Channels.Channel 內置容量限制、背壓、異步讀寫,更現代化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved