Memcache學習筆記

目錄索引:1.概念php

              2.安裝並使用memcachedmysql

              3.對memcached進行curd操做linux

              4.用memcache擴展操做Memcachedc++

              5.memcached機制深刻理解算法

              6.memcache的細節sql

1.概念數據庫

Memcached是一個高性能的分佈式的內存對象緩存系統,目前全世界很多人使用這個緩存項目來構建本身大負載的網站,來分擔數據庫的壓力,經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,而後從內存中讀取,從而大大提升讀取速度。相關網站:http://danga.com/ http://memcached.orgapache

2.安裝並使用memcachedwindows

(1).下載memcached軟件緩存

(2).運行cmd命令,切換到memcached.exe目錄,運行memecache.exe -d install

(3).啓動memcached

第一種方法:到【控制面板/服務】裏啓動

第二種方法:cmd到memcached目錄,運行memcached.exe -d start

(4)用netstat -an查看11211端口是否在監聽,若是在監聽,說明啓動成功。

(補充:1.用netstat -anb能夠看11211端口是哪一個程序在監聽,同時能夠看到那些用戶鏈接到咱們的服務器 2.有名的端口1-1024 apache:80 mysql:3306 ftp:21 ssh:22 oracle:1521 stmp:25)

3.使用telnet鏈接到memcached服務

telnet 127.0.0.1 11211

若是不能使用telnet命令,拷貝一個telnet.exe放到c:/windows/system32就OK。

(1) 增長

基本語法:add key名 0 (存放時間)數據大小

例:add key1 0 30 5

hello

(2)獲取

基本語法:get key名

例:get key1

(3)修改

方式1:set key名 0 存放時間 數據大小

方式2:replace key名 0 存放時間 數據大小

例:set key100 0 70 6

ssssss

(4)刪除

基本語法:delete key名

例:delete key300

