• .net core 队列


          消息队列也是缓存的一种,那么队列通常什么时候才会用到呢?个人认为一般用在处理数据非常大,并发量量高的时候会用到,可以避免数据高峰期系统崩溃。试想一下,如果出现数据高峰期,把一些来不及处理的数据放在队列里,高峰期过后再慢慢处理,既减轻了服务器的压力,又不会造成数据的丢失,岂不是很好!

         今天我们用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);

     移除一条数据,清空数据。。。。。自己感兴趣的话可以测一下。这里就不多做介绍了!

      

       

  • 相关阅读:
    oracle序列的使用
    oracle学习
    项目部署的一些问题
    mybatis的resultMap与resultType的区别
    react-router-dom路由switch使用
    Json.parse 和Json.stringfy()用法
    页面中js按顺序加载完全的方法
    伪数组转为真数组
    import和export的作用
    Object.entries()
  • 原文地址:https://www.cnblogs.com/zpy1993-09/p/13525421.html
Copyright © 2020-2023  润新知