程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Memcached與MySQL數據同步,memcachedmysql

Memcached與MySQL數據同步,memcachedmysql

編輯:MySQL綜合教程

Memcached與MySQL數據同步,memcachedmysql


1、介紹

  在生產環境中,我們經常使用MySQL作為應用的數據庫。但是隨著用戶的增多數據量的增大,我們將會自然而然的選擇Memcached作為緩存數據庫,從而減小MySQL的壓力。但是memcached在用戶、應用與MySQL三者中保持著數據同步也是一個不小的工程。

  例如用戶從memcached緩存中換取某數據,並且執行刪除命令。它需要到MySQL中刪除,之後還須要設計一個程序將Memcached與之對應的數據也刪除掉。

  假若我們能夠做到在MySQL中增刪改時都能夠自動觸發刪除memcached中相應的數據,那豈不美滋滋呀。這當然能夠做到啦,我們將采用采用MySQL Memcached UDF(User Defined Functions)方法。

  mysql memcached UDF 其實就是通過libmemcached來使用memcache的一系列函數,通過這些函數,你能 對memcache進行get, set, cas, append, prepend, delete, increment, decrement objects操作,如果我們通過mysql trigger來使用這些函數,那麼就能通過mysql更好的,更自動的管理memcache!

 

2、軟件下載與安裝

  2.1、軟件下載

  需要使用的軟件又兩個,libmemcached以及memcached_functions_mysql

  百度雲下載鏈接:http://pan.baidu.com/s/1pKCKjwB 密碼:fks8

  網上找的下載網址:http://download.tangent.org(當時找軟件的時候,網上多篇文章都說這裡可以下載那兩個軟件。可我進去就是找不到呀,23333)

  2.2、軟件安裝

  簡介:

  這兩個軟件的安裝比較蛋疼,畢竟是開源軟件,哪個版本依賴哪個版本,哪個版本不與哪版本個兼容。當時我安裝這兩個軟件用了一個上午時間。因為之前我在安裝PHP中memcached擴展模塊需要依賴這個軟件庫,所以安裝了一個最新版本libmemcached-1.0.18,因而能夠使用PHP的memcached擴展模塊中的所有功能。、

  但是在安裝memcached_functions_mysql時,就顯得很蛋疼了。

  一開始我直接安裝memcached_functions_mysql-1.1,到make的時候就出現下面的錯誤。

servers.c:122: error: 'memcached_st' has no member named 'hosts'
servers.c:123: error: 'memcached_st' has no member named 'hosts'
servers.c:124: error: 'memcached_st' has no member named 'hosts'
servers.c:126: error: 'memcached_st' has no member named 'hosts'

……

這是什麼原因呢?

  這就是上面所提到軟件兼容問題。

  後來在網上看到說是memcached_functions_mysql-1.1這個版本配對libmemcached-0.37版本以上都會出現這種問題。

  接著我就進行一次又一次測試:

  Libmemcached(1.0.2、1.0.3、1.0.18、0.34、0.36版本)+ memcached_functions_mysql-1.1進行安裝。結果成功的只有0.34、0.36版本。

  因為我想要保證相對較高版本的libmemcached,因為低版本的不支持PHP的memcached擴展模塊的一些新功能。

  既然memcached_functions_mysql-1.1版本不能對應libmemcached的高版本,那麼我就退而求其次,使用memcached_functions_mysql-0.9咯。

  百度了好久好久沒找著,最後在國外的網站github中找到。

  接著進行memcached_functions_mysql-0.9的安裝測試,結果還是不理想。

  突然靈光一閃,那我就安裝兩個libmemcached咯,一個1.0.18版本,一個0.34版本。最終成功安裝。libmemcached-0.34與memcached_functions_mysql-1.1配對進行安裝)

1):安裝libmemcached-0.34

參考

http://www.cnblogs.com/phpstudy2015-6/p/6670103.html#_label2

2):安裝memcached_functions_mysql-1.1