(補充:1.查看狀態stats 命中率cmd_set/cmd_get 2.清空內存數據flush_all 3.操做Memcached命令:http://wenku.baidu.com/link?url=2roCXD80HRkrRZ9prNXvTOeI15Tl4-w8l-JoJUmzti0S_Mp0EQJwaouiYOoIK0-1zT2CZHN54XehrUFo6r9W8Aqka4NQ4LmcuWeLoqZ17sa

4.用memcache擴展操做Memcached

(1)安裝配置

①拷貝一個php_memcache.dll至php的ext目錄

②在php.ini開啓php_memcache.dll擴展

③重啓apache

(2)操做

代碼:

 1     //鏈接memcache服務器
 2     $mem = new Memcache();
 3     if(!$mem->connect('localhost',11211)) {
 4         die('connect error!');
 5     }
 6     //增長
 7     if($mem->set('key1','val1',MEMCACHE_COMPRESSED,60)) {
 8         echo 'add ok!';
 9     }
10     $arr = array('moushu','yunshu');
11     if($mem->set('arr',$arr,MEMCACHE_COMPRESSED,60)) {
12         echo 'add ok!';
13     }
14     class Dog {
15         public $name;
16         public $age;
17     }
18     $dog = new Dog();
19     if($mem->set('dog',$dog,MEMCACHE_COMPRESSED,60)) {
20         echo 'add ok!';
21     }
22     $null_val = null;
23     if($mem->set('null_val',$null_val,MEMCACHE_COMPRESSED,60)) {
24         echo 'add ok!';
25     }
26     $bool_val = null;
27     if($mem->set('bool_val',false,MEMCACHE_COMPRESSED,60)) {
28         echo 'add ok!';
29     }
30     $handle = fopen('2.php','a');
31     if($mem->set('res',$handle,MEMCACHE_COMPRESSED,60)) {
32         echo 'add res ok!';
33     }
34     if($mem->set('name','luoyunshu',MEMCACHE_COMPRESSED,30*3600*24)) {
35         echo 'add name ok!';
36     }  //存儲30天
37     if($mem->set('name2','moushu',MEMCACHE_COMPRESSED,time()+31*3600*24)) {
38         echo 'add name2 ok!';
39     }   //存儲31天
40    
41     //修改
42     if($mem->replace('key1','hello',MEMCACHE_COMPRESSED,60)) {
43         echo 'add ok!';
44     }
45     
46     //刪除
47     if($mem->delete('key1')) {
48         echo 'del ok!';
49     }
50     
51     //查詢
52     $val = $mem->get('key1');
53     echo $val;
54     $val = $mem->get('arr');
55     var_dump($val);
56     $dog = $mem->get('dog');   //取對象時要先聲明類定義
57     var_dump($dog);
58     $null_val = $mem->get('null_val');   
59     var_dump($null_val);  //null
60     $bool_val = $mem->get('bool_val');  
61     var_dump($bool_val);  //''
62     $res = $mem->get('res');
63     var_dump($res);   //0
64     $res = $mem->get('key1');
65     var_dump($res);   
66     $name = $mem->get('name');
67     var_dump($name); 
68     $name2 = $mem->get('name2');
69     var_dump($name2);   //moushu

 5.memcached機制深刻理解

(1)基於c/s架構 ,協議簡單

 ● c/s架構,此時memcached爲服務器端,咱們可使用如PHP,c/c++等程序鏈接memcached服務器。

 ● memcached的服務器客戶端通訊並不使用XML等格式,而使用簡單的基於文本行的協議。所以,經過telnet也能在memcached上保存數據、取得數據

 (2)基於libevent的事件處理

 ● libevent是一套跨平臺的事件處理接口的封裝,可以兼容包括這些操做系統: Windows/Linux/BSD/Solaris 等操做系統的的事件處理。

 ● Memcached 使用libevent來進行網絡併發鏈接的處理,可以保持在很大併發狀況下,仍舊可以保持快速的響應能力。

 (3)內置內存存儲方式

 ● 爲了提升性能,memcached中保存的數據都存儲在memcached內置的內存存儲空間中。因爲數據僅存在於內存中,所以重啓memcached、重啓操做系統會致使所有數據消失。另外,內容容量達到指定值以後,就基於LRU(Least Recently Used)算法自動刪除不使用的緩存。memcached自己是爲緩存而設計的服務器,所以並無過多考慮數據的永久性問題。

 (4)基於客戶端的分佈式

 ● memcached儘管是「分佈式」緩存服務器,但服務器端並無分佈式功能。各個memcached不會互相通訊以共享信息。

代碼:

 1     //鏈接memcache服務器,啓動兩個服務器 (memcached.exe -p 9999
 2     $mem = new Memcache();
 3     if(!$mem->addServer('localhost',11211)) {
 4         die('connect server1 error!');
 5     } //serv1
 6     if(!$mem->addServer('localhost',9999)) {
 7         die('connect server2 error!');
 8     } //serv2
 9     
10     //將數據放入哪一個memcache服務器,由客戶端的mem對象決定
11     //當執行addServer的時候,並非當即去鏈接mem服務,而是經過計算,hash後採起決定鏈接哪一個mem服務,所以當你大量加入服務器到鏈接池時並無多餘的開銷。
12     if($mem->set('key1','val1',MEMCACHE_COMPRESSED,120)) {
13         echo 'add key1 ok!';
14     } //放在serv1
15     if($mem->set('key2','val2',MEMCACHE_COMPRESSED,120)) {
16         echo 'add key2 ok!';
17     } //放在serv2
18     if($mem->set('key3','val3',MEMCACHE_COMPRESSED,120)) {
19         echo 'add key3 ok!';
20     } //放在serv1
21     
22     $res1 = $mem->get('key1');
23     $res2 = $mem->get('key2');
24     $res3 = $mem->get('key3');
25     echo $res1;
26     echo $res2;
27     echo $res3;

 6.memcache的細節
(1)生命週期

 從數據放入memcache開始計時,直到時間到了,就銷燬,若是時間爲0,則表示不過時。memcache的數據被銷燬狀況有:1.時間到了 ②重啓memcached服務 ③delete掉了

 (2)將session數據放入memcached

    ①.配置:

    第一種方法:修改php.ini文件,修改以下:

      save-handler=memcache

     session.save_path = "tcp://localhost:11211"

    第二種方法,使用ini_set()

    ini_set('session.save_handler','memcache');

    ini_set('session.save_path','tcp://localhost:11211');

    一些說明:memcached主要的目的是提速,數據不和用戶綁定(session數據存入memcache中以session id做爲鍵值,任何可訪問memcache的人均可以取到值)。session數據和用戶綁定,更安全。

 (3)memcached安全性

   經過啓用防火牆來防止外網訪問memcached服務,保證memcached的安全。linux系統設置防火牆的命令:iptables -a input -p tcp -s 127.0.0.1 -dport 11211 -j ACCEPT

 (4)樣的數據適合放入memcache中?

   變化頻繁,具備不穩定的數據,不須要實時入庫(好比用戶在線狀態、在線人數....),想加快用戶訪問應用的速度。大數據,如圖片、視頻不適合放入memcache中。

  到這,時間再完善.....

相關文章
相關標籤/搜索