标签:获取 last 事件 aci tor pre col 订阅 enqueue
摘要:最近办了一件蠢事,我在一个高并发的订阅事件里操作数据库的I/O 操作,坑了自己一把,虽然定时清除了数据,但是跑了一段时间之后还是出问题了,后面就加入了队列去存储一段时间的数据,解决了这个问题,操作内存和磁盘不是一个级别的.特别是高并发的情况下,最好别对磁盘进行I/O操作,用不好只能坑了自己.
ConcurrentQueue<T>队列是一个高效的线程安全的队列,是.Net Framework 4.0,System.Collections.Concurrent命名空间下的一个数据结构
ConcurrentQueue是一个先进先出的队列,常用的有以下几个方法:
以下是我封装的常用类
public class RingStringBuilder { private static ConcurrentQueue<RealTimeInfo> concurrentQueue = new ConcurrentQueue<RealTimeInfo>(); private static int _maxCapacity;//队列最大值 public RingStringBuilder(int maxCapacity) { _maxCapacity = maxCapacity; } /// <summary> /// 根据队列设置的最大值判断 /// 超过最大值,移除队列第一条,队列末尾添加一条 /// 没超过最大值,一直在队列尾部添加 /// </summary> /// <param name="info"></param> public static void Append(RealTimeInfo info) { concurrentQueue.Enqueue(info); if (concurrentQueue.Count > _maxCapacity) { concurrentQueue.TryDequeue(out info); } } /// <summary> /// 查询列表 /// </summary> /// <returns></returns> public static List<RealTimeInfo> Query() { return concurrentQueue.ToList(); } /// <summary> /// 获取最后一条数据 /// </summary> /// <returns></returns> public static RealTimeInfo GetLastOrDefault() { return concurrentQueue.LastOrDefault(); } /// <summary> /// 获取第一条数据 /// </summary> /// <param name="info"></param> /// <returns></returns> public static RealTimeInfo GetFirstOrDefault(out RealTimeInfo info) { concurrentQueue.TryPeek(out info); return info; } }
.NetCore 线程安全的ConcurrentQueue<T>队列
标签:获取 last 事件 aci tor pre col 订阅 enqueue
原文地址:https://www.cnblogs.com/zhangjd/p/13409224.html