easyswoole - 基于swoole扩展实现的一款高性能php框架

redis協程客戶端

雖然swoole有著自帶的協程客戶端,但是在生產環境中我們發現了一些問題:
swoole的redis客戶端并沒有完全支持redis的全部命令,比如geo搜索,還有事務,特別是集群模式的redis,swoole客戶端并不支持。為此,我們決定用swoole的tcp客戶端實現一個完整版的redis客戶端。

目前,該redis客戶端組件,已經支持除去腳本外的所有方法(目前支持了178個方法):

  • 連接方法(connection)
  • 集群方法(cluster)
  • geohash
  • 哈希(hash)
  • 鍵(keys)
  • 列表(lists)
  • 訂閱/發布(pub/sub)
  • 服務器(server)
  • 字符串(string)
  • 有序集合(sorted sets)
  • 集合 (sets)
  • 事務 (transaction)
  • 管道實現 (pipe)

由于redis的命令較多,可能漏掉1,2個命令

組件要求

  • php: >=7.1.0
  • ext-swoole: ^4.4.0
  • easyswoole/spl: ^1.2

安裝方法

composer require easyswoole/redis

倉庫地址

easyswoole/redis

基本使用

redis 單機配置

redis 在實例化時,需要傳入\EasySwoole\Redis\Config\RedisConfig實例:

配置名 默認參數 說明 備注
host 127.0.0.1 redis ip
port 6379 redis端口
unixSocket null unixSocket文件路徑 此參數配置后,將忽略host,port參數,直接通過UnixSocket連接.(>=1.3.0才可使用)
auth auth密碼
db null redis數據庫 當db配置不等于null時,在connect的時候會自動select該配置
timeout 3.0 超時時間
reconnectTimes 3 客戶端異常重連次數
serialize SERIALIZE_NONE 數據是否序列化 序列化參數有:SERIALIZE_NONE,SERIALIZE_PHP,SERIALIZE_JSON

redis 單機配置示例

$config = new \EasySwoole\Redis\Config\RedisConfig([
    'host'      => '127.0.0.1',
    'port'      => '6379',
    'auth'      => 'easyswoole',
    'db'        => null,
    'serialize' => \EasySwoole\Redis\Config\RedisConfig::SERIALIZE_NONE
]);

redis集群配置

redis 集群在實例化時,需要傳入\EasySwoole\Redis\Config\RedisConfig實例:

$config = new \EasySwoole\Redis\Config\RedisClusterConfig([
    ['172.16.253.156', 9001],
    ['172.16.253.156', 9002],
    ['172.16.253.156', 9003],
    ['172.16.253.156', 9004],
], [
    'auth' => '',
    'serialize' => \EasySwoole\Redis\Config\RedisConfig::SERIALIZE_PHP
]);

集群配置先傳入一個ip,port的多維數組,再傳入其他配置項,其他配置項和redis單機配置一致

需要注意,auth密碼需要集群所有節點相同,只支持一個密碼

redis單機使用示例

使用redis客戶端(需要協程環境)

<?php
include "../vendor/autoload.php";
go(function (){
    $redis = new \EasySwoole\Redis\Redis(new \EasySwoole\Redis\Config\RedisConfig([
        'host' => '127.0.0.1',
        'port' => '6379',
        'auth' => 'easyswoole',
        'serialize' => \EasySwoole\Redis\Config\RedisConfig::SERIALIZE_NONE
    ]));
    var_dump($redis->set('a',1));
    var_dump($redis->get('a'));
});

redis集群使用示例

<?php
include "../vendor/autoload.php";
go(function () {
    $redis = new \EasySwoole\Redis\RedisCluster(new \EasySwoole\Redis\Config\RedisClusterConfig([
        ['172.16.253.156', 9001],
        ['172.16.253.156', 9002],
        ['172.16.253.156', 9003],
        ['172.16.253.156', 9004],
    ], [
        'auth' => '',
        'serialize' => \EasySwoole\Redis\Config\RedisConfig::SERIALIZE_PHP
    ]));
    var_dump($redis->set('a',1));
    var_dump($redis->get('a'));
    var_dump($redis->clusterKeySlot('a'));

});

