前段时间偶然的机会了解到Handlersocket,并在自己的一个demo中得以应用,在此做下总结。
一、HandlerSocket是什么?
HandlerSocket是akira higuchi 写的一个MySql的插件。以MySQL Daemon Plugin的形式提供类似NoSQL的网络服务,通过这个插件,你可以直接跟MySQL后端的存储引擎做key-value式的交互,省去了MySQL上层的SQL解释、打开关闭表、创建查询计划等CPU开销。
二、安装配置
1. 安装
由于HandlerSocket是基于MySQL数据库的,因此在安装HanderSocket前需要先按照常规方式部署MySQL服务,同时需注意HandlerSocket时需要MySQL的源码,因此还需要MySQL源码编译方式安装。
# tar xvfz HandlerSocket-Plugin-for-MySQL-Master.tar.gz # cd HandlerSocket-Plugin-for-MySQL-Master/ # ./autogen.sh # ./configure --with-mysql-source=/data/software/mysql-5.5.12 \ --with-mysql-bindir=/usr/local/mysql55/bin \ --with-mysql-plugindir=/usr/local/mysql55/lib/plugin
其中:
--with-mysql-source:指定MySQL源码所在目录
--with-mysql-bindir:指定mysql_config所在目录
--with-mysql-plugindir:指定MySQL插件的存储路径
执行make编译安装:
#make && make install
完成后,mysql-plugindir目录下应有handlersocket相关文件
2. 配置
#*********** HandlerSocket setting *********** 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 concurrent # connections, make open_files_limit as large as # possible.
启动MySQL服务,在MySQL中安装HandlerSocket插件:
mysql> install plugin handlersocket soname ¨handlersocket.so¨; Query OK, 0 rows affected (0.01 sec)
至此,HandlerSocket插件安装完毕。
三、PHP应用
<?php $host = 'localhost'; $port = 9998; $port_wr = 9999; $dbname = 'hstestdb'; $table = 'hstesttbl'; //GET $hs = new HandlerSocket($host, $port); if (!($hs->openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, 'k,v'))) { echo $hs->getError(), PHP_EOL; die(); } $retval = $hs->executeSingle(1, '=', array('k1'), 1, 0); var_dump($retval); $retval = $hs->executeMulti( array(array(1, '=', array('k1'), 1, 0), array(1, '=', array('k2'), 1, 0))); var_dump($retval); unset($hs); //UPDATE $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(2, $dbname, $table, '', 'v'))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeUpdate(2, '=', array('k1'), array('V1'), 1, 0) === false) { echo $hs->getError(), PHP_EOL; die(); } unset($hs); //INSERT $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(3, $dbname, $table, '', 'k,v'))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeInsert(3, array('k2', 'v2')) === false) { echo $hs->getError(), PHP_EOL; } if ($hs->executeInsert(3, array('k3', 'v3')) === false) { echo 'A', $hs->getError(), PHP_EOL; } if ($hs->executeInsert(3, array('k4', 'v4')) === false) { echo 'B', $hs->getError(), PHP_EOL; } unset($hs); //DELETE $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(4, $dbname, $table, '', ''))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeDelete(4, '=', array('k2')) === false) { echo $hs->getError(), PHP_EOL; die(); }
HandlerSocket的缺陷:
(1)写操作并没有淘汰查询缓存——如果执行了写操作通过HandlerSocket,由于没有失效查询缓存, 那么你可能从MySQL读到旧的数据;
(2)不支持自动递增——插入时无法从自增列上自动获得增量值。
鉴于以上问题,扬长避短,使用其合并查询操作,发挥其NoSQL性能获取MySQL的InnoDB类型表数据,具体操作如下:
<?php // 通过handlersocket获取数据 $hs = new HandlerSocket(HS_HOST, HS_PORT); if (!($hs->openIndex(1, 'database', 'table', HandlerSocket::PRIMARY, 'id,content,create_uid,create_user,created,state'))){ echo $hs->getError(), PHP_EOL; die(); } $dataList = array(); foreach ($ids as $id) { $dataList[] = array(1, "=", array($id)); } $data = $hs->executeMulti($dataList);
参考文档:
https://code.google.com/p/php-handlersocket/
http://www.5ienet.com/note/html/handlersocket/mysql_nosql_handlersocket_configure.shtml
相关推荐
MySQL插件HandlerSocket是一个创新性的开源项目,设计目的是为了提高数据库的读写性能,特别是对于大规模数据处理场景。它允许应用程序直接与InnoDB存储引擎交互,绕过了SQL查询解析、优化和执行等传统步骤,从而...
MySQL HandlerSocket插件是一款由akira higuchi开发的MySQL扩展,它以Daemon Plugin的形式运行,为MySQL提供了类似NoSQL的访问方式。该插件允许用户直接与存储引擎进行键值对交互,绕过了SQL解析、打开关闭表、创建...
HandlerSocket 是一个由日本开发者 akira higuchi 开发的 MySQL 插件,它的核心功能在于提供了一种直接与 MySQL 存储引擎进行键值对交互的方式,绕过了传统的 SQL 解析和执行过程,极大地提高了数据库的查询速度。...
HandlerSocket的应用场景:MySQL自身的局限性,很多站点都采用了MySQL+Memcached的经典架构,甚至一些网站放弃MySQL而采用NoSQL产品,比如Redis/MongoDB等。不可否认,在做一些简单查询(尤其是PK查询)的时候,很多...
HandlerSocket是一种基于MySQL实现的NoSQL插件,它提供了类似于NoSQL数据库的非结构化数据存储能力。通过直接与MySQL服务器通信,HandlerSocket可以绕过SQL解析器,直接读取和写入数据,从而实现更高的读写性能。 #...
总的来说,`php-handlersocket`提供了PHP与MySQL之间的一种高效通信机制,适用于需要高性能数据库访问的应用场景。开发人员在使用此扩展时,应该首先阅读README.md文件以获取安装和配置指导,然后可以通过测试目录...
结合以上信息,我们可以推测这个压缩包可能包含了一个使用PHP实现的HandlerSocket客户端,允许开发者在PHP应用程序中直接与MySQL的HandlerSocket插件通信,以提高数据库操作的性能。使用这个库的开发者需要了解PHP...
HandlerSocket是一个MySQL插件,它通过直接访问MySQL的数据存储层,跳过了SQL解析和查询计划等耗时步骤,从而极大地提高了读取速度。在内存足够大以容纳索引的情况下,使用HandlerSocket可以使MySQL的查询性能提升...
HandlerSocket是MySQL数据库的一个插件,它提供了直接访问存储引擎层的能力,允许PHP代码以类似NoSQL的方式快速读写数据库,跳过SQL解析和优化过程,从而提高性能。 描述中提到的"这是一个用php脚本语言写的其它...
2. **安装与配置**:安装HandlerSocket需要在MySQL服务器端启用插件,并在PHP环境中正确配置和加载对应的扩展。 3. **API使用**:了解HandlerSocket提供的PHP API,如`new handler_socket()`,`connect()`,`read()...
再者,可以考虑使用非SQL接口,如MySQL的HandlerSocket插件或者InnoDB NoSQL Plugin,它们可以直接操作存储引擎,绕过SQL解析,极大地提高了处理速度。特别是InnoDB NoSQL Plugin,它支持memcached协议,并共享...
HandlerSocket是由日本NTT DATA公司开发的一种用于MySQL的插件,它允许用户直接通过socket接口与MySQL存储引擎进行通信,绕过SQL解析和优化过程,从而显著提高数据读取速度。这对于大量读取操作的应用场景非常有用,...
HandlerSocket是由Nobuhiro Iwamatsu开发的一个MySQL插件,它提供了一个NoSQL风格的接口,绕过MySQL的查询解析、优化和执行过程,直接操作InnoDB存储引擎的数据,极大地提高了读写性能,特别适合大数据量的实时应用...
HandlerSocket是MySQL的一个插件,它允许开发者直接通过套接字接口访问数据库的数据,跳过SQL解析层,从而达到提高性能的目的。在PHP中使用HandlerSocket,可以显著提升对MySQL数据库进行大量读取操作的速度,因为...