这是关于 swoole 入门学习的第九篇文章:swoole redis 连接池的实现。
第八篇:swoole mysql 连接长篇文言文池的实现第七篇:swoole rpc 的实现第六篇:swoole 整合成一个小框架第五篇:swoole 多协议 多端口 的应用第四篇:swoole http 的应用第三篇:swoole websocket 的应用第二篇:swoole task 的应用第一篇:swoole timer 的应用收到读者反馈,“亮哥,文章能多点图片吗?就是将运行结果以图片的形式展示&中国文明网2021年网上祭英烈#8230;”
我个人觉得这是比较懒、动手能力差的表现,恩… 要勤快些。
但谁让文章是写给你们看的那,我以后尽量文章写的图文并茂一点。
上篇文章 分享了 mysql 连接池,这篇文章 咱们来分享下 redis 连接池。
在上篇文章的基础上进行简单调整即可,将实例化 mysql 的地方,修改成实例化 redis 即可,还要注意一些方法的调整。
这篇文章仅仅只实现一个 redis 连接池,篇幅就太少了,顺便将前几篇整合一下。
大概 demo 中包含这些点:
实现 mysql 连接池实现 mysql curd 方法的定义实现 redis 连接池实现 redis 方法的定义满足 http、tcp、websocket 调用提供 demo 供测试调整 目录结构http 调用:
实现 读取 mysql 中数据的 demo实现 读取 redis 中数据的 demotcp 调用:
实现 读取 mysql 中数据的 demo实现 读取 redis 中数据的 demowebsocket 调用:
实现 每秒展示 api 调用量 demo├─ client│ ├─ http│ ├── mysql.php //测试 mysql 连接│ ├── redis.php //测试 redis 连接│ ├─ tcp│ ├── mysql.php //测试 mysql 连接│ ├── redis.php //测试 redis 连接│ ├─ websocket│ ├── index.html //实现 api 调用量展示├─ controller│ ├─ order.php //实现 mysql curd│ ├─ product.php //实现 redis 调用│ ├─ statistic.php //模拟 api 调用数据├─ rver│ ├─ config│ ├── config.php //默认配置│ ├── mysql.php //mysql 配置│ ├── redis.php //redis 配置│ ├─ core│ ├── common.php //公共方法│ ├── core.php //核心文件│ ├── handlerexception.php //异常处理│ ├── callback //回调处理│ ├── onrequest.php│ ├── onreceive.php│ ├── ontask.php│ ├── ...│ ├── mysql│ ├── mysqldb.php│ ├── mysqlpool.php│ ├── redis│ ├── redisdb.php│ ├── redispool.php│ ├─ log -- 需要 读/写 权限│ ├── ...├─ index.php //入口文件
<?phpif (!defined('rver_path')) exit("no access");class redispool{ private static $instance; private $pool; private $config; public static function getinstance($config = null) { if (empty(lf::$instance)) { if (empty($config)) { throw new runtimeexception("redis config empty"); } lf::$instance = new static($config); } return lf::$instance; } public function __construct($config) { if (empty($this->pool)) { $this->config = $config; $this->pool = new chan($config['master']['pool_size']); for ($i = 0; $i < $config['master']['pool_size']; $i++) { go(function() u ($config) { $redis = new redisdb(); $res = $redis->connect($config); if ($res === fal) { throw new runtimeexception("failed to connect redis rver"); } el { $this->pool->push($redis); } }); } } } public function get() { if ($this->pool->length() > 0) { $redis = $this->pool->pop($this->config['master']['pool_get_timeout']); if (fal === $redis) { throw new runtimeexception("pop redis timeout"); } defer(function () u ($redis) { //释放 $this->pool->push($redis); }); return $redis; } el { throw new runtimeexception("pool length <= 0"); } }}
<?phpif (!defined('rver_path')) exit("no access");class redisdb{ private $master; private $slave; private $config; public function __call($name, $arguments) { // todo 主库的操作 $command_master = ['t', 'ht', 'sadd']; if (in_array($name, $command_master)) { $db = 合抱之木$this->_get_usable_db('slave'); } el { $db = $this->_get_usable_db('master'); } $result = call_ur_func_array([$db, $name], $arguments); return $result; } public function connect($config) { //主库 $master = new swoole\coroutine\redis(); $res = $master->connect($config['master']['host'], $config['master']['port']); if ($res === fal) { throw new runtimeexception($master->errcode, $master->errmsg); } el { $this->master = $master; } //从库 $slave = new swoole\coroutine\redis(); $res = $slave->connect($config['slave']['host'], $config['slave']['port']); if ($res === fal) { throw new runtimeexception($slave->errcode, $slave->errmsg); 木犀 } el { $this->slave = $slave; } $this->config = $config; return $res; } private function _get_usable_db($type) { if ($type == 'master') { if (!$this->master->connected) { $master = new swoole\coroutine\redis(); $res = $master->connect($this->config['master']['host'], $this->config['master']['port']); if ($res === fal) { throw new runtimeexception($master->errcode, $master->errmsg); } el { $this->master = $master; } } return $this->master; } elif ($type == 'slave') { if (!$this->slave->connected) { $slave = new swoole\coroutine\redis(); $res = $slave->connect($this->config['slave']['host'], $this->config['slave']['port']); if ($res === fal) { throw new runtimeexception($slave->errcode, $slave->errmsg); } el { $this->slave = $slave; } } return $this->slave; } }}
<?php$demo = [ 'type' => 'sw', 'token' => 'bb1r3ylipbktp5p0', 'param' => [ 'class' => 'product', 'method' => 't', 'param' => [ 'key' => 'c4649', 'value' => '订单-c4649' ], ],];$ch = curl_init();$options = [ curlopt_url => 'http://10.211.55.4:9509/', curlopt_post => 1, curlopt_postfields => json_encode($demo),];curl_topt_array($ch, $options);curl_exec($ch);curl_clo($ch);
<?phpclass client{ private $client; public function __construct() { $this->client = new swoole_client(swoole_sock_tcp, swoole_sock_async); $this->client->on('connect', [$this, 'onconnect']); $this->client->on('receive', [$this, 'onreceive']); $this->client->on('clo', [$this, 'onclo']); $this->client->on('error', [$this, 'onerror']); } public function connect() { if(!$fp = $this->client->connect("0.0.0.0", 9510, 1)) { echo "error: {$fp->errmsg}[{$fp->errcode}]".php_eol; return; } } public function onconnect() { fwrite(stdout, "测试rpc (y or n):"); swoole_event_add(stdin, function() { $msg = trim(fgets(stdin)); if ($msg == 'y') { $this->nd(); } fwrite(stdout, "测试rpc (y or n):"); }); } public function onreceive($cli, $data) { echo '[received]:'.$data; } public function nd() { $demo = [ 'type' => 'sw', 'token' => 'bb1r3ylipbktp5p0', 'param' => [ 'class' => 'product', 'method' => 'get', 'param' => [ 'code' => 'c4649' ], ], ]; $this->client->nd(json_encode($demo)); } public function onclo() { echo "client clo connection".php_eol; } public function onerror() { }}$client = new client();$client->connect();
<!doctype html><html><head> <meta chart="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="keywords" content=""> <title>demo</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script> <script src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script></head><body><!-- 为echarts准备一个具备大小(宽高)的dom --><div id="main" style="width: 900px;height:400px;"></div><script type="text/javascript"> if ("websocket" in window) { // 基于准备好的dom,初始化echarts实例 var mychart = echarts.init(document.getelementbyid('main')); var wsrver = 'ws://10.211.55.4:9509'; var ws = new websocket(wsrver); ws.onopen = function (evt) { if (ws.readystate == 1) { console.log('websocket 连接成功...'); } el { console.log('websocket 连接失败...'); } if (ws.readystate == 1) { ws.nd('开始请求...'); } el { alert('websocket 连接失败'); } }; ws.onmessage = function (evt) { console.log('retrieved data from rver: ' + evt.data); var evt_data = jquery.parjson(evt.data); mychart.toption({ xaxis: { data : evt_data.time }, ries: [{ data: evt_data.value }] }); }; ws.onerror = function (evt) { alert('websocket 发生错误'); console.log(evt); }; ws.onclo = function() { alert('websocket 连接关闭'); console.log('websocket 连接关闭...'); }; // 指定图表的配置项和数据 $.ajax({ url : 'http://10.211.55.4:9509/', // 请求url type : "post", // 提交方式 datatype : "json", // 数据类型 data : { 'type' : 'sw', 'token' : 'bb1r3ylipbktp5p0', 'param' : { 'class' : 'statistic', 'method' : 'init' } }, beforend:function() { }, success : function(rs) { if (rs.code != 1) { alert('获取数据失败'); } el { var option = { title: { text: 'api 调用量', x:'center' }, tooltip: { trigger: 'axis', axispointer: { animation: fal } }, xaxis: { type : 'category', 晚会主持人开场白 data : rs.data.time }, yaxis: { type: 'value', boundarygap: [0, '100%'], name: '使用量', splitline: { show: fal } }, ries: [{ name: '使用量', type: 'line', showsymbol: fal, hoveranimation: fal, data: rs.data.value }] }; // 使用刚指定的配置项和数据显示图表。 if (option && typeof option === "object") { mychart.toption(option, true); } } }, error : function(){ alert('服务器请求异常'); } }); } el { alert("您的浏览器不支持 websocket!"); }</script></body></html>
还涉及到,onmessage.php、ontask.php 、onworkerstart.php 等,就不贴代码了。
小框架的启动/关闭/热加载,看看这篇文章: 第六篇:swoole 整合成一个小框架
里面 demo 在 client 文件夹下。
http 目录下的文件,放到自己虚拟目录下,用浏览器访问。
tcp 目录下的文件,在 cli 下运行。
websocket 目录下的文件,直接点击在浏览器访问。
官方协程 redis 客户端手册:
大家可以尝试使用官方提供的其他方法。
demo 代码仅供参考,里面有很多不严谨的地方,根据自己的需要进行修改 …
上面的 demo 需要源码的,加我微信。(菜单-> 加我微信-> 扫我)
本文欢迎转发,转发请注明作者和出处,谢谢!
本文发布于:2023-04-06 22:56:25,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/4fecc890f725ea27f34dfa974c35ead7.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Swoole Redis 连接池的实现.doc
本文 PDF 下载地址:Swoole Redis 连接池的实现.pdf
留言与评论(共有 0 条评论) |