memcache實戰

目錄

 

第一章 memcache的使用

1.1 添加key

1.2 刪除

第二章 編譯 PHP 及 memcached 擴展

1. 編譯 apache+php

第三章 memcached 實戰

1. 緩存數據庫查詢結果

2. 中繼 MySQL 主從延遲數據


第一章 memcache的使用

1.1 添加key

add key flag expire length 

//flag 標誌,要求爲一個正整數。memcached 基本文本協議,傳輸的東西,理解成字符串來存儲.
//expire 有效期。設置緩存的有效期,有 3 種格式:設置秒數, 從設定開始數,第 n 秒後失效;時間戳, 到指定的時間戳後失效;設爲 0. 不自動失效(有種誤會,設爲 0,永久有效.錯誤的)(編譯 memcached 時,指定一個最長常量,默認是 30 天.所以,即使設爲 0,30 天后也會失效.2:可能等不到 30 天,就會被新數據擠出去.)
//length 緩存的長度(字節爲單位)

想:讓你存一個 php 對象,和一個 php 數組,怎麼辦?
答:序列化成字符串,往出取的時候,自然還要反序列化成 對象/數組/json 格式等等.這時候, flag 的意義就體現出來了.比如, 1 就是字符串, 2 反轉成數組 3,反序列化對象…

1.2 刪除

delete key [time seconds] 

刪除指定的 key. 如加可選參數 time,則指刪除 key,並在刪除 key 後的 time 秒內,不允許 get,add,replace 操作此 key.

replace key flag expire length #替換 參數和 add 完全一樣,不單獨寫
get key #查詢 返回key的值
set key flag expire length #設置或修改值(集合了add 和 replace的功能)
incr/decr key int #增加/減少值的大小

注意:incr,decr 操作是把值理解爲 32 位無符號來±操作的. 值在[0-2^32-1]範圍內(應用場景------秒殺功能:一個人下單,要牽涉數據庫讀取,寫入訂單,更改庫存,及事務要求, 對於傳統型數據庫來說,壓力是巨大的.可以利用 incr/decr 功能, 在內存存儲 count 庫存量, 秒殺 1000 臺,每人搶單主要在內存操作,速度非常快,搶到 count<=1000 的號人,得一個訂單號,再去另一個頁面慢慢支付)

infos    #查詢memcache信息
stats [...]    #統計命令(把 memcached 當前的運行信息統計出來)

緩存有一個重要的概念: 命中率.
命中率是指: (查詢到數據的次數/查詢總數)*100%,如上, get_hits/(get_hits+get_misses) = 60+% , 的命中率.

flush_all #清空所有的存儲對象

第二章 編譯 PHP 及 memcached 擴展


1. 編譯 apache+php


到 http://httpd.apache.org 下載 httpd 的源碼,http://www.php.net 下載 php 的源碼

apache編譯:

tar zxvf http-2.2.45.tar.gz
# cd http-2.2.45
# ./configure --prefix=/usr/local/httpd (你也可以指定自己的路徑) #make && make install

php編譯並與apache整合

yum install libxml2 libxml2-devel
# tar zxvf php-xxx.tar.gz
# cd php-xxx #./configure--prefix=/usr/local/php \ --with-apxs2=/usr/local/httpd/bin/apxs # make && make install
# 2. 與 apache 整合
# vim 編輯 http.conf,添加如下
# addtype application/x-httpd-php .php 
# 3: 重啓 apache

(注:如果在 configure 過程中,提示缺少 libxml2 的庫,則如下操作:

yum install libxml2 libxml2-devel)

編譯 php-memcache 擴展
動手編譯 PHP 的各種擴展是很容易碰到,此以 memcache 擴展編譯爲例,
講解 PHP 擴展的通用編譯流程

# 1.到軟件的官方(如 memcached)或 pecl.php.net 去尋找擴展源碼並下載解壓 
# 2: 進入到 path/memcache 目錄 
# 3: 根據當前的 php 版本動態的創建擴展的 configure 文件
#/xxx/path/php/bin/phpize \ --with-php-config=/xxx/path/php/bin/php-config
#4: ./configure -with-php-config=/xxx/path/php/bin/php-config 5: make && make install
#6:把生成的.so 擴展, 在 php.ini 裏引入. 
#7:重啓 apache

windows 下安裝 php-memcached 擴展

  • 通過 phpinfo()觀察如下 3 個參數,即 php 版本, ts/nts, vc6/vc9
  • 根據上步中的參數,到 http://downloads.php.net/pierre/ 下載匹配的 memcache.dll
  • 再次觀察 phpinfo()信息,找出 extension_dir, 並把下載的 memcache.dll 放入該路徑.
  • 並修改 php.ini, 加入 extension=php_memcache.dll,引入該 dll
  • 重啓 apache

第三章 memcached 實戰


1. 緩存數據庫查詢結果


通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態 Web 應用的速度、提高可擴 (僞代碼如下)。

<?php
$sql = 'select goods_id,goods_name from ecs_goods where is_hot=1 limit 5';
// 判斷 memcached 中是否緩存熱門商品,如果沒有,則查詢數據庫 $hot = array();
if( !($hot=$memcache->get($sql)) ) { 
    $hot = $mysql->getAll($sql);
    echo '<font color="red">查詢自數據庫</font>'; //從數據庫取得數據後,把數據寫入 memcached
    $memcache->add($sql,$hot,0,300); // 並設置有效期 300 秒 } else {
    echo '<font color="red">查詢自 memcached</font>'; 
}

2. 中繼 MySQL 主從延遲數據


MySQL 在做 replication 時,主從複製之間必然要經歷一個複製過程,即主從延遲的時間.尤其是主從服務器處於異地機房時,這種情況更加明顯.
把 facebook 官方的一篇技術文章,其加州的主數據中心到弗吉尼亞州的主從同步延期達到70ms;在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章