Python編程:使用cachy緩存數據
836
2025-04-03
本篇文章向大家介紹的是PHP中的memcache和memcached ,有興趣的朋友可以看一下
**memcache介紹:**Memcache是一套分布式緩存系統,分布式就是說可以在多臺服務器上同時安裝Memcache服務,這樣可以達到很好的集群效果。高速,是因為Memcache數據都是維護在內存中的,它的讀取速度比存儲在硬盤中的數據的讀取速度要快很多。
作用:當我們的應用訪問量比較大的時候,數據庫的壓力也會特別大,Memcache可以在應用和數據庫之間增加一個緩沖層,就是我們之前從數據庫中已經讀取到的數據,我們第二次或者是接下來再讀取的時候,就可以直接訪問Memcache去讀取這些數據,從而減輕Mysql等等數據庫的壓力
怎樣理Memcache:其實可以理解成,它是一個只有一張表的數據庫,這張表有兩個字段,分別是key和value,value是保存的數據,key就是這個數據的ID,用來保證查找時的唯一性
使用場景:
(1)非持久化存儲:對數據存儲要求不高,也就是說,如果這份數據丟失,也不會對系統造成太大的影響,因為當系統斷電或被重啟后內存會被清空掉,那么之前保存在Memcache中的數據也會被清空掉。所以要把Memcache當作緩存使用,而不要當成真正的數據庫
(2)分布式存儲:不適合單機使用,因為Memcache對內存的消耗很大,如果使用Memcache,推薦將其安裝在另外一臺機器上單獨作為緩存系統,而不要把Memcache和數據庫都裝到一臺機器。
(3)Key/Value存儲:格式簡單,不支持List、Array數據格式
memcached和Memcache是兩個版本,推薦Memcached,它有更多的改進和功能函數,是Memcache的升級版本,速度和穩定性都比較高
安裝Memcached
1,Memcache服務端的安裝
(1)編譯安裝,Libevent Memcache
先安裝Libevent這個擴展,編譯安裝的好處就是可以在安裝的過程進行一些自定義的設置,比如指定軟件安裝在哪兒,比如編譯安裝過程出現了哪些錯誤,而對Linux了解不是特別多的情況下,你可能處理錯誤的時候就會相對困難
(2)使用依賴管理工具yum、apt-get進行安裝
實際安裝:(操作系統是64位的Centos)
如果要編譯安裝,需要將安裝包提前下載下來libevent、memcached
這里使用依賴管理工具安裝
#yum install memcached
啟動memcached
#/usr/bin/memcached -d -l 127.0.0.1 -p 11211 -m 150 -u root
/*-d:守護進程的模式啟動。守護進程就是,當你從終端窗口推出之后,程序依然進行
-l:指定IP地址
-p:指定端口號
-m:為memcached分配多少內存,這里是以M為單位
-u:以哪個身份去啟動memcached(線上的時候最好不要用超級管理員用戶)*/
可以使用ps查看memcached進程是否啟動
#ps -ef | grep memcached
2,Memcache客戶端的安裝
1,安裝前置擴展Libmemcached
下載好libmemcached和memcached,對libmemcached進行解壓
這里使用編譯安裝,進入解壓出來的文件夾
執行
#./configure --prefix=/usr/lib/libmemcached
然后執行
#make && makeinstall
2,為php安裝memcached擴展
解壓memcached,進入到解壓目錄當中
使用phpize的方式安裝memcached擴展
#phpize此時就會做出一個configure的文件
#./configure --with-php-config=/usr/local/php/bin/php-config --with-libmemcached-dir=/usr/lib/libmemcached-sasl
后邊是指定php的配置文件和剛安裝的libmemcached的位置,大家根據自己的配置文件路徑進行填寫
#make#make install
執行完make install之后,我們會看見一個擴展目錄,將該路徑添加到php配置文件中php.ini中加入
extension=memcached.so
然后重啟服務器環境,查看php擴展
#php -m | grep memecached
在PHP中使用memcached
系統類:addServer、addServers、getStats、getVersion
數據類:add、set、delete、flush、replace、increment、get
進階類:setMulti、deleteMulti、getMulti、getResultCode、getResultMessage
更多關于memecached的操作,可以到php官網查看(php.net)
test.php
/*系統類*
/$m = new Memcached();
/*添加服務器*/
$m->addServer('127.0.0.1', 11211);
/*添加多臺服務器*/
$array = array( array('127.0.0.1', 11211), array('127.0.0.1', 11211));
$m->addServers($array);
/*查看服務器狀態*/
print_r($m->getStats());
/*查看服務端版本號*/
print_r($m->getVersion());
/*數據類*/$m->add('mkey', 'mvalue', 0);
//第三個參數是數據存在的時間,0表示永久
echo $m->get('mkey');
//獲取數據
/*假設對同一個key值進行兩次添加的話,后邊的操作不會覆蓋前邊的value,如果想替換掉,就使用replace*/
$m->replace('mkey', 'mvalue2');
/*還可以使用set方法表添加數據,它的好處就是,當我們的數據不存在時會幫我們新建數據,如果存在,就會覆蓋原值*/
$m->add('mkey', 'mvalue', 600);
/*刪除數據*/$m->delete('mkey');
/*清空memcache中的所有緩存*/
$m->flush();
/*對memcache中整形數據進行+1或+任意數值的操作*/
$m->set('num', 5, 0);$m->increment('num', 5);
//每次刷新頁面,num自增5
$m->get('num');
/*自減decrement用法相同*/
/*下邊的方法只支持Memcached,不支持Memcache*/
/*一次添加多條數據*/
//原始方法,多次使用set()
//現在可以使用setMulti()
$data = array( 'key' => 'value', 'key1'=> 'value1');
$m->setMulti($data,0);
$result = $m->getMulti(array('key','key1'));
//獲取多條數據
print_r($result);
//刪除多條數據$m->deleteMulti(array('key','key1'));
//返回上一次操作返回的編碼(數字的形式存在) 可以到手冊中查看每一個編碼的含義
echo $m->getResultCode();
//比如 成功 返回0
//獲取操作結果
echo $m->getResultMessage();
//比如 成功 返回SUCCESS
封裝一個自己的Memcache類
Memcached.class.php
封裝自己的Memcached類
1,擴展性
2,可調性
3,盡量簡便的操作,一個方法多種功能
*//*
通過一個s()方法實現set()、get()、delete()操作
set s($key,$value,$time)
get s($key)
delete s($key,NULL)
*/class Mem
{ private $type = 'Memcached';//考慮到擴展性,實例化的可能是Memcache也可能是Memcached
private $m; private $time = 0; private $error; private $debug = 'true'; public function __construct()
{ if(!class_exists($this->type)){ $this->error="No ".$this->type; return false;
}else{ $this->m=new $this->type;
}
} //添加服務器
public function addServer($arr)
{ $this->m->addServers($arr);
} public function s($key, $value='', $time=NULL)
{ $number = func_num_args();//該函數用來判斷傳遞過來了幾個參數
if($number == 1){ return $this->get($key);
}else if($number >= 2){ if($value === NULL){//一定要使用“全等于”,因為如果不是全等于,傳遞過來0也會通過
$this->delete($key);
}else{ $this->set($key, $value, $time);
}
}
} private function set($key, $value, $time=NULL)
{ if($time === NULL) $time = $this->time(); $this->m->set($key, $value, $time); if($this->debug){ if($this->m->getResultCode() != 0){ return false;
}
}
} private function get($key){ $result = $this->m->get($key); if($this->debug){ if($this->m->getResultCode() != 0){ return false;
}
} return $result;
} private function delete($key)
{ $this->m->delete($key);
} public function getError()
{ if($this->error){ return $this->error();
}else{ return $this->m->getResultMessage();
}
}
}
項目中使用Memcache
1,即時生成緩存
比較適用于類似于新聞詳情頁,第一個人進入頁面時,生成緩存,當后邊的人再進入這個頁面時,可以直接從緩存中獲取數據,并且可以給數據設置一個過期時間,這樣的話,等看這個新聞的人比較少的時候就可以及時清除緩存,這樣可以達到節約內存的目的
2,提前生成緩存
這種生成緩存的方式,比較適用于訪問量比較大且數據量比較多,類似于網站首頁這種情況。可以使用定時腳本的方式,提前將緩存生成
3,永久緩存
這種緩存方案比較適合于關于單獨的頁面,它的修改頻率非常低,這時可以生成永久緩存
相關推薦:
php模塊memcache和memcached區別分析_PHP教程
原文:http://www.php.cn/php-weizijiaocheng-391225.html
Memcached PHP
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。