memcache 总结笔记
(一):基礎概念
memcache是什么?
Memcache 是一個高性能的分布式內存對象緩存系統,用于動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。Memcached基于一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,并通過memcached協議與守護進程通信。
memcache的工作原理?
RDBMS :關系數據庫管理系統(Relational Database Management System)。
memcached:
php有兩個memcache客戶端,一個是php memcached, 一個是php memcache。客戶端的memcached
相當于memcache的Plus版,實際在操作上和memcache幾乎類似,當然作為memcache的升級版,memcached在穩定性和速度上更好,php操作memcached提供了更多的方法。在php官方的手冊中分別搜索memcached和memcache 能發現他們的異同點。
memcache的主要特點?
2.基于libevent的事件處理
3.內置內存存儲方式
4.互不通信的分布式內純緩存服務器
memcache的使用場景?
1.因為memcache是不能持久化數據的,一旦memcache宕機或者重啟之類的,原來存入的數據都會丟失,所以對一些數據的安全性要求不高的可以考慮使用memcache
2.因為memcache存儲的單個對象的最大是1M所以,當有一些體積相對較小,但是頻繁被訪問的數據時,可以是考慮memcache
3.當一個系統有大量的動態內容時,存在大量的讀取數據庫的操作,造成數據庫負載過高時,可以考慮使用memcache做緩存來緩解數據庫壓力
4.多臺服務器需要共享某些數據的時候,可以考慮使用memcache,例如:session共享
5.小結:memcache基本就是做緩存用的,為的是緩解服務器的壓力,提高系統悉能
(二) 安裝memcache
1.準備工具
1.1 : Xshell
1.2 :一個可用的LAMP/LNMP環境
1.3:我測試的是LAMP CentOS7+Apache(2.4.6)+MySql(5.6.35)+PHP(5.416)
2.安裝基本流程
2.1 安裝memcached的服務器端
一般在服務器端安裝memcached得首先安裝libevent庫才行,但是在CentSO上使用yum方式安裝可以解決這種依賴
2.2 安裝php的memcache擴展
yum install php-memcache2.3 重啟一下服務器
3.memcache安裝后測試
3.1 開啟memcache服務器端
3.1.1memcached指令參數基礎解釋
//在memcache的服務器端,我們可以通過memcached -help查該指令有那些參數,我們只解釋下他的基礎參數的意思 //例如 指令 /usr/bin/memcached -d -l 127.0.0.1 -p 11211 -m 150 -u root -d 表示是守護進程 -l 連接的ip地址 -p memcached服務器監聽的端口 -m 分配給memcached服務的最大的內存,單位是MB,默認是64M -u 以誰的身份運行,示例中的是root用戶運行,實際中少這么用,權限太高了 -c 同時最大的連接數 默認是1024 -n 最小分配空間 key+value+flags 默認是483.2 查看php的memcache安裝是否成功
3.2.1 進入你應用的根目錄 例如:/var/www/html/ 下
3.2.2. 新建一個文件 vim phpinfo.php
3.2.3 使用瀏覽器訪問該文件 如果出現如下信息
3.2.4 表示php的memcache擴展開啟成功了
3.2.5 注意: 當你的memcache都安裝好了,在服務器上寫的php腳本,通過客戶端瀏覽器訪問卻沒有什么內容返回的情況,我們首先查看一下Linux上的訪問日志和錯誤日志,我是的LAMP環境,訪問日志和錯誤日志都是放在了默認的位置 /var/log/httpd 目錄下.打開access_log
狀態碼是200 表示訪問是ok的
我們再看錯誤日志error_log
我們看到最近的一次錯誤是許可被拒絕了
基本分析是可能和權限,安全保護有關(SELinux,防火墻等)
此處我臨時關閉SElinux即可 指令如下
(三):PHP操作memcache
php連接memcache服務器
2.1 返回的統計信息是一個數組,我們大概了解一下返回的統計信息的意思
2.2 我們看到使用php操作memcache,首先是實例化一個memcache的對象,然后建立一個memcache服務端的連接.
php操作memcache
###添加數據###
1.1 例如文件位置 : /var/www/html/con.php
1.2 我們再用一個文件驗證是否存入 文件位置:/var/www/html/test.php
<?php $mem = Memcache; $mem->connect('127.0.0.1',11211); echo date("Y-m-d H:i:s"); echo $mem->get('one');1.3 通過瀏覽器訪問執行,結果如下
超過設定的時間后就失效了
1.4 我們也可以使用set('鍵名','值',是否壓縮,失效時間)來添加數據
<?php $mem = Memcache; $mem->connect('127.0.0.1',11211); //set('鍵名','值','是否壓縮','多少秒后失效') $mem->add('one','故人西辭黃鶴樓',0,60); $mem->set('one','煙花三月下揚州',0,60);1.5 我們再獲取一下這個值
1.6 add()和set()方法的區別: add()添加一個值,如果這個值存在,則添加失敗
set()添加一個值,如果這個值存在,則替換掉原有的
###刪除數據###
2.1 修改 /var/www/html/test.php 文件
2.2 執行該文件后的效果
2.3 使用flush()方法清除已經存儲的所有數據
2.3.1 修改 /var/www/html/con.php 文件并執行
2.3.2 修改 /var/www/html/test.php 文件并執行
<?php $mem = new Memcache; $mem->connect("127.0.0.1",11211); $result = $mem->get(array('one','two','three','four')); echo "<pre>"; var_dump($result);2.3.3 結果如下
2.3.4 再修改 /var/www/html/test.php 文件并執行
2.3.5 結果如下
修改數據
3.1 php修改memcache的數據一般有兩個方法set() 和replace()
3.1.1再修改 /var/www/html/test.php 文件并執行
3.1.2 通過瀏覽器訪問test.php文件后的結果如下:
3.1.3 我們再次修改 /var/www/html/test.php 文件并執行
<?php $mem = new Memcache; $mem->connect("127.0.0.1",11211); //更新一個不存在的鍵 例如:five $flag = $mem->replace('five','火星歡迎您',0,0); if($flag === FALSE) {echo "更新數據失敗"; }else{echo "更新數據成功"; }$result = $mem->get(array('one','two','three','four')); echo "<pre>"; var_dump($result);3.1.4 執行后結果如下:
3.2 set()和replace是區別是:
當數據存在的時候,set()方法和replace()方法都能更新(修改),作用相同 當數據不存在的時候,set()方法會添加這樣一條數據,replace()方法會返回FALSE查詢數據
//memcache有關查詢的幾個方法 get()獲取memcache上key的值,前面有示例,既能是單一的key值也可以是一組key的數組 getStatus()獲取當前memcache服務器的統計信息 getServerStatus('服務器地址','端口號')用于獲取一個服務器的在線/離線狀態,返回一個服務器的狀態,0表示服務器離線,非0表示在線。 getExtendedStats()緩存服務器池中所有服務器統計信息,如果緩存池中有多臺memcache服務器,就將這些服務器的信息以二維數組的形式都返回 //例如,我向連接池中添加兩臺memcache服務器: $mem->addServer("127.0.0.1",11211); $mem->addServer("127.0.0.1",11212); $stats = $mem->getExtendedStats(); print_r($stats); //返回的信息格式將會是: Array ([127.0.0.1:11211]=>Array(.........)[127.0.0.1:11212]=>Array(.........) )增加或者減少一個元素的值
increment('要增加值的元素的鍵','增加的量'); decrement('要減少值的元素的鍵','減少的量');我們修改 /var/www/html/con.php 文件并執行
<?php $mem = new Memcache; $mem->connect("127.0.0.1",11211); $mem->set('num',4,0,0);我們修改 /var/www/html/test.php 文件并執行
<?php $mem = new Memcache; $mem->connect("127.0.0.1",11211); $mem->increment('num',3); echo $mem->get('num');結果如下:
鍵 , 壓縮 ,過期時間,緩存過期,分配內存耗盡
2.1 壓縮會節省更多的內存空間,但是也會帶來額外的CPU開銷,運行速度相對會慢
2.2 未壓縮,占用的內存空間小,但是運行速度快
2.3memcache 支持的最大存儲對象是1M,所以在將單個大于1M的內容存儲到memcache的時候需要開壓縮
memcache的有效時間單位是秒(s),手冊的解釋是"當前寫入緩存的數據的失效時間",設置有效時間有兩種寫法,并且有區別
//這種設置的有效時間的最大值是2592000秒既30天,但是要是有效時間大于30天怎么辦? memcache::set("home","love",0,2592000); //這樣這種時間戳的方式可以設置大于30天的有效時間 memcache::set("hope","love",0,time()+2592001);php操作memcache 基礎示例
我們模擬一個場景,我現在的user表(僅三個字段)中存在52W條數據,我要取出最新的2萬條數據.
分析:第一次訪問,memcache中沒有這些數據,我們就從DB中取得這些數據,并且將這些數據存入memcache中,當需要訪問相同的數據的時候,直接從memcache中提供這些數據
我們在根目錄下新建一個文件 vim /var/www/html/test2.php
<?php
$starttime = microtime(true);
echo $starttime;
function getmemcache($sql,Memcache $memacche)
{
$key = md5($sql);
$data = $memcache->get($key);
if(!$data)
{
try{
$pdo = new PDO("mysql:host=localhost;dbname=test",'root','123456');
}catch(PDOException $e){
die($e->getMessage());
}
$stmt = $pdo->prepare($sql);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
$memcache->set($key,$data,MEMCACHE_COMPRESSED, 0);
}
return $data;
}
$mem = new Memcache();
$mem->connect('127.0.0.1',11211);
$sql = "select * from user order by id desc limit 0,20000";
$data = getmemcache($sql,$mem);
print_r($data);
$mem->close();
$endtime = microtime(true);
echo $endtime;
echo '執行時間'.round($endtime-$starttime,3).'秒';
3.通過客戶端瀏覽器第一次訪問test2.php文件
4.再次訪問test2.php文件
5.我們可以看到第二訪問是從memcache中獲取測數據,應為我在test2.php文件中有2W條數據輸出,感覺還是耗時很多,我們將數據輸出那段代碼注釋掉,再次并且清空一下memcache緩存,再次訪問test2.php文件
學習本是一個自我修正的過程,總結中有許多的不足,萬望不吝賜教
[參考資料]:
1.http://php.net/manual/zh/class.memcache.php php手冊memcache部分
2.http://www.w3cschool.cn/memcached/ W3Cschool memcached部分
3.http://blog.csdn.net/heiyeshuwu/article/details/3950532 Memcached原理和使用詳情
[拓展資料]:
轉載于:https://www.cnblogs.com/gongzhifan/p/6663547.html
總結
以上是生活随笔為你收集整理的memcache 总结笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS设计模式 - 组合
- 下一篇: position定位——让人又爱又恨的属