當前位置:首頁 » 編程語言 » memcachedforphp

memcachedforphp

發布時間: 2023-04-07 17:43:08

㈠ memcached php怎麼配置

1、首先下載memcache的windows版本,將下載下來的文件解壓出來後會看見一個名為memcached.exe的可執行羨頌程序

2、將該文件放到指定目錄,如D盤

3、安裝:

開始->運行->虧派念cmd打開命令窗口

進入D盤:cd d:

安裝memcache服務:

在命令窗口輸入:

memacahed.exe -d install

等待命令執行完成後,就可以在服務列表中看到memcached服務

4、啟動memcache服務:

memcached.exe -d start

5、可以通過以下命令來查看memcache服務是否啟動成功:

wmic process get description, executablepath | findstr memcached.exe

可以將memcached.exe的路徑放入到系統環境變數中,方便使用。

查看memcache運行狀態:

在命令窗口輸入:

telnet 127.0.0.1 11211

鏈接到memcache上,輸入stats就可以查看到當前memcache的狀態了;

linux下:如果還不明白的話你可以和我去後盾人看看相關教材,多看幾遍,慢慢的這樣不就會了,希望能幫到你,給個採納吧謝銷困謝

㈡ php的memcached分布式hash演算法,如何解決分布不均crc32這個演算法沒辦法把key值均勻的分布出去

