消息队列也是缓存的一种,那么队列通常什么时候才会用到呢?个人认为一般用在处理数据非常大,并发量量高的时候会用到,可以避免数据高峰期系统崩溃。试想一下,如果出现数据高峰期,把一些来不及处理的数据放在队列里,高峰期过后再慢慢处理,既减轻了服务器的压力,又不会造成数据的丢失,岂不是很好!
今天我们用ConcurrentQueue 做一个消息队列。有些人可能会经常用Queue做消息队列,他们之间有什么区别吗?个人认为区别不大。但是ConcurrentQueue更优。为什么呢?ConcurrentQueue已经对线程安全做了封装,也就是说不用自己处理线程安全问题了,而Queue要做线程安全处理。
我写了一个ConcurrentQueueHelper通用类,来对消息队列进行操作。
public class ConcurrentQueueHelper<T> { private static ConcurrentQueue<T> concurrentQueue = new ConcurrentQueue<T>();//定义一个消息队列 private static int QueueMaxLenght=200;//队列最大值 public static T OutT; public ConcurrentQueueHelper(int maxCapacity) { QueueMaxLenght = maxCapacity; } /// <summary> /// 清空缓存 /// </summary> public static bool Clear() { int count = Query().Count; for (int i = 0; i < count; i++) { if (!concurrentQueue.TryDequeue(out OutT)) { return false; } } return true; } /// <summary> /// 根据队列设置的最大值判断 /// 超过最大值,移除队列第一条,队列末尾添加一条 /// 没超过最大值,一直在队列尾部添加 /// </summary> /// <param name="info"></param> public static void Append(T t) { concurrentQueue.Enqueue(t); if (concurrentQueue.Count > QueueMaxLenght) { concurrentQueue.TryDequeue(out t); } } /// <summary> /// 获取队列中元素的个数 /// </summary> /// <returns></returns> public static int GetCount() { return concurrentQueue.Count; } /// <summary> /// 判断队列是否为空 /// </summary> /// <returns></returns> public static bool GetEmpty() { return concurrentQueue.IsEmpty; } /// <summary> /// 尝试移除并返回并发队列开头处的对象 /// </summary> /// <param name="t"></param> /// <returns></returns> public static bool RemoveQueue() { //Dequeue return concurrentQueue.TryDequeue(out OutT); } /// <summary> /// 查询列表 /// </summary> /// <returns></returns> public static List<T> Query() { return concurrentQueue.ToList(); } /// <summary> /// 获取最后一条数据 /// </summary> /// <returns></returns> public static T GetLastOrDefault() { return concurrentQueue.LastOrDefault<T>(); } /// <summary> /// 获取第一条数据,但是不会移除第一条记录 /// </summary> /// <param name="info"></param> /// <returns></returns> public static T GetFirstOrDefault() { concurrentQueue.TryPeek(out OutT); return OutT; } }
为了测试,我们建两个模型 student类和animal类:
public class Student { public string name { get; set; } public int number { get; set; } public int age { get; set; } }
public class Animal { public string name { get; set; } public int age { get; set; } }
开始测试:
1,将Student信息和Animal信息放入队列中,然后将消息出队列。
class Program { static void Main(string[] args) { for (int i = 0; i < 100; i++) { ConcurrentQueueHelper<Student>.Append(new Student { name = "张三", number = 123456, age = i }); } for (int i = 0; i < 200; i++) { ConcurrentQueueHelper<Animal>.Append(new Animal { name = "哈巴狗", age = i }); } List<Animal> an = ConcurrentQueueHelper<Animal>.Query();//获取队列中所有数据 for (int i = 0; i < an.Count; i++) { Console.WriteLine(an[i].name + an[i].age); } List<Student> s= ConcurrentQueueHelper<Student>.Query();//获取队列中所有数据 for (int i = 0; i < s.Count; i++) { Console.WriteLine(s[i].name + s[i].age); } }}
获取队列的第一条消息:
Student stu = ConcurrentQueueHelper<Student>.GetFirstOrDefault();
Console.WriteLine(stu.name+stu.age);
获取队列的最后一个调信息:
Animal a = ConcurrentQueueHelper<Animal>.GetLastOrDefault();
Console.WriteLine(a.name + a.age);
移除一条数据,清空数据。。。。。自己感兴趣的话可以测一下。这里就不多做介绍了!