MYSQL Handler Socket插件(四)安装与使用

一、安装HandlerSocket-Plugin-for-MySQL

https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL
#cd HandlerSocket-Plugin-for-MySQL
#sh ./autogen.sh
#./configure --with-mysql-source=/home/jfy/soft/Percona-Server-5.5.18-rel23.0 --with-mysql-bindir=/usr/local/mysql/bin --with-mysql-plugindir=/usr/local/mysql/lib/plugin

vi /etc/my.cnf
[mysqld]
plugin-load=handlersocket.so(plugin-load可略过不配)
loose_handlersocket_port = 9998 # 指定读请求端口号
# the port number to bind to (for read requests)
loose_handlersocket_port_wr = 9999 # 指定写请求端口号
# the port number to bind to (for write requests)
loose_handlersocket_threads = 16 # 指定读线程数目
# the number of worker threads (for read requests)
loose_handlersocket_threads_wr = 1 # 指定写线程数目
# the number of worker threads (for write requests)
open_files_limit = 65535
# to allow handlersocket accept many concurren connections, make open_files_limit as large as possible.

#mysql.server restart
#mysql
mysql>show plugins;
| handlersocket                  | ACTIVE | DAEMON             | handlersocket.so | BSD     |

# netstat -an | grep 9998
tcp        0      0 0.0.0.0:9998                0.0.0.0:*                   LISTEN

二、安装php-ext-handlersocketi

https://github.com/piteer1/php-handlersocket

#cd php-handlersocket-master
#/usr/local/php/bin/phpize
#./configure --with-php-config=/usr/local/php/bin/php-config
#make & make install

#vi /usr/local/php/lib/php.ini
extension=handlersocket.so

#php -m
handlersocket

三、测试

-- 用户表
drop table IF EXISTS user;
create table user (
    userid        char(8)     binary PRIMARY key,
    username      varchar(32) comment ‘用户昵称‘,
    feature       char(16)    comment ‘功能‘,
    siminfo       char(15)    comment ‘SIM信息IMSI‘,
    msisdn        char(13)    comment ‘用户手机号码‘,
    countyrcode   char(3)     comment ‘国家码‘,
    zgtflag       char(1)     comment ‘中港通标志YN‘,
    usertype      char(16)    comment ‘用户类型‘,
    operatorid    char(32)    comment ‘操作工号‘,
    createtime    TIMESTAMP   comment ‘创建时间‘,
    PRIMARY KEY (msisdn),
    unique index useridx(userid)
);

-- 用户帐户表
drop table IF EXISTS useracnt;
create table useracnt (
    userid        char(8)       binary PRIMARY key ,
    activetime    TIMESTAMP     comment ‘激活时间‘,
    amount        INT UNSIGNED  comment ‘帐户金额(分)‘,
    validdate     date          comment ‘有效期‘,
    status        char(1)       comment ‘帐户状态‘,
    nextkfdate    date          comment ‘下次扣费时间‘

);

<?php

$host = 'localhost';
$port = 9998;
$port_wr = 9999;
$dbname = 'voip';
$table1 = 'user';
$table2 = 'useracnt';

try
{
    $hs_read = new HandlerSocket($host, $port);
    $idx_user_r = $hs_read->createIndex(1, $dbname, $table1, 'PRIMARY', array('userid','zgtflag'));

    $hs_write = new HandlerSocket($host, $port_wr);
    $idx_useracnt_w = $hs_write->createIndex(2, $dbname, $table2, 'PRIMARY', 'amount');

}
catch (HandlerSocketException $exception)
{
    var_dump($exception->getMessage());
    die();
}

//GET
$retval = $idx_user_r->find('85265101177');
list($userid,$zgtflag) = $retval[0];
echo $userid . "\n";
echo $zgtflag . "\n";

//UPDATE
$amount=round(0.95*100);
$ret = $idx_useracnt_w->update($userid, array('-?' => $amount));
var_dump($ret);
if ( $ret === false)
{
    echo __LINE__, ':', $index->getError(), ':', PHP_EOL;
    die();
}
if ( !is_array($ret) ) {
    echo "update not found!\n";
    die();
}
if ( intval($ret[0][0]) < $amount ) {
    echo "balance is not enough!\n";
    die();
}

echo "update ok!\n";

unset($index);
unset($hs);

exit;


经测试,使用handlersocket比直接用sql大概能提高0.5倍左右,测试数据均在innodb buffer中


关于handlersocket协议可以参考这里:

https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/protocol.en.txt

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。