位置:首页 > 数据库 > MySQL
mysql 浅析触发器trigger操作memcache的简单示例
日期:2023-01-17 人气:

大家好,对mysql 浅析触发器trigger操作memcache的简单示例感兴趣的小伙伴,下面一起跟随三零脚本的小编来看看mysql 浅析触发器trigger操作memcache的简单示例的例子吧。

对memcache的操作一般都是放程序里面去操作的,新增,更新,删除什么的,如果能利用mysql来对memcache进行操作,那就更好,代码端就会简单一点,但是利用mysql来操作memcache,比较适合实现简单的方式,下面说一下安装的过程和遇到的问题,在看安装过程的之前,我觉得应当先看一下,我安装时候所遇到的问题,这样你可以避免掉,少走一点弯路.

一,安装所要的软件

mysql5.1以前版本:http://downloads.mysql.com/archives/

libevent下载:wget http://www.monkey.org/~provos/libevent-1.2.tar.gz

libmemcached下载:http://download.tangent.org/

memcached下载:http://pecl.php.net/package/memcached

memcached_functions_mysql下载:http://download.tangent.org/

下载东西的时候,也是有技巧的,下载的东西,不要太新,太新了不然这个不行,那个也不行,太老了也不行,太老了,这个装不了,那个也装不了,所以要找一个稳定版的,一般正版软件的话,会标识basic版,stable版之类的.

二,mysql的安装

mysql的安装方式有很多,你可以用系统的软件管理包来安装,不同的linux版本,软件管理工具是不一样的.

redhat,centos 有yum,ubuntu 有apt get,arch有pacman等,用系统自带的管理工具安装比较简单,如果是自己下载怎么安装的呢,mysql的官方网站提供了三种mysql的安装源码,一种是.rpm的,一种是二进制的,一种是要自己编译的.

1,用rpm来按装,代码如下:

rpm -i MySQL-server-VERSION.i386.rpm

rpm -i MySQL-client-VERSION.i386.rpm

2,二进制包进行安装

二进制包安装有一个缺点,就是要安装到什么地方,都是死的,安装过程中有问题的,查看一下是不是装了glibc,以及版本是不是太低了,代码如下:

groupaddmysql useradd-gmysqlmysql
tarzxvf/path/to/mysql-VERSION-OS.tar.gz -C/usr/local cd /usr/local
mvmysql-VERSION-OS./mysql cd/usr/local/mysql
scripts/mysql_install_db--user=mysql chown-Rmysql:mysql/usr/local/mysql
bin/mysqld_safe--user=mysql&

3,源码自己编译,代码如下:

groupaddmysql useradd-gmysqlmysql
tarzxvf/path/to/mysql-VERSION-OS.tar.gz cd /mysql-VERSION-OS
./configure--prefix=/usr/local/mysql  //路径可自定义 make&&makeinstall
cpsupport-files/my-medium.cnf/etc/my.cnf cd/usr/local/mysql
bin/mysql_install_db--user=mysql chown-Rmysql:mysql/usr/local/mysql
bin/mysqld_safe--user=mysql&

安装遇难问题:安装mysql至少要5.1版本以上的,服务器端,还是客户端都要,装完memcached_functions_mysql后,调用libmemcached模块时会报错的,代码如下:

[root@BlackGhostsql]#/usr/local/mysql/bin/mysql<install_functions.sql ERROR1126(HY000)atline1:Can'topensharedlibrary'libmemcached_functions_mysql.so'(errno:22/usr/local/mysql/lib/mysql/plugin/libmemcached_functions_mysql.so:undefinedsymbol:memcached_string_append)

上面是用mysqld_safe来启动mysql的,也可以用mysql.server来启动,它在/usr/local/mysql/share/mysql下面,你也可以把mysql.server考到开机启动的目录下面,并且重命名为httpd.

[root@BlackGhostmysql]#./mysql.serverstop ShuttingdownMySQL..SUCCESS!
[root@BlackGhostmysql]#./mysql.serverstart StartingMySQL.SUCCESS!

二,关于libevent和memcached的安装

请参考:linux memcached 安装

三,libmemcached的安装,代码如下:

tarzxvflibmemcached-0.37.tar.gz cdlibmemcached-0.37
./configure--prefix=/usr/local/libmemcached37--with-memcached make&&makeinstall

安装遇到的问题:当时我下载的是libmemcached-0.42.tar.gz,安装memcached_functions_mysql过程中遇到这样一个问题.

servers.c:263:28: error: 'memcached_st' has no member named 'hosts'

servers.c:264:28: error: 'memcached_st' has no member named 'hosts'

