A-A+

mysql触发器trigger操作memcache实例

2017年10月15日 PHP技术文章 暂无评论 阅读 0 views 次

对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,以及版本是不是太低了,代码如下:

  1. groupadd mysql     
  2. useradd -g mysql mysql     
  3. tar zxvf /path/to/mysql-VERSION-OS.tar.gz -C /usr/local     
  4. cd /usr/local     
  5. mv mysql-VERSION-OS ./mysql     
  6. cd /usr/local/mysql     
  7. scripts/mysql_install_db        --user=mysql     
  8. chown -R mysql:mysql /usr/local/mysql     
  9. bin/mysqld_safe --user=mysql        &     

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

  1. groupadd mysql     
  2. useradd -g mysql mysql     
  3. tar zxvf /path/to/mysql-VERSION-OS.tar.gz     
  4. cd /mysql-VERSION-OS     
  5. ./configure --prefix=/usr/local/mysql  //路径可自定义     
  6. make && make install     
  7. cp support-files/my-medium.cnf /etc/my.cnf     
  8. cd /usr/local/mysql     
  9. bin/mysql_install_db        --user=mysql     
  10. chown -R mysql:mysql /usr/local/mysql     
  11. bin/mysqld_safe --user=mysql        &  

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

  1. [root@BlackGhost sql]# /usr/local/mysql/bin/mysql <install_functions.sql   
  2. 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.

  1. [root@BlackGhost mysql]# ./mysql.server stop   
  2. Shutting down MySQL.. SUCCESS!   
  3. [root@BlackGhost mysql]# ./mysql.server start   
  4. Starting MySQL. SUCCESS!   

二,关于libevent和memcached的安装

请参考:linux memcached 安装

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

  1. tar zxvf libmemcached-0.37.tar.gz     
  2. cd libmemcached-0.37     
  3. ./configure --prefix=/usr/local/libmemcached37 --with-memcached     
  4. 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,代码如下:

  1. tar xzf memcached_functions_mysql-0.9.tar.gz     
  2. cd memcached_functions_mysql-0.9     
  3. ./configure --prefix=/usr/local/memcache_mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config --with-libmemcached=/usr/local/libmemcached37     
  4. make && make install     
  5. cp /usr/local/memcache_mysql/lib/libmemcached_functions*   /usr/local/mysql/lib/mysql/plugin   
  6. //开源代码www.xiariboke.net   

别忘了加上--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的操作函数,如下:

  1. [root@BlackGhost zhangy]# cat memcached_functions_mysql-0.9/sql/install_functions.sql |awk '{if($0 !~ /^$/ ){print $3;} }     
  2. memc_add     
  3. memc_add_by_key     
  4. memc_servers_set     
  5. memc_servers_version     
  6. memc_server_count     
  7. memc_set     
  8. memc_set_by_key     
  9. memc_cas     
  10. memc_cas_by_key     
  11. memc_get     
  12. memc_get_by_key     
  13. memc_delete     
  14. memc_delete_by_key     
  15. memc_append     
  16. memc_append_by_key     
  17. memc_prepend     
  18. memc_prepend_by_key     
  19. memc_increment     
  20. memc_decrement     
  21. memc_replace     
  22. memc_replace_by_key     
  23. memc_servers_behavior_set     
  24. memc_servers_behavior_get     
  25. memc_behavior_set     
  26. memc_behavior_get     
  27. memc_list_behaviors     
  28. memc_list_hash_types     
  29. memc_list_distribution_types     
  30. memc_udf_version     
  31. memc_libmemcached_version     
  32. memc_stats     
  33. memc_stat_get_keys     
  34. memc_stat_get_value    

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

五,测试

启动memcached,代码如下:

  1. /usr/local/bin/memcached -d -m 20 -u zhangy -p 12000 -P ./memcached.pid   
  2. /usr/local/bin/memcached -d -m 20 -u zhangy -p 13000 -P ./mem.pid   
  3.    
  4. //创建一个测试有     
  5. drop table if exists urls;     
  6. create table urls (     
  7.  id int(3) not null,     
  8.  url varchar(64) not null default '',     
  9.  primary key (id)     
  10.  );     
  11.      
  12. //连接memcched,根启动memcahed的端口要一样     
  13. select memc_servers_set('127.0.0.1:12000,127.0.0.1:13000');     
  14. //设置一个开始序列     
  15. select memc_set('urls:sequence', 0);     
  16.      
  17. //创建插入memcached触发器     
  18. DELIMITER |     
  19.      
  20. DROP TRIGGER IF EXISTS url_mem_insert |     
  21. CREATE TRIGGER url_mem_insert     
  22. BEFORE INSERT ON urls     
  23. FOR EACH ROW BEGIN     
  24.  SET NEW.id= memc_increment('urls:sequence');     
  25.  SET @mm= memc_set(concat('urls:',NEW.id), NEW.url);     
  26. END |     
  27.      
  28. //创建更新memcached触发器     
  29. DROP TRIGGER IF EXISTS url_mem_update |     
  30. CREATE TRIGGER url_mem_update     
  31. BEFORE UPDATE ON urls     
  32. FOR EACH ROW BEGIN     
  33.  SET @mm= memc_replace(concat('urls:',OLD.id), NEW.url);     
  34. END |     
  35.      
  36. //创建删除memcached触发器     
  37. DROP TRIGGER IF EXISTS url_mem_delete |     
  38. CREATE TRIGGER url_mem_delete     
  39. BEFORE DELETE ON urls     
  40. FOR EACH ROW BEGIN     
  41.  SET @mm= memc_delete(concat('urls:',OLD.id));     
  42. END |     
  43.    

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

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

  1. insert into urls (url) values ('http://google.com');     
  2. insert into urls (url) values ('http://baidu.com/');     
  3. insert into urls (url) values ('http://www. www.phpfensi /');     
  4. insert into urls (url) values ('http:// www.phpfensi.com /');     
  5. insert into urls (url) values ('http:// www.phpfensi.com ');     
  6. insert into urls (url) values ('http://mysql.com');     
  7. select * from urls;     
  8.      
  9. //将插入的6条数据显示出来,下面的显示和删除也是一样的不多说了。     
  10. select memc_get('urls:1');     
  11. select memc_get('urls:2');     
  12. select memc_get('urls:3');     
  13. select memc_get('urls:4');     
  14. select memc_get('urls:5');     
  15. select memc_get('urls:6');     
  16.      
  17. update urls set url= 'http://mysql.com/sun' where url = 'http:// www.xiariboke.net ';     
  18. select url from urls where url = 'http:// www.xiariboke.net /manual';     
  19. select memc_get('urls:6');     
  20.      
  21. delete from urls where url = 'http:// www.xiariboke.net /';     
  22. select * from urls where url='http:// www.xiariboke.net /';     
  23. select memc_get('urls:4');  
标签:

给我留言