memcached的總結和分布式一致性hash
當前很多大型的web系統為了減輕資料庫伺服器負載,會採用memchached作為緩存系統以提高響應速度。
目錄: (http://hounwang.com/lesson.html)
memchached簡介
hash
取模
一致性hash
虛擬節點
源碼解析
參考資料
1. memchached簡介
memcached是一個開源的高性能分布式內存對象緩存系統。
其實思想還是比較簡單的,實現包括server端(memcached開源項目一般只單指server端)和client端兩部分:
server端本質是一個in-memory key-value store,通過在內存中維護一個大的hashmap用來存儲小塊的任意數據,對外通過統一的簡單介面(memcached protocol)來提供操作。
client端是一個library,負責處理memcached protocol的網路通信細節,與memcached server通信,針對各種語言的不同實現分裝了易用的API實現了與不同語言平台的集成。
web系統則通過client庫來使用memcached進行對象緩存。
2. hash
memcached的分布式主要體現在client端,對於server端,僅僅是部署多個memcached server組成集群,每個server獨自維護自己的數據(互相之間沒有任何通信),通過daemon監聽埠等待client端的請求。
而在client端,通過一致的hash演算法,將要存儲的數據分布到某個特定的server上進行存儲,後續讀取查詢使用同樣的hash演算法即可定位。
client端可以採用各種hash演算法來定位server:
取模
最簡單的hash演算法
targetServer = serverList[hash(key) % serverList.size]
直接用key的hash值(計算key的hash值的方法可以自由選擇,比如演算法CRC32、MD5,甚至本地hash系統,如java的hashcode)模上server總數來定位目標server。這種演算法不僅簡單,而且具有不錯的隨機分布特性。
但是問題也很明顯,server總數不能輕易變化。因為如果增加/減少memcached server的數量,對原先存儲的所有key的後續查詢都將定位到別的server上,導致所有的cache都不能被命中而失效。
一致性hash
為了解決這個問題,需要採用一致性hash演算法(consistent hash)
相對於取模的演算法,一致性hash演算法除了計算key的hash值外,還會計算每個server對應的hash值,然後將這些hash值映射到一個有限的值域上(比如0~2^32)。通過尋找hash值大於hash(key)的最小server作為存儲該key數據的目標server。如果找不到,則直接把具有最小hash值的server作為目標server。
為了方便理解,可以把這個有限值域理解成一個環,值順時針遞增。
如上圖所示,集群中一共有5個memcached server,已通過server的hash值分布到環中。
如果現在有一個寫入cache的請求,首先計算x=hash(key),映射到環中,然後從x順時針查找,把找到的第一個server作為目標server來存儲cache,如果超過了2^32仍然找不到,則命中第一個server。比如x的值介於A~B之間,那麼命中的server節點應該是B節點
可以看到,通過這種演算法,對於同一個key,存儲和後續的查詢都會定位到同一個memcached server上。
那麼它是怎麼解決增/刪server導致的cache不能命中的問題呢?
假設,現在增加一個server F,如下圖
此時,cache不能命中的問題仍然存在,但是只存在於B~F之間的位置(由C變成了F),其他位置(包括F~C)的cache的命中不受影響(刪除server的情況類似)。盡管仍然有cache不能命中的存在,但是相對於取模的方式已經大幅減少了不能命中的cache數量。
虛擬節點
但是,這種演算法相對於取模方式也有一個缺陷:當server數量很少時,很可能他們在環中的分布不是特別均勻,進而導致cache不能均勻分布到所有的server上。
如圖,一共有3台server – 1,2,4。命中4的幾率遠遠高於1和2。
為解決這個問題,需要使用虛擬節點的思想:為每個物理節點(server)在環上分配100~200個點,這樣環上的節點較多,就能抑制分布不均勻。
當為cache定位目標server時,如果定位到虛擬節點上,就表示cache真正的存儲位置是在該虛擬節點代表的實際物理server上。
另外,如果每個實際server的負載能力不同,可以賦予不同的權重,根據權重分配不同數量的虛擬節點。
// 採用有序map來模擬環
this.consistentBuckets = new TreeMap();
MessageDigest md5 = MD5.get();//用MD5來計算key和server的hash值
// 計算總權重
if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )
this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];
} else if ( this.weights == null ) {
this.totalWeight = this.servers.length;
}
// 為每個server分配虛擬節點
for ( int i = 0; i < servers.length; i++ ) {
// 計算當前server的權重
int thisWeight = 1;
if ( this.weights != null && this.weights[i] != null )
thisWeight = this.weights[i];
// factor用來控制每個server分配的虛擬節點數量
// 權重都相同時,factor=40
// 權重不同時,factor=40*server總數*該server權重所佔的百分比
// 總的來說,權重越大,factor越大,可以分配越多的虛擬節點
double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );
for ( long j = 0; j < factor; j++ ) {
// 每個server有factor個hash值
// 使用server的域名或IP加上編號來計算hash值
// 比如server - "172.45.155.25:11111"就有factor個數據用來生成hash值:
// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor
byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );
// 每個hash值生成4個虛擬節點
for ( int h = 0 ; h < 4; h++ ) {
Long k =
((long)(d[3+h*4]&0xFF) << 24)
| ((long)(d[2+h*4]&0xFF) << 16)
| ((long)(d[1+h*4]&0xFF) << 8 )
| ((long)(d[0+h*4]&0xFF));
// 在環上保存節點
consistentBuckets.put( k, servers[i] );
}
}
// 每個server一共分配4*factor個虛擬節點
}
// 採用有序map來模擬環
this.consistentBuckets = new TreeMap();
MessageDigest md5 = MD5.get();//用MD5來計算key和server的hash值
// 計算總權重
if ( this.totalWeight for ( int i = 0; i < this.weights.length; i++ )
this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];
} else if ( this.weights == null ) {
this.totalWeight = this.servers.length;
}
// 為每個server分配虛擬節點
for ( int i = 0; i < servers.length; i++ ) {
// 計算當前server的權重
int thisWeight = 1;
if ( this.weights != null && this.weights[i] != null )
thisWeight = this.weights[i];
// factor用來控制每個server分配的虛擬節點數量
// 權重都相同時,factor=40
// 權重不同時,factor=40*server總數*該server權重所佔的百分比
// 總的來說,權重越大,factor越大,可以分配越多的虛擬節點
double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );
for ( long j = 0; j < factor; j++ ) {
// 每個server有factor個hash值
// 使用server的域名或IP加上編號來計算hash值
// 比如server - "172.45.155.25:11111"就有factor個數據用來生成hash值:
// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor
byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );
// 每個hash值生成4個虛擬節點
for ( int h = 0 ; h < 4; h++ ) {
Long k =
((long)(d[3+h*4]&0xFF) << 24)
| ((long)(d[2+h*4]&0xFF) << 16)
| ((long)(d[1+h*4]&0xFF) << 8 )
| ((long)(d[0+h*4]&0xFF));
// 在環上保存節點
consistentBuckets.put( k, servers[i] );
}
}
// 每個server一共分配4*factor個虛擬節點
}
// 用MD5來計算key的hash值
MessageDigest md5 = MD5.get();
md5.reset();
md5.update( key.getBytes() );
byte[] bKey = md5.digest();