#tar zxvf memcached_functions_mysql-1.1.tar.gz
#cd memcached_functions_mysql-1.1
#./configure --with-mysql=/usr/local/mysql/bin/mysql_config --with-libmemcached =/usr/local/libmemcached
#make
#make install

 

3):拷貝lib文件到mysql的plugin下面

# cp /usr/local/lib/libmemcached_functions_mysql.* /usr/local/mysql/lib/plugin/

 

4)往MySQL添加memcache UDF函數

一共有兩種方法:

1、在MySQL裡執行 source install_functions.sql

mysql>source /home/username/(memcached_functions_mysql-1.1源碼路徑)/sql/ install_functions.sql

 

2、在linux主機執行mysql <sql/install_functions.sql

#/usr/local/mysql/bin/mysql < /home/username/(memcached_functions_mysql-1.1源碼路徑)/sql/ install_functions.sql

 

5):檢查添加函數是否成功

mysql>select * from mysql.func;

 

結果顯示有很多函數,表示添加函數成功

注意:

1、必須要帶有--with-libmemcached,否則就會顯示找不到libmemcached

2、有個小細節,就是經常進行安裝卸載libmemcached時(即--prefix有設置相同的名字),即使有--with-libmemcached正確的路徑,也有可能會顯示找不到libmemcached。

解決:可以使用不同的名字(--prefix);或者重啟linux

 

3、功能介紹

  從select * from mysql.func;的結果中我們可以看到很多關於memcached的函數。熟悉memcached指令的同學一眼看過去就能夠知道這個函數的大概功能。memc_set、memc_get這不就是相當set與get命令嘛。

具體功能可參考文檔:

http://dev.mysql.com/doc/refman/5.1/en/ha-memcached-interfaces-mysqludf.html

簡單測試一下這些函數:

#測試前當然要先將MySQL與memcached建立連接啦!
mysql> select memc_servers_set('192.168.95.11:11211');
mysql> select memc_server_count();
mysql> select memc_set('m','llppppp');
mysql> select memc_get('m');

telnet 192.168.95.11 11211

 

4、實例測試

1、新建一個數據庫test233以及表tab1

2、建立三個觸發器

插入數據:
mysql>delimiter $
mysql>create trigger tab1_insert_memc
    -> before insert on tab1
    -> for each row begin
    -> set @m=memc_set(NEW.id,NEW.name);   
    -> end$
更新數據:
mysql> create trigger tab1_update_memc
    ->before update on tab1
    -> for each row begin
    -> set @m=memc_replace(OLD.id,NEW.name);   
    -> end$
刪除數據:
mysql> create trigger tab1_delete_memc
    -> before delete on tab1 
    -> for each row begin
    -> set @m=memc_delete(OLD.id);
    -> end$
mysql>delimiter ;

3、連接memcached服務器進行數據測試

mysql> select memc_servers_set('192.168.95.11:11211');

1)、向tab1插入幾條數據,並查看結果

mysql> insert into tab1 value('1','1111aaaaff');
.......

telnet 192.168.95.11 11211

2)、更改數據

mysql> update tab1 set name='ooooooooooooooo' where id=1;

telnet 192.168.95.11 11211

3)、刪除數據

mysql> delete from tab1 where id=1;

telnet 192.168.95.11 11211

 

5、總結建議

1、如果出現mysql服務重啟,需要重新連接memcached服務器select memc_servers_set('192.168.95.11:11211)

2、使用命令查看可以設置的參數,根據具體項目設置最合適參數select memc_list_behaviors()/G

3、設置MEMCACHED_BEHAVIOR_NO_BLOCK為打開狀態,表示在memcached出現問題時可以繼續將數據插入到MySQL中。否則將會等到timeout執行插入操作。

4、在MySQL中使用這個功能時,不要一味地將所有表的數據都布置成這種形式,避免MySQL中使用過多的函數、以及觸發器而影響性能。

 

(以上是自己的一些見解與總結,若有不足或者錯誤的地方請各位指出)

作者:那一葉隨風

聲明:以上只代表本人在工作學習中某一時間內總結的觀點或結論。轉載時請在文章頁面明顯位置給出原文鏈接

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved