.NetCore框架Surging系列(十一)缓存资源池

.NetCore框架Surging系列(一)介绍
.NetCore框架Surging系列(二)HTTP
.NetCore框架Surging系列(三)HTTP本地路由发现过程
.NetCore框架Surging系列(四)RPC客户端过程
.NetCore框架Surging系列(五)路由注册
.NetCore框架Surging系列(六)路由发现
.NetCore框架Surging系列(七)路由监听
.NetCore框架Surging系列(八)性能评估
.NetCore框架Surging系列(九)性能提升
.NetCore框架Surging系列(十)RPC机密传输数据 - DotNetty开启TLS

.NetCore框架Surging系列(十一)缓存资源池


缓存资源池,在cacheSettings.json设定 minSizemaxSize配置时,这里 maxSize配置资源池中缓存客户端保持的TCP连接数, minSize为第一次初始换资源池时一次性创建的资源数。

流程

在这里插入图片描述

源码

源码不长,如下

public class ObjectPool<T>
    {
       //省略 字段

        /// <summary>
        /// 构造一个对象池
        /// </summary>
        /// <param name="func">用来初始化对象的函数</param>
        /// <param name="minSize">对象池下限</param>
        /// <param name="maxSize">对象池上限</param>
        public ObjectPool(Func<T> func, int minSize = 100, int maxSize = 100)
        {
            //省略 参数格式检查
            //省略 字段赋值
            
            // 这里 给资源池创建最小对象
            for (var i = 0; i < this.minSize; i++)
            {
                this.queue.Enqueue(func());
            }
            
            //省略 字段赋值
        }

        /// <summary>
        /// 从对象池中取一个对象出来, 执行完成以后会自动将对象放回池中
        /// </summary>
        public T GetObject()
        {
            var t = default(T);
            try
            {
            	// 在获取资源时 如果资源池没有充满则,创建资源并添加到池中
                if (this.tryNewObject < this.maxSize)
                {
                    Interlocked.Increment(ref this.tryNewObject);
                    t = func();
                    // Interlocked.Increment(ref this.currentResource);
                }
               // 在获取资源时 如果资源池满了则直接获取一个资源
               // 注 这里采用队列存储资源,获取资源时为出队操作
                else  
                {
                    this.Enter();
                    t = this.queue.Dequeue();
                    this.Leave();
                    Interlocked.Decrement(ref this.currentResource);
                }
                return t;
            }
            finally
            {
            	//在方法返回资源时 将资源重新加入队列中
                this.Enter();
                this.queue.Enqueue(t);
                this.Leave();
                Interlocked.Increment(ref currentResource);
            }
        }

    }

总结

  1. minSize、maxSize设定范围
    minSize不能设置过大1-100,在之前的并发测试中,设定100,建议设为10。设置1000系统启动速度非常慢。
    maxSize也不能设置太大,设置太大也没有什么用,之前并发测试中设置200能够支持3000以上的吞吐量。
  2. 资源池不能通用
    因为资源池中的资源还没用完就归还到池中,当然Redis连接同时被多个线程使用无所谓。如果资源占用有排他性,那么资源在使用完毕之后才能归还。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值