mysql觸發器trigger操作memcache執行個體

來源:互聯網
上載者:User

對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 <install_functions.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 <memcached_functions_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. www.111cn.net /'); 
insert into urls (url) values ('http:// www.111cn.net /'); 
insert into urls (url) values ('http:// www.111cn.net '); 
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:// www.111cn.net '; 
select url from urls where url = 'http:// www.111cn.net /manual'; 
select memc_get('urls:6'); 
 
delete from urls where url = 'http:// www.111cn.net /'; 
select * from urls where url='http:// www.111cn.net /'; 
select memc_get('urls:4'); 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.