NoSQL中的memcached
什麼是NoSQL
NoSQL(NoSQL = Not Only SQL ),意即”不僅僅是SQL”。
NoSQL,泛指非關係型的數據庫。隨着互聯網web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的數據庫則由於其本身的特點得到了非常迅速的發展。NoSQL數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。
雖然NoSQL流行語火起來才短短一年的時間,但是不可否認,現在已經開始了第二代運動。儘管早期的堆棧代碼只能算是一種實驗,然而現在的系統已經更加的成熟、穩定。不過現在也面臨着一個嚴酷的事實:技術越來越成熟——以至於原來很好的NoSQL數據存儲不得不進行重寫,也有少數人認爲這就是所謂的2.0版本。這裏列出一些比較知名的工具,可以爲大數據建立快速、可擴展的存儲庫。
一、什麼是memcache
你可以把它想象成一張單表
名字 | 數據類型 |
---|---|
key | varchar(255) |
value | text |
MemCache和MemCached的區別:
1、MemCache是項目的名稱
2、MemCached是MemCache服務器端可以執行文件的名稱
二、Memcached使用場景
1、非持久化存儲:對數據存儲要求不高
2、分佈式存儲:不適合單機使用。儘量不要和數據庫放置同一臺機器
3、key/value存儲:格式簡單,不支持List、Array數據格式
安裝和啓動memcached
安裝
1、lnmp一鍵包環境
cd lnmp1.3-full/
./addons.sh uninstall memcached
2、手動安裝
【編譯】
yum install libevent libevent-devel
wget http://pecl.php.net/get/memcache-2.2.5.tgz
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
// 編譯安裝 要指向你的php安裝目錄的配置文件
./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config
make && make install
有可能需要安裝
【安裝telnet】
yum install telnet-server 安裝telnet服務
yum install telnet.* 安裝telnet客戶端
檢查運行的進程
ps -ef | grep memcached
啓動
lnmp一鍵安裝包 默認隨機啓動
#find / -name memcached //找到memcached路徑
#/usr/local/memcached/bin/memcached -p 11211 -m 64m -c 1024 -u root -d
- d 守護進程,默默的在後臺運行
-l 設置監聽的 IP 地址,如果是本機的話,通常可以不設置此參數
-p 端口11211
-m 設置 memcached 可以使用的內存大小,單位爲 M
-c 最大運行的併發連接數,默認爲1024
-u 指定用戶,如果當前爲 root 的話,需要使用此參數指定用戶
MemCache指令
命 令 | 作 用 |
---|---|
get | 返回Key對應的Value值 |
add | 添加一個Key值,沒有則添加成功並提示STORED,有則失敗並提示NOT_STORED |
set | 無條件地設置一個Key值,沒有就增加,有就覆蓋,操作成功提示STORED |
replace | 按照相應的Key值替換數據,如果Key值不存在則會操作失敗 |
stats | 返回MemCache通用統計信息(下面有詳細解讀) |
stats items | 返回各個slab中item的數目和最老的item的年齡(最後一次訪問距離現在的秒數) |
stats slabs | 返回MemCache運行期間創建的每個slab的信息(下面有詳細解讀) |
version | 返回當前MemCache版本號 |
flush_all | 清空所有鍵值,但不會刪除items,所以此時MemCache依舊佔用內存 |
quit | 關閉連接 |
PHP結合memcached實例
//包含 memcached 類文件
require_once('memcached-client.php');
//選項設置
$options = array(
'servers' => array('192.168.1.1:11211'), //memcached 服務的地址、端口,可用多個數組元素表示多個 memcached 服務
'debug' => true, //是否打開 debug
'compress_threshold' => 10240, //超過多少字節的數據時進行壓縮
'persistant' => false //是否使用持久連接
);
//創建 memcached 對象實例
$mc = new memcached($options);
//設置此腳本使用的唯一標識符
$key = 'mykey';
//往 memcached 中寫入對象
$mc->add($key, 'some random strings');
$val = $mc->get($key);
echo "n".str_pad('$mc->add() ', 60, '_')."n";
var_dump($val);
//替換已寫入的對象數據值
$mc->replace($key, array('some'=>'haha', 'array'=>'xxx'));
$val = $mc->get($key);
echo "n".str_pad('$mc->replace() ', 60, '_')."n";
var_dump($val);
//刪除 memcached 中的對象
$mc->delete($key);
$val = $mc->get($key);
echo "n".str_pad('$mc->delete() ', 60, '_')."n";
var_dump($val);
做數據庫查詢緩存
$sql = 'SELECT * FROM users';
$key = md5($sql); //memcached 對象標識符
if ( !($datas = $mc->get($key)) ) {
//在 memcached 中未獲取到緩存數據,則使用數據庫查詢獲取記錄集。
echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";
$conn = mysql_connect('localhost', 'test', 'test');
mysql_select_db('test');
$result = mysql_query($sql);
while ($row = mysql_fetch_object($result))
$datas[] = $row;
// 將數據庫中獲取到的結果集數據保存到 memcached 中,以供下次訪問時使用。
$mc->add($key, $datas);
} else {
echo "n".str_pad('Read datas from memcached.', 60, '_')."n";
}
var_dump($datas);