今天看了MYSQL官方網站,發現這個UDFs,UDFs 是 User Defined Functions 的縮寫,指 Mysql 的用戶定義函數,應用可以通過使用這些函數從 Mysql5.0 以上版本的數據庫中訪問 Memcached 寫入或者獲得數據。此外,從 Mysql5.1 開始支持觸發器,這樣就可以在觸發器中使用 UDFs 直接更新 Memcached 的內容,減輕了應用程序設計和編寫的復雜性。下面我們簡要介紹 UDFs 的安裝和使用:
1、安裝Libmemcached(memcached的客戶端C API)
下載地址:http://download.tangent.org/
# ./configure –prefix=/usr && make && make install
注意:請安裝在/usr下,不然後面安裝memcached_functions_mysql的時候找不到,還要指定PKG_CONFIG_PATH,麻煩。
2、安裝memcached_functions_mysql
下載地址:http://download.tangent.org/
# ./configure –with-mysql=/usr/local/mysql/bin/mysql_config
安裝完成之後,需要將 libmemcached_functions_mysql 的庫文件拷貝到 mysql/lib 目錄下的 plugin 目錄中。
# cp /usr/local/lib/libmemcached_functions_mysql* /usr/local/mysql/lib/plugin/.
# shell> mysql <sql/install_functions.sql
3、觸發器實現
定義memcached服務器
mysql> SELECT memc_servers_set(’192.168.0.1:11211,192.168.0.2:11211′);
創建測試表:
mysql> create table test3 (
-> id int(3) not null,
-> name varchar(64) not null default ”,
-> primary key (id)
-> );
創建觸發器
mysql>DELIMITER |
->CREATE TRIGGER test3_insert
->BEFORE INSERT ON test3
->FOR EACH ROW BEGIN
->SET @mm = memc_set(concat(’id:’,NEW.id), NEW.name);
->END |
可以參見官方網站:http://dev.mysql.com/doc/refman/5.1/en/ha-memcached-interfaces-mysqludf.html
後記:我覺得它的應用場景應該是寫操作不太頻繁,但查詢量非常大的網站,memcache不超時的緩存數據庫的數據,當數據庫發生更改的時候,利用mysql的insert,update,delete觸發器來更改memcached服務器的數據。但mysql的操作數據類型不支持數組,memc_set應該也不支持對象或者數組等數據類型。實現起來有點難度。
續記:MYSQL UDF OF JSON
基於以上的試用感想,我認為應該有UDF可以將數據行轉成json格式的數據,這樣就真的可以實現前端不用訪問數據庫的想法了,GOOGLE真是個好東西,google後還真找到了:UDF Repository for MySQL,外國人真是有開源精神:),這是一個MYSQL UDF庫的網站,我在裡面找到for json的udf。
下載地址:http://www.mysqludf.org/lib_mysqludf_json/lib_mysqludf_json_0.0.2.tar.gz
安裝:
# mkdir udf_of_json
# cd udf_of_json
# wget http://www.mysqludf.org/lib_mysqludf_json/lib_mysqludf_json_0.0.2.tar.gz
# tar zxvf lib_mysqludf_json_0.0.2.tar.gz
# cp ./lib_mysqludf_json.so /usr/local/mysql/lib/plugin/.
# mysql -u root
mysql> source ./ lib_mysqludf_json.sql
測試:
DELIMITER ||
CREATE TRIGGER user_insert
AFTER INSERT ON users
FOR EACH ROW BEGIN
SELECT json_array(username,user_type,real_name,password,active,last_login,description) into @user_info FROM users where user_id=NEW.user_id;
SET @mm= memc_set(concat(’user_info_’,NEW.user_id), @user_info);
END ||
它還支持中文真是讓人很欣喜,但不支持多行集,如果我用存儲過程或者自定義函數自己寫一個呢。研究中。。。。