what's UDFs ?
UDFs是User Defined Functions的缩写,表示Mysql用户自定义的函数,应用程序能够利用这些函数从MySQL5.0以上的版本的数据库中访问Memcached写入或者获取的数据。此外,MySql 从5.1版本开始支持触发器。从而能够在触发器中使用UDFs直接更新Memcached的内容,这种方式下降了应用程序的设计和编写的复杂性。mysql
下面简单介绍UDFs的安装和使用。安装UDFs须要在数据库服务器上安装两个包,分别是libmemcached和memcached_functions_mysql,这两个包均可以从http://download.tangent.org/下载,安装以下:sql
2.1. 须要的软件有memcached-1.2.6,libevent-1.4.4-stable,libmemcached-0.30这些软件很是简单,yum -y install libmemcached* 就能够安装了,所以不作说明。
2.2. 安装mysql,也不作说明。
2.3. 安装Memcached_functions_mysql,基本步骤以下:下载地址:https://launchpad.net/memcached-udfs数据库
# 下载解包之后,进入到目录下面,开始执行下面的安装命令 [root@salt memcached_functions_mysql-1.1]# ./configure --with-mysql=/usr/bin/mysql_config --prefix=/usr/local/memcached_functions_mysql [root@salt memcached_functions_mysql-1.1]# make && make install
安装完之后,切换到源码目录下,把memcached_function_mysql 装到mysql内部里面去,有2中方法:服务器
下面我采起的是第二种方法:app
[root@salt memcached_functions_mysql]# cd /tmp/memcached_functions_mysql-1.1 [root@salt utils]# cp /usr/local/memcached_functions_mysql/lib/libmemcached_functions_mysql.so /usr/lib64/mysql/plugin/ [root@salt memcached_functions_mysql-1.1]# cd utils/ [root@salt utils]# ls install.pl [root@salt utils]# ./install.pl
若是你的数据库设置了密码,那么就在install.pl脚本的78行附近,把密码传个那个opt_password的变量:memcached
73 $opt_schema ||= 'test'; 74 $opt_user ||= 'root'; 75 $opt_host ||= 'localhost'; 76 $opt_password ||= '123456'; # 78行,添加这个变量,告诉链接数据库的密码 77 my $existing_functions; 78 79 my $dbh= DBI->connect("DBI:mysql:$opt_schema", $opt_user, $opt_password) 80 or croak "Unable to connect! $DBI::errstr\n";
一路回车敲击Y后,终于把Memcached_function_mysql装进到了mysql中,咱们在数据库检查下,共32行:函数
select name,dl from mysql.func; +------------------------------+---------------------------------+ | name | dl | +------------------------------+---------------------------------+ | memc_cas_by_key | libmemcached_functions_mysql.so | | memc_cas | libmemcached_functions_mysql.so | | memc_servers_set | libmemcached_functions_mysql.so | | memc_add | libmemcached_functions_mysql.so | | memc_libmemcached_version | libmemcached_functions_mysql.so | | memc_add_by_key | libmemcached_functions_mysql.so | | memc_server_count | libmemcached_functions_mysql.so | | memc_stat_get_keys | libmemcached_functions_mysql.so | | memc_append | libmemcached_functions_mysql.so | | memc_replace_by_key | libmemcached_functions_mysql.so | | memc_prepend | libmemcached_functions_mysql.so | | memc_behavior_get | libmemcached_functions_mysql.so | | memc_udf_version | libmemcached_functions_mysql.so | | memc_set_by_key | libmemcached_functions_mysql.so | | memc_get_by_key | libmemcached_functions_mysql.so | | memc_increment | libmemcached_functions_mysql.so | | memc_behavior_set | libmemcached_functions_mysql.so | | memc_stats | libmemcached_functions_mysql.so | | memc_list_distribution_types | libmemcached_functions_mysql.so | | memc_list_hash_types | libmemcached_functions_mysql.so | | memc_append_by_key | libmemcached_functions_mysql.so | | memc_servers_behavior_set | libmemcached_functions_mysql.so | | memc_replace | libmemcached_functions_mysql.so | | memc_set | libmemcached_functions_mysql.so | | memc_prepend_by_key | libmemcached_functions_mysql.so | | memc_get | libmemcached_functions_mysql.so | | memc_list_behaviors | libmemcached_functions_mysql.so | | memc_delete | libmemcached_functions_mysql.so | | memc_stat_get_value | libmemcached_functions_mysql.so | | memc_decrement | libmemcached_functions_mysql.so | | memc_delete_by_key | libmemcached_functions_mysql.so | | memc_servers_behavior_get | libmemcached_functions_mysql.so | +------------------------------+---------------------------------+ 32 rows in set (0.30 sec)
#### 二 memcached_function_mysql的应用实例:
###### 1 建立2张表
新建2张表,urls和results,更新urls表中的内容,使系统自动更新Memcached的内容,results用来记录更新Memcached失败的记录。测试
SQL语句:url
mysql> create database test character set 'utf8'; mysql> create table urls(id int(10) not null,url varchar(255) not null default '',primary key(`id`)); mysql> create table results(id int(10) not null,result varchar(255) not null default 'error',time timestamp null default current_timestamp , primary key (`id`));
2.1. 当向urls表中插入数据时,对Memcached执行set操做,trigger大代码以下:.net
mysql> delimiter // # 切换结束符 mysql> drop trigger if exists url_mem_insert; -> create trigger url_mem_insert before insert on urls -> for each row begin set @mm = memc_set(NEW.id,NEW.url); -> if @mm <>0 then -> insert into results(id) values(NEW.id); -> end if; -> END// Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.03 sec) mysql> DELIMITER ;
2.2. 当对urls表中的数据进行更新时,对Memcached执行replace操做。sql语句以下
mysql> delimiter // mysql> drop trigger if exists url_mem_update; -> create trigger url_mem_update before update on urls for each row begin -> set @mm = memc_replace(OLD.id , NEW.url); -> if @mm <> 0 then -> insert into results(id) values(OLD.id); -> end if; -> end // Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.36 sec) mysql> delimiter ;
2.3. 当对urls表中的数据进行删除操做时,对Memcached执行delete操做,sql代码以下:
mysql> delimiter // mysql> drop trigger if exists url_mem_delete; -> create trigger url_mem_delete before delete on urls for each row begin -> set @mm = memc_delete(OLD.ID); -> if @mm <> 0 then -> insert into results(id) values(OLD.id); -> end if; -> end // Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.29 sec) mysql> delimiter ;
2.4. 设置Memcached相关参数
2.4.1. 设置UDFs操做Memcached服务器的IP地址和端口
mysql> select memc_servers_set('127.0.0.1:11211') -> ; +-------------------------------------+ | memc_servers_set('127.0.0.1:11211') | +-------------------------------------+ | 0 | +-------------------------------------+ 1 row in set (0.35 sec) mysql> select memc_server_count(); +---------------------+ | memc_server_count() | +---------------------+ | 1 | +---------------------+ 1 row in set (0.00 sec)
2.4.2. 在Mysql命令行中列出能够修改Memcached参数的行为,执行命令和输出结果以下:
mysql> select memc_list_behaviors()\G; *************************** 1. row *************************** memc_list_behaviors(): MEMCACHED SERVER BEHAVIORS MEMCACHED_BEHAVIOR_SUPPORT_CAS MEMCACHED_BEHAVIOR_NO_BLOCK MEMCACHED_BEHAVIOR_TCP_NODELAY MEMCACHED_BEHAVIOR_HASH MEMCACHED_BEHAVIOR_CACHE_LOOKUPS MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE MEMCACHED_BEHAVIOR_BUFFER_REQUESTS MEMCACHED_BEHAVIOR_KETAMA MEMCACHED_BEHAVIOR_POLL_TIMEOUT MEMCACHED_BEHAVIOR_RETRY_TIMEOUT MEMCACHED_BEHAVIOR_DISTRIBUTION MEMCACHED_BEHAVIOR_BUFFER_REQUESTS MEMCACHED_BEHAVIOR_USER_DATA MEMCACHED_BEHAVIOR_SORT_HOSTS MEMCACHED_BEHAVIOR_VERIFY_KEY MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED MEMCACHED_BEHAVIOR_KETAMA_HASH MEMCACHED_BEHAVIOR_BINARY_PROTOCOL MEMCACHED_BEHAVIOR_SND_TIMEOUT MEMCACHED_BEHAVIOR_RCV_TIMEOUT MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK MEMCACHED_HASH_DEFAULT MEMCACHED_HASH_MD5 MEMCA 1 row in set (0.00 sec) ERROR: No query specified
设置MEMCACHED_BEHAVIOR_NO_BLOCK 为打开状态,这样Memcached出现问题的时候,也就是链接不上的时候,数据能够继续插入Mysql中,但有报错提示;如不设置此值,那么Memcached失败时,数据须要到memcached失败超时后才能够插入到表中。
经过下面的设置,能够避免这样的状况发生:
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1'); +--------------------------------------------------------------+ | memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') | +--------------------------------------------------------------+ | 0 | +--------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1'); +-----------------------------------------------------------------+ | memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') | +-----------------------------------------------------------------+ | 0 | +-----------------------------------------------------------------+ 1 row in set (0.00 sec)
2.4.3. 测试Mysql与Memcached的数据同步性
2.4.3.1. 数据增长
mysql> insert into urls values(2,'http://www.baidu.com'); Query OK, 1 row affected (0.04 sec) mysql> select memc_get('2'); +-------------------+ | memc_get('2') | +-------------------+ | http://www.jd.com | +-------------------+ 1 row in set (0.02 sec)
而后在另外一个终端上telnet memcached执行命令,命令以下:
[root@salt ~]# telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. get 2 #2就是id号,咱们刚才插入数据的ID号为2,因此这里也是为2 VALUE 2 0 20 http://www.baidu.com END
2.4.3.2 删除数据
mysql:
mysql> delete from test.urls where id=2;
memcached:
get 2 END
2.4.3.3 修改数据同理可得,在mysql一端修改后,自动同步到memcached上去。