首页 > 作文

Swoole Redis 连接池的实现

更新时间:2023-04-06 22:57:12 阅读: 评论:0

概述

这是关于 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 中数据的 demo

tcp 调用:

实现 读取 mysql 中数据的 demo实现 读取 redis 中数据的 demo

websocket 调用:

实现 每秒展示 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 //入口文件

代码

rver/core/redis/redispool.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");        }    }}

rver/core/redis/redisdb.php

<?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;        }    }}

client/http/redis.php

<?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);

client/tpc/redis.php

<?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();

client/websocket/index.html

<!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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图