// 取MD5值的低32位作為key的hash值
long hv = ((long)(bKey[3]&0xFF) << 24) | ((long)(bKey[2]&0xFF) << 16) | ((long)(bKey[1]&0xFF) << 8 ) | (long)(bKey[0]&0xFF);

// hv的tailMap的第一個虛擬節點對應的即是目標server
SortedMap tmap = this.consistentBuckets.tailMap( hv );
return ( tmap.isEmpty() ) ? this.consistentBuckets.firstKey() : tmap.firstKey();
更多問題到問題求助專區(http://bbs.hounwang.com/)

㈢ php memcached怎麼用

memcached是一種緩存技術, 基於c/s模式,他可以把你的數據放入內存,從而通過內存訪問提速,因為內存最快的, memcached技術的主要目的提速,
在memachec 中維護了一張大的hashtable表 ,該表是在內存,表的結構是
key value
字串 (字串,數值,數組,對象,布爾,二進制數據,null)

u 安裝並使用memcached
安裝步驟
(1) 下載memcached軟體
(2) 安裝
進入cmd ,切換到 memcached.exe 文件所在目錄
memcached.exe –d install
(3) 啟動memcached
第一種,可以到服務點擊啟動
第二種, 命令行
memcached.exe –m 200MB –d start 【以deamon方式啟動,默認64M】

如果你在啟動時,win7啟動不成功, 則可以使用如下方法
memcached.exe –p 埠號
轉載,僅供參考。

㈣ php怎麼開啟memcache

下載memcache安裝包和php擴展文件php_memcache.dll。解壓memcache,把memcached移動到C盤。

單擊開始菜單,運行「cmd」。
cd .. //進入c盤
cd memcached //進入memcache目錄
memcache.exe -d install //安裝memcache服務

設置php:找到php安裝目錄,打開php.ini文件。找到配置文件里允許支持擴展的區域exetension=。。,添加一行exetension=php_memcache.dll。

把php擴展文件php_memcache.dll移動到php安裝目錄下的ext目錄下。注意在php.ini中要設置好exetension目錄。php_memcache.dll此文件需要先在網上下載下來!

設置apache:
打開apache配置文件httpd.conf,找到LoadMole載入模塊區域。去掉前面的「LoadMole mem_cache_mole moles/mod_mem_cache.so」#號

重啟apache服務。linux下重啟使用命令:service httpd restart。

然後就大功告成!

㈤ 使用php Memcache模塊如何正確遍歷所有KEY以及VALUE

在php提供的用於與memcached交互的擴展模塊中有memcached與memcache,前者提供方法getAllKeys用於遍歷所有Memcached伺服器上的key,但是並不保證原子操作,而後者卻沒有提供任何方法,雖然在PHP官方
文檔中有人給出使用方法getExtendedStats來間接獲取Memcached伺服器上的所有key,但是給出的代碼是有不少坑的,如果拿來就用,對於cluster的memcached伺服器而言,有些問題就需要指出來。
下面將給出官方文檔中的代碼,並指出可能面臨的問題,代碼如下:
<?php
/**
*Functiontogetallmemcachekeys
*@authorManishPatel
*@Created:28-May-2010
*/
functiongetMemcacheKeys(){

$memcache=newMemcache;
$memcache->connect('127.0.0.1',11211)ordie("");

$list=array();
$allSlabs=$memcache->getExtendedStats('slabs');
$items=$memcache->getExtendedStats('items');
foreach($allSlabsas$server=>$slabs){
foreach($slabsAS$slabId=>$slabMeta){
$cmp=$memcache->getExtendedStats('cachemp',(int)$slabId);
foreach($cmpAS$keys=>$arrVal){
foreach($arrValAS$k=>$v){
echo$k."<br>";
}
}
}
}//EOgetMemcacheKeys()?>
在上述代碼中,如果用於獲取單個memcached伺服器上的key,是不存在任何問題,但是獲取連接池中的多個memcached所有key就存在問題,會發現列印出重復的key,問題就在於當使用getExtendedStats用去特定$slabID
上的信息時,返回的是連接池中所有的伺服器上的特定$slabId的存儲的keys信息。當$server為"127.0.0.1:11214"且$slabId為0將變數$cmp的信息列印出如下所示:
array(2){
["127.0.0.1:11214"]=>
array(1){
["course_schools__??¨é?¨"]=>
array(2){
[0]=>
string(1)"0"[1]=>
string(10)"12"}
}
["127.0.0.1:11216"]=>
array(1){
["monitorMemcache"]=>
array(2){
[0]=>
string(2)"10"[1]=>
string(10)"12"}
}
}
當$server為"127.0.0.1:11216"且$slabId為0將變數$cmp的信息列印出如下所示:
array(2){
["127.0.0.1:11214"]=>
array(1){
["course_schools__??¨é?¨"]=>
array(2){
[0]=>
string(1)"0"[1]=>
string(10)"12"}
}
["127.0.0.1:11216"]=>
array(1){
["monitorMemcache"]=>
array(2){
[0]=>
string(2)"10"[1]=>
string(10)"12"}
}
}

㈥ php中memcache和memcached有什麼區別

PHP有兩個memcache客戶端:php memcache和php memcached。

memcache完全在PHP框架內開發的,提供了memcached的介面,memecached擴展是使用了libmemcached庫提供的api與memcached服務端進行交互。
memcache提供了面向過程及面向對象的介面,memached只支持面向對象的介面。
memcached 實現了更多的 memcached 協議。
memcached 支持 Binary Protocol,而 memcache 不支持,意味著 memcached 會有更高的性能。不過,還需要注意的是攔粗游,memcached 目前還不支持長連接。
以後還有啥不懂的,就去後盾人那裡看看吧凳槐,那裡有簡銷很多專家錄制的視頻教學

㈦ php 一個網站需要用memcached!主要緩存什麼內容 那些該緩存 應該注意什麼

這個東西最大的好處是可以存儲對象,減少很多資料庫和伺服器壓力。直接基於內存的存儲,調用速度非常給力。
主要緩存的內容,大概可以歸納為 1.不需要即時顯示的內容,或者mysql查詢耗時的內容。舉例說明:網站的列表【最火的 排行榜】等非及時的,最新的如果強調及時性,可不用,當然也可以使用,可能更新緩存頻率較高。
2.非常需要速度和性能的地方
有些頁面通過mysql可能聯合查詢,全表檢索查詢速度相當慢,這時候可用緩存暫時保留 例如搜索引擎的結果集。

3.臨時數據保存
我們知道mysql Oracle等關系型資料庫,需要建立表結構才能存儲,這就決定了,有些臨時數據的存儲,也需要建立特定的表結構。這樣就比較啰嗦,不便於維護。
4.存儲對象
這個也是一個比較有特色的地方,php創建對象的效率是不高的,甚至堪稱低效,再加上構造函數大量的資料庫操作的話,會讓性能低到谷底,那麼它能幫你吧已經創建好的對象 保存起來 下次相同的請求 無需new只需要將它還原。
綜上,緩存是php的利器,速度 效率 等詞彙都可以通過它去體現

熱點內容
游戲伺服器php 發布:2024-11-02 10:21:51 瀏覽:953
家鄉編程創 發布:2024-11-02 10:11:32 瀏覽:282
ipad和安卓板玩游戲哪個好 發布:2024-11-02 10:02:37 瀏覽:804
郵箱密碼怎麼查看 發布:2024-11-02 09:59:46 瀏覽:724
wand應用怎麼安卓下載 發布:2024-11-02 09:57:46 瀏覽:80
為什麼手機銀行密碼是8位 發布:2024-11-02 09:54:19 瀏覽:460
win10搭建一個本地伺服器 發布:2024-11-02 09:53:36 瀏覽:348
git搭建本地伺服器windows 發布:2024-11-02 09:49:23 瀏覽:783
跳過地址的代理伺服器 發布:2024-11-02 09:30:03 瀏覽:388
Linux配置yum源是什麼意思 發布:2024-11-02 09:18:13 瀏覽:526