Home > Database > Mysql Tutorial > body text

MySQL 使用 HandlerSocket 实现 NOSQL 功能

WBOY
Release: 2016-06-07 17:11:52
Original
897 people have browsed it

MySQL 使用 HandlerSocket 实现 NOSQL 功能

一、安装 
1、下载 mysql-5.1.54.tar.gz 解压至 /root/mysql/mysql-5.1.54 目录 
2、下载 ahiguti-HandlerSocket-Plugin-for-MySQL-1.0.6-94-g98b14c3.tar.gz 解压至 /root/mysql/ahiguti-HandlerSocket-Plugin-for-MySQL-98b14c3 目录 
3、以动态编译的形式编译安装 mysql 到 /usr/local/mysql5.1 
4、编译 HandlerSocket 插件,在 /root/mysql/ahiguti-HandlerSocket-Plugin-for-MySQL-98b14c3 目录 
# ./autogen.sh 
# ./configure --with-mysql-source=/root/mysql/mysql-5.1.54 --with-mysql-bindir=/usr/local/mysql5.1/bin --with-mysql-plugindir=/usr/local/mysql5.1/lib/mysql/plugin 
with-mysql-source 表示MySQL源代码目录,with-mysql-bindir 表示MySQL二进制可执行文件目录(也就是 mysql_config 所在目录),,with-mysql-plugindir 表示MySQL插件目录 
如果不清楚这个目录在哪,可以按如下方法查询: 
mysql> SHOW VARIABLES LIKE 'plugin%'; 
+---------------+-----------------------+ 
| Variable_name | Value                 | 
+---------------+-----------------------+ 
| plugin_dir    | /usr/lib/mysql/plugin | 
+---------------+-----------------------+ 
编译和安装 
# make && make install 

二、配置 MySQL 
# vi /etc/my.cnf 
[mysqld] 
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. 

激活HandlerSocket插件,在客户端命令执行 
mysql> install plugin handlersocket soname 'handlersocket.so'; 
查看 handlersocket 进程 
mysql>  show processlist 
+----+-------------+-----------------+---------------+---------+------+-------------------------------------------+------------------+ 
| Id | User        | Host            | db            | Command | Time | State                                     | Info             | 
+----+-------------+-----------------+---------------+---------+------+-------------------------------------------+------------------+ 
|  1 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
|  2 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
|  3 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
|  4 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
|  5 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
|  6 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
|  7 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
|  8 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
|  9 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
| 10 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
| 11 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
| 12 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
| 13 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
| 14 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
| 15 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
| 16 | system user | connecting host | NULL          | Connect | NULL | handlersocket: mode=rd, 0 conns, 0 active | NULL             | 
| 17 | system user | connecting host | handlersocket | Connect | NULL | handlersocket: mode=wr, 0 conns, 0 active | NULL             | 

查看系统进程占用的端口 
# lsof -i :9998 
COMMAND  PID  USER   FD   TYPE DEVICE SIZE NODE NAME 
mysqld  2731 mysql   11u  IPv4 571386       TCP *:9998 (LISTEN) 
# lsof -i :9999 
COMMAND  PID  USER   FD   TYPE DEVICE SIZE NODE NAME 
mysqld  2731 mysql   29u  IPv4 571403       TCP *:9999 (LISTEN) 


三、测试使用 

在数据库 test 创建测试表 
CREATE TABLE `user` (  
`user_id` INT(10) UNSIGNED NOT NULL,  
`user_name` VARCHAR(50) DEFAULT NULL,  
`user_email` VARCHAR(255) DEFAULT NULL,  
`created` DATETIME DEFAULT NULL,  
PRIMARY KEY (`user_id`),  
KEY `INDEX_01` (`user_name`)  
) ENGINE=INNODB  

插入测试数据 
INSERT INTO USER VALUES(1, "John", "john@test.com", CURRENT_TIMESTAMP);  
INSERT INTO USER VALUES(2, "Kevin", "Kevin@test.com", CURRENT_TIMESTAMP);  
INSERT INTO USER VALUES(3, "Dino", "Dino@test.com", CURRENT_TIMESTAMP);  

