//defer方式获取连接 这个方式携程(携程就是一个请求)结束会自动回收
$redis = \EasySwoole\RedisPool\RedisPool::defer();
$redisCluster = \EasySwoole\RedisPool\RedisPool::defer();
$redis->set('a',1);
$redisCluster->set('a',1);
//invoke方式获取连接 这个方式是闭包的 使用完立马回收
\EasySwoole\RedisPool\RedisPool::invoke(function(\EasySwoole\Redis\Redis $redis){ var_dump($redis->set('a',1));});\EasySwoole\RedisPool\RedisPool::invoke(function(\EasySwoole\Redis\Redis $redis){ var_dump($redis->set('a',1));})
;//获取连接池对象 这个要手动销毁
$redisPool = \EasySwoole\RedisPool\RedisPool::getInstance()->getPool();$redisClusterPool = \EasySwoole\RedisPool\RedisPool::getInstance()->getPool();$redis = $redisPool->getObj();$redisPool->recycleObj($redis);
mysql
在高并发情况下,资源浪费的占用时间越短越好,可以提高程序的服务效率。
在ORM默认情况下是使用defer方法获取pool内的连接资源,并在协程退出时自动归还,在此情况下,在带来便利的同时,会造成不必要资源的浪费。
我们可以使用invoke方式,让ORM查询结束后马上归还资源,可以提高资源的利用率
$page = (int)$this->input('page', 1);
$value = DbManager::getInstance()->invoke(function ($client) use($page){
$limit = (int)$this->input('limit', 20);
$model = new UserModel();
$testUserModel = $model::invoke($client);
$data = $testUserModel->getAll($page, $this->input('keyword'), $limit);;
$this->writeJson(Status::CODE_OK, $data, 'success');
});
在此种模式下,主要有两个方法需要讲解。
DbManager下的invoke方法 (从连接池内获取一个连接,并在闭包完成时归还连接)
Model的invoke方法 (注入客户端连接,不再从连接池内defer获取)
什么是连接池
连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
简单来说,就是创建一个容器,并且把资源提前准备好放在里面,比如我们常用的redis连接、mysql连接。
连接池的优点
计算机是由许多零件组装而成,比如CPU、内存、硬盘等等。
当我们进行网络连接、请求的时候,就需要在不同组件中传递和返回各种信号、数据
比如在CPU、内存、网卡中,数据的传递,请求,获取。
如果在短时间内进行一万次mysql的连接,就需要在这个往返过程循环,在路上浪费了很多时间、性能消耗。
如果我们先把连接连接好,并且放在连接池中,程序中需要使用就从池中获取,执行操作。
就省去了反复创建连接、断开连接的操作。
可以减少I/O操作,提高资源利用率。
连接池数量如何设置
那么一个池需要设置多少数量比较合适呢?是不是越多越好?
连接数量需要根据并发数,以及数据库的处理情况来决定的,
比如你的数据库最大只能处理500个连接,那你设置700个,数据库照样处理不过来,设置过多并没有什么用处,反而可能会让数据库宕机
所以,一般情况下,连接池总数设置为100-200左右就够了(相当于200的并发)
这里的连接池数量,说的是总数量,在easyswoole中,需要根据进程来看,每个进程*连接池配置数量=总数量,比如easyswoole中worker进程为8,那你设置20个,那就是20*8=160的总数