回調事件

redis組件中,自定義了2個回調事件,用于代碼跟蹤調試,可在config中設置:

<?php
$redisConfig = new RedisConfig([
   'host' => REDIS_HOST,
   'port' => REDIS_PORT,
   'auth' => REDIS_AUTH,
]);
// 命令執行之前將調用
$redisConfig->onBeforeEvent(function ($commandName,$commandData){
   var_dump ($commandName,$commandData);
});
//命令獲取到結果后將調用
$redisConfig->onAfterEvent(function ($commandName,$commandData,$result){
   var_dump ($commandName,$commandData,$result);
});

回調事件支持事務,pipe.
在pipe模式中,只有最后excePipe時才會調用回調事件.

異常處理

redis組件根據錯誤的級別,區分了2種錯誤信息

異常

當redis連接失敗,無法和redis服務通信時,將會拋出EasySwoole\Redis\Exception\RedisException 異常,例如配置錯誤:

PHP Fatal error:  Uncaught EasySwoole\Redis\Exception\RedisException: connect to redis host 127.0.0.1:6379 fail after retry 4 times in /www/easyswoole/tioncico_redis/src/Redis.php:2866
Stack trace:
#0 /www/easyswoole/tioncico_redis/src/Redis.php(579): EasySwoole\Redis\Redis->sendCommand(Array)
#1 /www/easyswoole/tioncico_redis/tests/test.php(17): EasySwoole\Redis\Redis->get('a')
#2 {main}
  thrown in /www/easyswoole/tioncico_redis/src/Redis.php on line 2866

接管異常

