php Memcache/Memcached使用教程
Memcache和Memcached 其實是一個東西,只是php中要是用的擴展不一樣, 2009年左右有人豐富memcache的用法和性能,編寫了一個libmemcached是獨立第三方client library,才有了memcached ,用法也有了很大的改進比如添加了 getMulti() 批量獲取鍵值
windows下只能安裝php_memcache.dll 擴展並不存在 php_memcached.dll, 所以windows 中只能使用$mcd = new Memcache() 不能使用new Memcached()
Memcache 類
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211);
$memcache->pconnec('127.0.0.1', 11211);
// 打開一個到服務器的持久化連接 , 連接不會在腳本執行結束后或者close()被調用后關閉
$memcache->addServer('123.57.210.55', 11211,$persistent,$weight);
// 向連接池中添加一個memcache服務器 $persistent 是否持久化連接 $weight
控制桶的數量提升被選中的權重 $timeout 表示連續持續時間
$memcache->set('name', 'TK');
// 默認存儲不壓縮 不過期 , 其中字符串和數值直接存儲,其他類型序列化后存儲
set其實是add方法和replace方法集合
$memcache->set('email', 'julylovin@163.com',MEMCACHE_COMPRESSED,5);
// MEMCACHE_COMPRESSED設置存儲是否壓縮 , 5表示5秒后過期但是最大只能設置2592000秒(30天)
如果設置為0 表示永不過期, 可以設置將來的時間戳
$memcache->set('info',array('age'=>'26','salary'=>'1000'));
// 可以直接存儲數組,redis中存儲需要手動serialize()序列化
$memcache->add('counter', '10', MEMCACHE_COMPRESSED, 0);
//如果鍵值存在會返回false , 如果不存在, 和set方法一樣,生成一個counter的key並賦值10
$memcache->replace ('counter', '10');
//如果鍵值不存在會返回false , 如果存在, 替換counter的值為10
$memcache->increment('counter', 3);
// 首先將元素當前值轉換成數值然后減去value 操作counter鍵值+3
若鍵不存在 則返回false 不能用於壓縮的鍵值操作,否則get鍵會失敗
$memcache->decrement('counter', 3); // 操作counter鍵值-3 , 若鍵不存在 則返回false
$memcache->delete('counter', 3); // 操作刪除鍵counter , 3表示3秒內刪除,默認是0即立即刪除
$memcache->flush(); //flush()立即使所有已經存在的元素失效
$memcache->getExtendedStats ();
// 返回一個二維關聯數據的服務器統計信息。數組的key由host:port方式組成
$memcache->getServerStatus ('127.0.0.1'); // 獲取返回一個服務器的在線/離線狀態 0表示離線 非0在線
$memcache->getStats(); // 獲取服務器統計信息
$memcache->getVersion(); // 返回服務器版本信息
$memcache->setCompressThreshold ($threshold, $min_saving);
// 開啟大值自動壓縮 $threshold設置壓縮閥值 2000字節 ,即字節數大於2K 就壓縮
$min_saving 0--1之間 0.2表示壓縮20%
$memcache->setServerParams('memcache_host', 11211, 1, 15, true, '_callback_memcache_failure');
// $memcache->addServer('memcache_host', 11211, false, 1, 1, -1, false);
已經通過addServer 配置過服務器 使用setServerParams 重新設置配置信息
Memcached 類
此次練習我是在linux上安裝了phpstorm,linux平台開發配置看我的其他文章
$memcached = new Memcached(); // 必須安裝memcached擴展 不會安裝看我的相關文章
#server_key名詞解釋#
#當台服務IP和端口完全連通好之后,構成一個hash環,$server_key才會生效
#$server_key 只是為了存儲的key打個標記 比如有三台 memcache服務器 (A B C ) , 指定 server_key
'master-a' 'master-b' 'master-c' 分別存儲 會員 訂單 日志 等等
$memcached->addServer('192.168.206.128',11211); // 連接服務器
$memcached->setOption(Memcached::OPT_COMPRESSION, false);
//配置存儲不壓縮,壓縮value不利於遞增遞減
$memcached->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);
//
$memcached->addServers(array( //添加多台服務器分布式
array('192.168.206.128', 11311, 20),
array('192.168.206.128', 11411, 30)
));
$memcached->flush(1); //1秒內清除所有元素
$memcached->set('name','TK');
$memcached->setByKey('server_master_db','mage','28');
# 指定 server_key server_master_db 存儲鍵mage
$memcached->setMulti(array('salary'=>'3000','email'=>'julylovin@163.com'));
// 存儲多個元素
$memcached->setMultiByKey('server_master_db',
array('salary'=>'3000','email'=>'julylovin@163.com'));
// 'server_master_db'服務器 存儲多個元素
$memcached->add('name','TK'); // 鍵name不存在添加value 否則添加失敗
$memcached->addByKey('server_master_db','mname','MTK');
$memcached->append('key','-816'); // 鍵key的value后追加字符串 -816
$memcached->appendByKey('server_master_db','mname','-923');
$memcached->prepend('name','pre-') ; #向一個已存在的元素前面追加數據
$memcached->prependByKey('server_master_db','name','pre-') ;
# 使用server_key自由的將key映射到指定服務器 向一個已存在的元素前面追加數據
$memcached->get('name');
$memcached->get('name',null,$cas);
# 第2參數指定緩存回掉函數 ,不指定傳null
# 如果元素被找到,並且返回變量 $cas 內部是通過引用變量回傳的
$memcached->getByKey('server_master_db','mname'); # 從特定的服務器檢索元素
$memcached->getAllKeys(); // bug 我一致返回是false
$memcached->cas($cas, 'name', 'TangKang');
#要與$memcached->get('name',null,$cas) 方法搭配用 才可以拿到 $cas變量
#它僅在當前客戶端最后一次取值后,該key 對應的值沒有被其他客戶端修改的情況下, 才能夠將值寫入
#這是Memcached擴展比Memcache擴展一個非常重要的優勢
在這樣一個系統級(Memcache自身提供)的沖突檢測機制(樂觀鎖)下, 我們才能保證高並發下的數據安全
$memcached->casByKey($cas,'server_master_db', 'name', 'TangKang');
$memcached->increment('age','1');
#增加數值元素的值 如果元素的值不是數值類型,將其作為0處理
$memcached->incrementByKey('server_master_db','age','1');
# 用於識別儲存和讀取值的服務器
$memcached->decrement('age','1');
#減少數值元素的值 如果元素的值不是數值類型,將其作為0處理
$memcached->decrementByKey('server_master_db','age','1');
# 用於識別儲存和讀取值的服務器
$memcached->getDelayed(array('name', 'age'), true, null);
# 請求多個元素, 如果with_cas設置為true,會同時請求每個元素的CAS標記
指定一個result callback來替代明確的抓取結果
$memcached->getDelayedByKey('server_master_db',array('name', 'age'), true, null);
$memcached->fetch();
# 搭配 $memcached->getDelayed()使用, 從最后一次請求中抓取下一個結果
$memcached->fetchAll();
#抓取最后一次請求的結果集中剩余的所有結果
$memcached->getMulti(array('name', 'age')); #檢索多個元素
$memcached->getMultiByKey('server_master_db',array('mname', 'mage'));
# 從特定服務器檢索多個元素
# 與 $this->memcached->fetchAll() 搭配使用
$memcached->getOption(Memcached::OPT_COMPRESSION);
# 獲取Memcached的選項值
$memcached->getResultCode() ;
# 返回最后一次操作的結果代碼 Memcached::RES_NOTSTORED
$memcached->getResultMessage() ;
# 返回最后一次操作的結果描述消息
$memcached->getServerByKey('server_master_db') ; # 獲取一個key所映射的服務器信息
$memcached->getServerList() ; # 獲取服務器池中的服務器列表
$memcached->getStats() ; # 獲取服務器池的統計信息
$memcached->getVersion() ; # 獲取服務器池中所有服務器的版本信息
$memcached->isPersistent() ; #判斷當前連接是否是長連接
$memcached->replace('name','pre-julylovin') ;
#set()類似,但是如果 服務端不存在key, 操作將失敗
$memcached->replaceByKey('server_master_db','name','pre-julylovin') ;
#setBykey()類似,但是如果 服務端不存在key, 操作將失敗
$memcached->resetServerList() ; //清楚服務器池信息
$memcached->setOption(Memcached::OPT_PREFIX_KEY, "widgets") ;
#設置一個memcached選項
$memcached->setOptions(array()) ;
#設置一個memcached選項
$memcached->setSaslAuthData($username , $password ) ;
#setSaslAuthData 方法不存在
$memcached->touch('name', 10) ;
#設置鍵name 10秒后過期(只適用30天之內的秒數) ,30天以后請設置時間戳
$memcached->touchByKey('server_master_db','name',10) ;
$memcached->delete('age',10);
#10秒(秒數/時間戳)內刪除一個元素 這個鍵已經存在刪除隊列
該鍵對應的get、add、replace命令都不可用,直到刪除
$memcached->deleteByKey('server_master_db','age');
$memcached->deleteMulti(array('age','name')); #傳入array刪除多個key
$memcached->deleteMultiByKey('server_master_db',array('age','name'));
$memcached->quit(); # 關閉所有打開的鏈接
done!