Memcachephp
Memcache的做用網上資料都講的很好,說簡單點就是減輕讀取數據庫的壓力,原理也很簡單:html
被請求的數據會先到memcache裏去取,若是沒有就去數據庫裏取,順便給memcache帶一份。java
每次更新數據也先更新memcache裏的數據,若是沒有則更新數據庫,同時更新memcache。python
所以須要注意的是這個數據是易失去性存儲的。mysql
模式和端口sql
Memcache是一個基於C/S的結構:數據庫
服務端:使用Memcached軟件vim
客戶端:使用Memcache插件 (這個插件是結合後端語言好比php python java)後端
服務端口:11211(可改)瀏覽器
軟件清單:
libevent依賴庫 http://libevent.org/
memcache插件 http://pecl.php.net/package/memcache/
memcached服務 http://www.memcached.org/
lamp環境 yum -y install httpd php php-mysql mysql-server
操做系統 CentOS-6.5(x86_64)
1.將上傳相關軟件包,安裝lamp環境
yum -y install httpd php php-mysql mysql-server /etc/init.d/httpd start echo "<?php phpinfo()?>" > /var/www/html/index.php
而後用瀏覽器訪問查看php信息,在信息裏面是找不到memcache的
2.安裝libevent插件
tar xf libevent-2.0.22-stable.tar.gz cd libevent-2.0.22-stable ./configure --prefix=/usr/local/libevent && make && make install
3.安裝memcached服務端
tar xf memcached-1.4.36.tar.gz cd memcached-1.4.36 ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/ make && make install
安裝好後會在/usr/local/memcached/bin/目錄下生成memcached
4.配置環境變量
cd /etc/profile.d/ vim mem.sh export PATH="/usr/local/memcached/bin:$PATH" #寫入profile文件開機自動導入 memcached -m 32 -p 11211 -d -c 8192 -u root #m分出內存大小 p 端口 d 混合模式 c 最大鏈接數 netstat -anptu | grep memcached #查看是否啓動,運行多實例更改端口便可 free -m #能夠看到內存愈來愈少,由於被分配出去了 ps -aux | grep memcached #查看進程pid是多少 kill -9 1234 #關閉memcached服務 pkill memcached #同上
5.memcached使用
yum -y install nc telnet
1)使用nc命令鏈接memcache
printf "set first 0 30 5\r\nmmmmm\r\n" | nc 127.0.0.1 11211 #存數據 (字段分別爲 key,標誌,效期,長度,值 ) printf "get first\r\n" | nc 127.0.0.1 11211 #取數據
2)使用telnet命令鏈接memcache
telnet 127.0.0.1 11211 #而後就可使用相關的memcached命令了
6.下面是關於memcached相關的操做命令
add key1 0 30 3 #添加數據30爲效期(若是寫0表示永不過時) 3爲大小
set key1 0 30 3 #更新數據,不存在會自動建立
replace key1 0 30 3 #更新數據,不存在會報錯
delete key1 #刪除數據
get key1 #獲取數據
gets key 1 #獲取更多信息
stats setting #查看配置信息
stats slabs #查看slab
stats items #查看item
stats size #查看大小
7.安裝memcache客戶端php插件
安裝phpize命令能夠爲php添加新模塊
若是不知道是什麼包可使用 yum provides */phpize
yum -y install php-devel tar xf memcache-2.2.7.tgz cd memcache-2.2.7 phpize #打模塊,生成configure等文件 which php-config #查看php-config路徑位置 ./configure --enable-memcache --with-php-config=/usr/bin/php-config make && make install
安裝號後模塊會被安裝置/usr/lib64/php/modules/memcache.so
cd /etc/php.d/ cp mysql.ini memcache.ini #vim進行編輯將extension的值設置成memcache.so
重啓服務後能夠看到php已經支持了memcache模塊了
8.後面能夠結合php網站測試數據庫相關
tar xf memcache_page.tar.gz -C /var/www/html/ cd !$
測試頁面有 mysql_connect.php 編輯一下
所以須要先把mysql的用戶設置一下
/etc/init.d/mysqld start
mysql_secure_installation
或者本身在數據庫裏
grant all on *.* to 'root'@'127.0.0.1' identified by '123456' flush privileges
而後瀏覽器訪問mysql_connect.php
對接成功
這裏能夠閱讀read.php和write.php瞭解memcache的讀寫原理
read.php
<?php $memcachehost = '192.168.1.113'; $memcacheport = 11211; $memcachelife = 60; #memcache默認有效期
$memcache = new Memcache; $memcache->connect($memcachehost,$memcacheport) or die ("Could not connect"); #鏈接memcache服務器
$num=$_POST["num"]; $db=db1; $tb=T1; $query="select * from $tb where ID=$num"; #mysql查詢語句 #$key=md5($query);
$key=md5($num); #對參數進行加密,能夠看出memcache存儲的值是進過加密的
if(!$memcache->get($key)) #嘗試先從memcache取值,若是沒有去數據庫取,順便給memcache來一份
{ $conn=mysql_connect("127.0.0.1","root","123456"); mysql_select_db($db); $result=mysql_query($query); # echo "mysql $num";
while ($row=mysql_fetch_assoc($result)) { $arr[]=$row; } $f = 'mysql'; $memcache->add($key,serialize($arr),0,30); $data = $arr ; } else{ $f = 'memcache'; $data_mem=$memcache->get($key); $data = unserialize($data_mem); } echo "$f $num"; echo "key is $key"; echo "<br>"; ?>
write.php
<?php $memcachehost = '192.168.1.113'; $memcacheport = 11211; $memcachelife = 60; $memcache = new Memcache; $memcache->connect($memcachehost,$memcacheport) or die ("Could not connect"); $num=$_POST["num"]; $db=db1; $tb=T1; $query="insert into $tb values($num)"; #$key=md5($query);
$key=md5($num); if(!$memcache->get($key)) //先嚐試更新memcache,若是不存在,則再去更新數據庫,同時更新存儲到memcachce
{ $conn=mysql_connect("127.0.0.1","root","123456"); mysql_select_db($db); $result=mysql_query($query); while ($row=mysql_fetch_assoc($result)) { $arr[]=$row; } $f = 'mysql'; $memcache->add($key,serialize($arr),0,30); //mysql 插入成功後,插入 memcached
$data = $arr ; #} #else{
$f1 = 'memcache'; $data_mem=$memcache->get($key); $data = unserialize($data_mem); } echo "$f $f1 $num"; echo "<br>"; ?>
關於php memcache簡單用法參見http://www.cnblogs.com/demonxian3/p/6868361.html
上面兩個php裏能夠看到調用了數據庫的db1 和 表T1所以須要建立一下
seq 1 999 > /tmp/sum #建立1-999的測試數據
鏈接數據庫導入數據
create database db1; create T1(id int)engine=innodb; load data infile '/tmp/sum' into table T1; #導入測試數據
科普一下:使用history查看歷史命令,輸入!+數字能夠執行編號的那條命令
!111
用瀏覽器來訪問那個測試頁面
測試讀取數據,從數據庫裏查詢出id爲5的值
後退再去取一次
測試寫入數據
最後給你們推薦一款很好用的memcache管理工具:memadmin php寫的
搭建memcache過程可能會出現的問題:
執行 memcached 啓動命令時,報錯,提示:error while loading shared libraries: libevent-2.1.so.6: cannot open shared object file: No such file or directory
ldd /usr/local/memcached/bin/memcached
結果: libevent-2.1.so.6 模塊找不到
locate libevent-2.1.so.6
結果: 系統已經安裝了該模塊,在路徑 /usr/local/lib/
LD_DEBUG=libs /usr/local/memcached/bin/memcached -v
結果: 在 /lib64/ 目錄中查找,因此找不到已經安裝好的
ln -s /usr/local/lib/libevent-2.1.so.6 /usr/lib64/libevent-2.1.so.6
結果:這樣處理後,memcached就能夠搜索到該文件了
/etc/init.d/memcached restart