后来我在网上查一下,libmemcached-0.37没有这个问题,搞得我很无语,难道不是向下兼容的吗?

四,安装memcached_functions_mysql

代码如下:

tarxzfmemcached_functions_mysql-0.9.tar.gz cdmemcached_functions_mysql-0.9
./configure--prefix=/usr/local/memcache_mysql--with-mysql-config=/usr/local/mysql/bin/mysql_config--with-libmemcached=/usr/local/libmemcached37 make&&makeinstall
cp/usr/local/memcache_mysql/lib/libmemcached_functions*/usr/local/mysql/lib/mysql/plugin //开源代码q3060.com

别忘了加上--with-libmemcached=/usr/local/libmemcached37不然会报以下错误

checking for mysql_config... /usr/bin/mysql_config

checking for libmemcached >= 0.17... configure: error: libmemcached not found

创建mysql的memcache操作函数

mysql <memcached_functions_mysql-0.9/sql/install_functions.sql

注意路径不要错了,install_functions.sql定义了一些memcache的操作函数,如下:

[root@BlackGhostzhangy]#catmemcached_functions_mysql-0.9/sql/install_functions.sql|awk'{if($0!~/^$/){print$3;}} memc_add
memc_add_by_key memc_servers_set
memc_servers_version memc_server_count
memc_set memc_set_by_key
memc_cas memc_cas_by_key
memc_get memc_get_by_key
memc_delete memc_delete_by_key
memc_append memc_append_by_key
memc_prepend memc_prepend_by_key
memc_increment memc_decrement
memc_replace memc_replace_by_key
memc_servers_behavior_set memc_servers_behavior_get
memc_behavior_set memc_behavior_get
memc_list_behaviors memc_list_hash_types
memc_list_distribution_types memc_udf_version
memc_libmemcached_version memc_stats
memc_stat_get_keys memc_stat_get_value

到这儿安装基本上结束,下面我们来测试一下.

五,测试

启动memcached,代码如下:

/usr/local/bin/memcached-d-m20-uzhangy-p12000-P./memcached.pid /usr/local/bin/memcached-d-m20-uzhangy-p13000-P./mem.pid
//创建一个测试有
droptableifexistsurls; createtableurls(
idint(3)notnull, urlvarchar(64)notnulldefault'',
primarykey(id) );
//连接memcched,根启动memcahed的端口要一样
selectmemc_servers_set('127.0.0.1:12000,127.0.0.1:13000'); //设置一个开始序列
selectmemc_set('urls:sequence',0);
//创建插入memcached触发器 DELIMITER|
DROPTRIGGERIFEXISTSurl_mem_insert|
CREATETRIGGERurl_mem_insert BEFOREINSERTONurls
FOREACHROWBEGIN SETNEW.id=memc_increment('urls:sequence');
SET@mm=memc_set(concat('urls:',NEW.id),NEW.url); END|
//创建更新memcached触发器
DROPTRIGGERIFEXISTSurl_mem_update| CREATETRIGGERurl_mem_update
BEFOREUPDATEONurls FOREACHROWBEGIN
SET@mm=memc_replace(concat('urls:',OLD.id),NEW.url); END|
//创建删除memcached触发器
DROPTRIGGERIFEXISTSurl_mem_delete| CREATETRIGGERurl_mem_delete
BEFOREDELETEONurls FOREACHROWBEGIN
SET@mm=memc_delete(concat('urls:',OLD.id)); END|

DELIMITER;//写触发器的时候,我们会用;mysql执行分割符也是;所以我们在写触发器或者是存储过程的时候都会改变一下,例如:DELIMITER|

插入一些测试数据,代码如下:

insertintourls(url)values('http://google.com'); insertintourls(url)values('http://baidu.com/');
insertintourls(url)values('http://www.www.phpfensi/'); insertintourls(url)values('http://www.q3060.com/');
insertintourls(url)values('http://www.q3060.com'); insertintourls(url)values('http://mysql.com');
select*fromurls;
//将插入的6条数据显示出来,下面的显示和删除也是一样的不多说了。 selectmemc_get('urls:1');
selectmemc_get('urls:2'); selectmemc_get('urls:3');
selectmemc_get('urls:4'); selectmemc_get('urls:5');
selectmemc_get('urls:6');
updateurlsseturl='http://mysql.com/sun'whereurl='http://www.q3060.com '; selecturlfromurlswhereurl='http://www.q3060.com/manual';
selectmemc_get('urls:6');
deletefromurlswhereurl='http://www.q3060.com/'; select*fromurlswhereurl='http://www.phpfensi.net/';
selectmemc_get('urls:4');