go(function () {

    $redisConfig = new \EasySwoole\Redis\Config\RedisConfig();
    $redisConfig->setAuth('easyswoole');
    $redis = new \EasySwoole\Redis\Redis($redisConfig);
    try{

        $data = $redis->rawCommand(['set','a','1','1']);//多了一個參數,redis將會報語法錯誤
         var_dump($data);

    }catch (\EasySwoole\Redis\Exception\RedisException $exception){

        var_dump($exception->getMessage());
        var_dump($exception->getRedisErrorCode());
        var_dump($exception->getRedisErrorMsg());
    }
});
主站蜘蛛池模板: 武汉不锈钢水箱厂家_武汉不锈钢消防水箱定做批发_武汉不锈钢消防水箱加工厂 | 呕吐毒素快速检测仪-黄曲霉毒素测定仪-玉米赤霉烯酮快速检测卡-南京微测生物科技有限公司 | 莱湾科技-智能会议室|多功能|多媒体|音视频|无纸化|远程视频会议室运维 | 交通标志牌-交通标牌-铝圆牌-铝三角片-铝滑槽-公路警示指示牌-方牌-高速道路反光牌毛坯-交通设施安全警示标识牌-路名指示限速限高牌-厂家加工交通标牌铝板半成品毛坯-上海吕盟铝业有限公司 | 新闻营销媒体发稿-新闻发布-文芳阁网络媒体发稿公司 | 西安测试仪-西安电压测试仪-西安电流测试仪-西安热油汽水测试仪-西安阻抗测试仪-西安时间速度测试仪-西安电力设备厂家-西安中洲电力设备有限公司 | 青山套筒_直螺纹钢筋连接套筒加工_全灌浆套筒灌浆料_半灌浆套筒生产-衡水安达机械设备有限公司 | 唐山自粘防水|沥青防水涂料信息|压膜防水卷材报价-德生防水股份有限公司 | 纸袋胶-糊盒胶-礼盒胶-裱纸胶-水性喷胶-东莞市美好化工有限公司 纸袋机|多层纸袋机|高速纸袋机|无锡市天天友情机械有限公司 | 众学稳尚升学规划网-高考填报志愿机构_新高考选科指导 | 宣城安安橡塑有限责任公司| 苏州拆除公司_太仓拆除公司_常熟拆除公司_昆山拆除公司--苏州伊诺尔拆除工程有限公司 | 压力变送器,差压变送器,液位变送器,温度变送器生产厂家价格-西安仕乐克仪表科技有限公司 | 无锡紫苹果装饰首页-高端别墅装修设计,专业别墅装饰公司 | 上海商标注册,上海注册商标,上海商标代理,国际商标注册,版权登记-上海律点知识产权代理有限公司 上海山田机械有限公司 | 津成电线电缆价格,天津津成线缆,津成线缆销售电话,天津津成线缆批发电话-天津市津成电线电缆有限公司 | 伸缩接头,限位伸缩接头,传力接头,可拆卸接头,橡胶接头,衬四氟橡胶接头,橡胶软连接,橡胶补偿器,防水套管- 巩义市隆盛管道设备有限公司 | 立式/卧式/潜水/液下/螺杆/耐磨/渣浆泵|泥浆泵|离心泵,厂家 - 河北聚盛泵业制造有限公司 | 实验室冷水机-冷却循环水系统-深圳市达沃西制冷设备厂 | 加药装置-排油烟装置-工业滤水器-连云港灵动 | 压力变送器,差压变送器,液位变送器,温度变送器生产厂家价格-西安仕乐克仪表科技有限公司 | 山东德曼医疗设备集团有限公司 | 河北新鑫矿冶设备有限公司-河北新鑫矿冶设备有限公司 | 山东装卸登车桥_液压装卸升降平台_固定|移动登车桥_山东牛斗重工厂家 | 塑木地板,塑木栏杆,塑木地板价格,塑木地板厂家—浙江尚元塑木制品有限公司 | 杀菌剂_除藻剂_杀菌灭藻剂_1227杀菌剂_中北精细化工 | 上海舞台灯光音响租赁搭建线阵_年会演出摇头光束面光灯出租_led电子显示屏出租-上海led大屏幕租赁 | 桐城_池州_枞阳_黄山_潜山_东至挖掘机租赁-安庆光兴机械租赁有限公司 | 宁夏密集型母线槽厂家-封闭式母线槽-电力工程安装-天地经纬电力 宁波允泰仪器有限公司-硬度计、拉力试验机、盐雾试验箱、影像测量仪、气动量仪 | 门禁控制器-自动道闸-停车场系统-车位引导系统-车牌识别系统-楼宇对讲-可视门铃-门禁一卡通-河北京鹏电子科技有限公司 | 新能源洗扫车、新能源压缩垃圾车_新能源路面养护车_电动树叶收集车_电动扫地机_电动洗地机_高尔夫球车 | 男装加盟,男装加盟店,男装代理,男装品牌加盟,品牌男装加盟-虎豹男装品牌加盟 | 全自动码垛机械手,码垛机器人,拆包机,缠绕机,开箱封箱装箱机厂家-山东昊宇自动化设备有限公司 | 山西华盛筑景装饰,山西专业公装公司,太原公装装修公司,包括:办公室,酒店宾馆,商铺店铺,学校幼儿园,会所会馆饭店餐馆等装修设计 | 铜陵冰雪制冷设备有限公司 | 山东装卸登车桥_液压装卸升降平台_固定|移动登车桥_山东牛斗重工厂家 | 视频制作_产品宣传片拍摄_二维动画制作公司-深圳火牛传媒 | 首创十载—广州专业美博会展览设计公司_美博会展台搭建工厂 | 石膏砂浆生产线_特种砂浆生产线_轻质抹灰石膏设备-青岛环港重工科技有限公司 | 氢能展,氢能展会,燃料电池展,加氢设备_氢气储运_制氢设备_氢燃料汽车_加氢站成套设备 | 智能搅拌锅_食品搅拌锅_多功能搅拌锅 - 青岛环速科技有限公司 |