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,以及版本是不是太低了。

groupadd MysqL
useradd -g MysqL MysqL
tar zxvf /path/to/MysqL-VERSION-OS.tar.gz -C /usr/local
cd /usr/local
mv MysqL-VERSION-OS ./MysqL
cd /usr/local/MysqL
scripts/MysqL_install_db  		--user=MysqL
chown -R MysqL:MysqL /usr/local/MysqL
bin/MysqLd_safe --user=MysqL  		&

3,源码自己编译

groupadd MysqL
useradd -g MysqL MysqL
tar zxvf /path/to/MysqL-VERSION-OS.tar.gz
cd /MysqL-VERSION-OS
./configure --prefix=/usr/local/MysqL  //路径可自定义
make && make install
cp support-files/my-medium.cnf /etc/my.cnf
cd /usr/local/MysqL
bin/MysqL_install_db  		--user=MysqL
chown -R MysqL:MysqL /usr/local/MysqL
bin/MysqLd_safe --user=MysqL  		&

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

[root@BlackGhost sql]# /usr/local/MysqL/bin/MysqL sql
ERROR 1126 (HY000) at line 1: Can't open shared library 'libmemcached_functions_MysqL.so' (errno: 22 /usr/local/MysqL/lib/MysqL/plugin/libmemcached_functions_MysqL.so: undefined symbol: memcached_string_append)

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

[root@BlackGhost MysqL]# ./MysqL.server stop
Shutting down MysqL.. SUCCESS!
[root@BlackGhost MysqL]# ./MysqL.server start
Starting MysqL. SUCCESS!

二,关于libevent和memcached的安装

请参考:linux memcached 安装

三,libmemcached的安装

tar zxvf libmemcached-0.37.tar.gz
cd libmemcached-0.37
./configure --prefix=/usr/local/libmemcached37 --with-memcached
make && make install

安装遇到的问题:当时我下载的是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

tar xzf memcached_functions_MysqL-0.9.tar.gz
cd memcached_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 && make install
cp /usr/local/memcache_MysqL/lib/libmemcached_functions*   /usr/local/MysqL/lib/MysqL/plugin

别忘了加上--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 MysqL-0.9/sql/install_functions.sql
注意路径不要错了。install_functions.sql定义了一些memcache的操作函数:如下

[root@BlackGhost zhangy]# cat memcached_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 -m 20 -u zhangy -p 12000 -P ./memcached.pid

/usr/local/bin/memcached -d -m 20 -u zhangy -p 13000 -P ./mem.pid

//创建一个测试有
drop table if exists urls;
create table urls (
 id int(3) not null,url varchar(64) not null default '',primary key (id)
 );

//连接memcched,根启动memcahed的端口要一样
select memc_servers_set('127.0.0.1:12000,127.0.0.1:13000');
//设置一个开始序列
select memc_set('urls:sequence',0);

//创建插入memcached触发器
DELIMITER |

DROP TRIGGER IF EXISTS url_mem_insert |
CREATE TRIGGER url_mem_insert
BEFORE INSERT ON urls
FOR EACH ROW BEGIN
 SET NEW.id= memc_increment('urls:sequence');
 SET @mm= memc_set(concat('urls:',NEW.id),NEW.url);
END |

//创建更新memcached触发器
DROP TRIGGER IF EXISTS url_mem_update |
CREATE TRIGGER url_mem_update
BEFORE UPDATE ON urls
FOR EACH ROW BEGIN
 SET @mm= memc_replace(concat('urls:',OLD.id),NEW.url);
END |

//创建删除memcached触发器
DROP TRIGGER IF EXISTS url_mem_delete |
CREATE TRIGGER url_mem_delete
BEFORE DELETE ON urls
FOR EACH ROW BEGIN
 SET @mm= memc_delete(concat('urls:',OLD.id));
END |

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

//插入一些测试数据
insert into urls (url) values ('http://google.com');
insert into urls (url) values ('http://baidu.com/');
insert into urls (url) values ('http://www.51yip.com/');
insert into urls (url) values ('http://blog.51yip.com/');
insert into urls (url) values ('http://51yip.com');
insert into urls (url) values ('http://MysqL.com');
select * from urls;

//将插入的6条数据显示出来,下面的显示删除也是一样的不多说了。
select memc_get('urls:1');
select memc_get('urls:2');
select memc_get('urls:3');
select memc_get('urls:4');
select memc_get('urls:5');
select memc_get('urls:6');

update urls set url= 'http://MysqL.com/sun' where url = 'http://51yip.com';
select url from urls where url = 'http://51yip.com/manual';
select memc_get('urls:6');

delete from urls where url = 'http://blog.51yip.com/';
select * from urls where url='http://blog.51yip.com/';
select memc_get('urls:4');

我以前写过一篇:关于memcache的key的管理,徘徊中里面提到对单表进行缓存,可以完全配合这篇文章所说的东西。如果有多表联合查询的话,在用触器就比较麻烦了,还不如放到程序里去执行

猜你在找的Redis相关文章