u Memcached的基本概念
php
是一種緩存技術(內存), 你能夠把它想象成一張巨大的內存表:形式[他就是一個服務]mysql
key val linux
key值(字符串) 能夠放(字符串【二進制數據[視頻、音頻、圖片]】,數值,數組,對象,)算法
u 安裝memcache服務sql
步驟數據庫
1. 下載apache
2. 安裝json
卸載 memcached.exe –d uninstall (-d daemon 後臺程序)windows
中止服務 memcahced.exe –d stop 數組
安裝 memcached –d install
3. 測試是否安裝成功
啓動
memcached –d start
咱們使用
netstat –an 看看是否有 11211 端口在監聽,若是在監聽,則說明成.
netstat –anb (b 能夠顯示 是哪一個程序在監聽這個端口.)
若是如今,我要殺掉這個程序 ,在windows 下 可使用任務管理器殺死.
linux kill -9 進程號 killall 進程名
大部分同窗安裝Ok, 只有是xp都ok,
win7 的同窗有一部分沒有ok
a. 把 memcached.exe 放在 中文目錄 , 這樣不行
b. 安裝使用的是 普通用戶, 你要切換成 administror ctrl+alt+delete
如何操做memcached 服務.
學習如何完成crud操做! (任務驅動 | )
telnet 的具體使用
a. 登陸到telnet
語法
telnet ip 端口
登陸到 11211 端口
telnet 127.0.0.1 11211
b 如何對mem進行 curd 操做
添加
add key1 0 60 5
說明 key1 表示 鍵值 ,能夠本身指定
0 表示一個格式, 不變
60 存放在mem多長時間
5 表示存放的數據是多少個字節
查詢
get 鍵值
舉例
get hsp1
說明若是 hsp1 不存在,或是是由於時間到而被 memcache 刪除了,將獲得空.
修改
有兩種方法
replace 鍵值 0 時間 大小 【這裏有一個注意事項,該鍵值必須存在】
舉例:
replace hsp1 0 40 8
第二種方法:
set 鍵值 0 時間 大小 【若是這個鍵存在,則替換,若是不存在,則表示添加一個新的鍵值】
案例
set hsp1 0 60 5
刪除
語法
delete 鍵值
如今,若是咱們在mem服務中,須要作一個計數器(存放值必定是一個數),怎麼辦?
key val
counter 0
add counter 0 0 100
incr key 數字
telnet使用ok!
u 如何使用memcache 的擴展來操做memcached 服務
(1) 把 php_memcache.dll 拷貝 ~php/ext/目錄
(2) 在 php.ini 中添加一句話
;引入php_memcache.dll
extension=php_memcache.dll
(3) 使用 PHP 程序 curd
<?php
//建立對象
$mem=new Memcache;
//鏈接到mem服務器
$mem->connect("127.0.0.1",11211);
//添加,該函數返回true
if($mem->add("hsp1","china",MEMCACHE_COMPRESSED,60)){
echo "添加ok";
}else{
echo "添加err";
}
//查詢
$val=$mem->get("hsp1");
echo "val=$val";
echo "<br/>";
//修改 replace set
if($mem->replace("hsp1","hello,world",MEMCACHE_COMPRESSED,60)){
echo "replace ok";
}else{
echo "replace 失敗";
}
echo "<br/>";
//set 若是存在就替換,不存在,就添加
if($mem->set("hsp1","hello,world , 你好!",MEMCACHE_COMPRESSED,60)){
echo "set ok";
}else{
echo "set 失敗";
}
echo "<br/>";
//刪除
if($mem->delete("hsp1")){
echo "刪除ok";
}
(4) 談談細節,增強
討論, 在memcache中什麼數據類型能夠放入. 字符串 ,數字 ,數組, 對象 ,資源
當咱們在mem中存取對象是,在取的時候,咱們須要在前面引入這個類的聲明.
把這個代碼:
<?php
//放入數組
$arr=array("1"=>"beijing","2"=>"天津");
//數組默認是序列號
if($mem->add("city2",json_encode($arr),MEMCACHE_COMPRESSED,60)){
echo "city ok";
}else{
echo "city fail";
}
//對象
class Dog{
public $age;
public $color;
public function __construct($age,$color){
$this->age=$age;
$this->color=$color;
}
}
$dog1=new Dog(30,"紅色");
if($mem->add("dog1",$dog1,MEMCACHE_COMPRESSED,60)){
echo "dog1 ok";
}else{
echo "dog1 fail";
}
echo "<br/>";
$mydog=$mem->get("dog1");
echo $mydog->age;
var_dump($mydog);
$con=mysql_connect("localhost","root","root");
echo "<br/>";
if($con){
//放入mem
if($mem->add("conn",$con,MEMCACHE_COMPRESSED,160)){
echo "資源添加ok";
}else{
echo "資源添加失敗";
}
}
工做環境: apache 的 httpd.conf 文件 php.ini 文件是有其餘人來管理,你沒有權利去修改這些配置文件,可是你還但願去使用memcached
解決方法: 咱們使用原生態的代碼來完成.->這裏咱們能夠直接使用
咱們能夠把 memcached-clinet.php 引入到咱們的項目中,而後我就能夠直接來完成了.
代碼: 完成 crud操做.
① 先關閉 extension
② 咱們寫mem4.php 並引入咱們的 memcached-clinet.php 通常說全部的技術文檔,都會給你一個案例,因此你照這個案例能夠快速使用
<?php
//直接使用函數來操做咱們的memcached
include "memcached-client.php";
$mc = new memcached(
array(
'servers' => array('127.0.0.1:11211'),
'debug' => false,
'compress_threshold' => 10240,
'persistant' => true));
//添加 【這裏仍然支持添加 數組,對象,數值 】
if($mc->set('hsp1', "你好!北京!",60)){
echo "ok";
}else{
echo "fail!";
}
//獲取
$val=$mc->get("hsp1");
echo "<br/>"."val=$val";
//修改 直接使用set函數,就是 replace
if($mc->replace("hsp1","北京",30)){
echo "<br/>修改爲功!";
}else{
echo "<br/>修改fail!";
}
//獲取
$val=$mc->get("hsp1");
// echo "<br/>"."修改後 val=$val";
if(is_array($val)){
echo "<pre>";
print_r($val);
echo "</pre>";
}else if(is_float($val)){
echo "<br/>"."修改後 val=$val";
}else if(is_string($val)){
echo "<br/>"."修改後 val=$val";
}
//刪除
/* if($mc->delete("hsp1")){
echo "<br/>刪除成功!";
}else{
echo "<br/>刪除fail!";
}*/
u 關於memcache的機制
1. 是基於 c/s 2. 底層的協議是 普通文本
2. 是基於 libevent機制處理
3. memcache的數據是放在內存
4. memcache自己支持 LRU 算法
[算法/網絡/數據庫/操做系統+編譯原理 pl0[if + -]]
5. 基於客戶端分佈式.示意圖
u memcache細節
1. 生命週期
數據的生命週期是指定的,只有把數據放入就開始計時,只要時間到,就銷燬.
session(1440s) 若是你沒有關閉瀏覽器,而且沒有使用session 1440後銷燬
1439使用一次這個sesion ,又開始從新計時.
2. 如何把session 放入memcache服務器
sesion 垃圾回收的機率是 session.gc_probability/ session.gc_divisor
步驟
(1) 由於session 默認是放在文件中, windows下 c:/windows/Temp
(2) 從新配置php.ini 把關於session配置修
session.save_handler = memcache
; 修改路徑
session.save_path = "tcp://127.0.0.1:11211"
(3) 若是咱們不去修改php.ini 也達到這樣的效果
可使用 ini_set 函數來玩
代碼:
<?php
ini_set("session.save_handler","memcache");
ini_set("session.save_path","tcp://127.0.0.1:11211");
session_start();
$_SESSION['name']="shunping";
echo "<br/>存放sesionok";
echo "<br/>session_id=".session_id();
//取出
$val=$_SESSION['name'];
echo "<br/>session name=".$val;
(4) memcache是無用戶狀態,也就是說,是全部用戶共享的數據
(5) 安全性.
windows. 下咱們使用防火牆 同時 打開 80端口. , 只讓咱們本身 php程序去操做咱們的memached服務。這樣咱們的memcache就安全,
linux下 iptables -a input -p tcp -s 127.0.0.1 –dport 11211 -j ACCEPT
總結:
--我本身的一個小結如何決定是否使用memcached
--若是是一個小網站,pv(page view)值不大,就不考慮使用memcache了
--變化頻繁,查詢頻繁,可是不必定寫入數據庫(適合memcache)
--變化頻繁, 一變化就要入庫[好比股票,金融.](不適合memcache)
u memcache 和 session 對比
1. memcache 放入內存,session默認放入文件,可是經過配置,也能夠入memcached
2. 生命週期 (memcahce 數據一旦建立就開始時間,到時就銷燬 , session 建立後計時,可是若是在沒有成垃圾前,你又使用過一次,則從新計算)
3. 解決的問題不同 memcache爲了提高速度 , session 是用於追蹤用戶的行爲
相關技術 Redis 也是 key/value 一種緩存技術.