编译 Perl 客户端,在 /root/mysql/ahiguti-HandlerSocket-Plugin-for-MySQL-98b14c3 目录执行 
# ./autogen.sh 
# ./configure --disable-handlersocket-server 
# make && make install 
# cd perl-Net-HandlerSocket 
# perl Makefile.PL 
# make && make install 

perl 程序文件: 
Php代码  
#!/usr/bin/perl     
     
use strict;     
use warnings;     
use Net::HandlerSocket;     
     
#1. establishing a connection     
my $args = { host => 'localhost', port => 9998 };     
my $hs = new Net::HandlerSocket($args);     
     
#2. initializing an index so that we can use in main logics.     
# MySQL tables will be opened here (if not opened)     
my $res = $hs->open_index(0, 'test', 'user', 'INDEX_01', 'user_name,user_email,created');     
die $hs->get_error() if $res != 0;     
     
#3. main logic     
#fetching rows by id     
#execute_single (index id, cond, cond value, max rows, offset)     
$res = $hs->execute_single(0, '=', [ 'kevin' ], 1, 0);     
die $hs->get_error() if $res->[0] != 0;     
shift(@$res);     
for (my $row = 0; $row
  my $user_name= $res->[$row + 0];     
  my $user_email= $res->[$row + 1];     
  my $created= $res->[$row + 2];     
  print "$user_name\t$user_email\t$created\n";     
}     
     
#4. closing the connection     
$hs->close();    

#!/usr/bin/perl  
  
use strict;  
use warnings;  
use Net::HandlerSocket;  
  
#1. establishing a connection  
my $args = { host => 'localhost', port => 9998 };  
my $hs = new Net::HandlerSocket($args);  
  
#2. initializing an index so that we can use in main logics.  
# MySQL tables will be opened here (if not opened)  
my $res = $hs->open_index(0, 'test', 'user', 'INDEX_01', 'user_name,user_email,created');  
die $hs->get_error() if $res != 0;  
  
#3. main logic  
#fetching rows by id  
#execute_single (index id, cond, cond value, max rows, offset)  
$res = $hs->execute_single(0, '=', [ 'kevin' ], 1, 0);  
die $hs->get_error() if $res->[0] != 0;  
shift(@$res);  
for (my $row = 0; $row
  my $user_name= $res->[$row + 0];  
  my $user_email= $res->[$row + 1];  
  my $created= $res->[$row + 2];  
  print "$user_name\t$user_email\t$created\n";  
}  
  
#4. closing the connection  
$hs->close();  

下载 hs4j-0.1 软件包。 
Java 程序文件: 
Java代码  
import java.sql.ResultSet;   
  
import com.google.code.hs4j.HSClient;   
import com.google.code.hs4j.HSClientBuilder;   
import com.google.code.hs4j.IndexSession;   
import com.google.code.hs4j.impl.HSClientBuilderImpl;   
  
public class TestNoSQL {   
    public static void main(String[] args) throws Exception {   
        HSClientBuilder hscb = new HSClientBuilderImpl();   
        hscb.setServerAddress("10.10.10.2", 9999);   
        HSClient hsc = hscb.build();   
        IndexSession is = hsc.openIndexSession(1,"test", "user", "INDEX_01", new String[]{"user_name","user_email","created"});   
        // 插入   
        is.insert(new String[]{"ezerg", "ezerg@126.com", "2011-10-12 13:04:33"});   
        final String[] keys = { "ezerg"};   
        // 查询   
        ResultSet rs = is.find(keys);   
        while(rs.next()) {   
            System.out.println("name="+rs.getString(1));   
            System.out.println("email="+rs.getString(2));   
        }   
        // 删除   
        // is.delete(keys);   
        // 更新   
        // is.update(keys, new String[] { "ezerg", "ezerg@163.com", "2011-10-12 13:04:33" }, FindOperator.EQ);    
        // 关闭连接   
        hsc.shutdown();   
    }   

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template