### **1. memcache的特征**
1. 協議簡單,使用簡單的基于文本行的協議
2. 基于libevent事件處理,靈活調整服務器連接數
3. 內存存儲,存讀速度快
4. 不互相通信的分布式,每個服務器只對自己的數據進行管理
5. 缺乏認證及安全管理
### **2.Memcacehd的簡單使用**
**連接:**`
$m->addServer('127.0.0.1',11211);
`
#### 2.1 寫入:
* **存儲:**
`
$m->set('key','value','expire_time');
`
* **不存在則存儲:**
`
$m->add('key','value','expire_time');
`
* **存在則替換:**
`
$m->replace('key','value','expire_time');
`
* **已存在鍵后面追加數據:**
`
$m->append('key','value');
`
* **已存在鍵前面追加數據:**
`
$m->prepend('key','value');
`
* **最后一次取值后未修改再寫入:**
`
$m->cas('cas_token','key','value');
`
#### 2.2 取值與刪除
* **取值:**
`
$m->get('key');
`
* **獲取帶有CAS令牌的值:**
`
$m->get('key',$cas);
`
* **刪除:**
`
$m->delete('key');
`
#### 2.3 其他
* **數字值自增(通常用于統計訪問量)**
`
$m->increment('key','number');
`
* **數字值自減**
`
$m->decrement('key','number');
`
* **統計信息(Memcache 運行狀態和信息)**
`
$m->getStats()
`
### **3. 編寫自己的Memcached類**
#### **1.編寫緩存類**
```
class Memcached
{
private static $handle = null;
/**初始化
* @return Memcached|null
*/
public static function init()
{
$option = array(
'host' => Config::get('cache.MEMCACHED_HOST','127.0.0.1'),
'port' => Config::get('cache.MEMCACHED_PORT','11211')
);
if (!self::$handle) {
self::$handle = new \Memcached();
self::$handle->addServer($option['host'],$option['port']);
}
return self::$handle;
}
/**存儲
* @param $key
* @param $value
* @param $expire
* @return false
*/
public static function set($key,$value,$expire)
{
if (!self::init()) {
return false;
}
$res = self::init()->set($key,$value,$expire);
return $res;
}
/**獲取
* @param $key
* @return mixed
*/
public static function get($key)
{
$func = is_array($key) ? 'getMulti':'get';
return self::init()->{$func}($key);
}
/**
* 遞增
* @param $key
*/
public static function incr($key)
{
if (!self::init()) {
return false;
}
self::init()->add($key,0);
return self::init()->increment($key);
}
}
```
#### **2.使用**:
```
// 測試 memcached
\Driver\Cache\Memcached::set('user','李四',600);
echo \Driver\Cache\Memcached::get('user');
```
### **4.使用Memcached實現分布式算法**
* 服務器端互不通訊
* 由于程序實現分布式
* 考慮算法分散存儲壓力
* 考慮算法的命中率
### **5.Session共享機制**
**缺點**:集群錯誤會導致用戶無法登錄,回收機制導致用戶掉線
#### 步驟:
編輯php.ini
`session.save_handleer = "memcached"`
`session.save_path = "192.168.1.12:11211"`
### **6.memcache和memcached的區別**
* Memcache 基于pecl擴展庫版本
```
$cache = new memcache();
$cache->connect('127.0.0.1','11211');
$cache->set('memcache_key','value');
echo $cache->get('memcache_key');
```
* Memcached 基于libmemcached版本
```
$cached = new memcached();
$cached->addServer('127.0.0.1','11211');
$cached->set('memcached_key','value');
echo $cached->get('memcached_key');
```