21.1 Nosql介紹
21.2 memrcached介紹
21.3 安裝memcached
21.4 檢視memcachedq狀态
21.5 memcached指令行
21.6 memcached資料導出和導入
21.7 php連接配接memcached
21.8 memcached中存儲sessions
一、Nosql介紹
非關系型資料庫就是NoSQL,關系型資料庫代表MySQL
對于關系型資料庫來說,是需要把資料存儲到庫、表、行、字段裡,查詢的時候根據條件一行一行地去比對,當量非常大的時候就很耗費時間和資源,尤其是資料是需要從磁盤裡去檢索
NoSQL資料庫存儲原理非常簡單(典型的資料類型為k-v),不存在繁雜的關系鍊,比如mysql查詢的時候,需要找到對應的庫、表(通常是多個表)以及字段。
NoSQL資料存儲在記憶體裡,查詢速度非常快
NoSQL在性能表現上雖然能優于關系型資料庫,但是它并不能完全替代關系型資料庫
NoSQL因為沒有複雜的資料結構,擴充非常容易,支援分布式
常見NoSQL資料庫
k-v形式的:memcached、redis 适合儲存使用者資訊,比如會話、配置檔案、參數、購物車等等。這些資訊一般都和ID(鍵)挂鈎,這種情景下鍵值資料庫是個很好的選擇。 k->key v->value
文檔資料庫:mongodb 将資料以文檔的形式儲存。每個文檔都是一系列資料項的集合。每個資料項都有一個名稱與對應的值,值既可以是簡單的資料類型,如字元串、數字和日期等;也可以是複雜的類型,如有序清單和關聯對象。資料存儲的最小機關是文檔,同一個表中存儲的文檔屬性可以是不同的,資料可以使用XML、JSON或者JSONB等多種形式存儲。
列存儲 Hbase
圖 Neo4J、Infinite Graph、OrientDB(了解)
二、memcached介紹
Memcached是國外社群網站LiveJournal團隊開發,目的是為了通過緩存資料庫查詢結果,減少資料庫通路次數,進而提高動态web站點性能。
官方站點 http://www.memcached.org/
資料結構簡單(k-v),資料存放在記憶體裡
多線程
基于c/s架構,協定簡單
基于libevent的事件處理
自主記憶體存儲處理(slab allowcation)
資料過期方式:Lazy、 Expiration 和 LRU
Memcached的資料流向
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5SOwMTNkBDOkF2YwMmYlFDM4cDNxQTNyMmM5IWNhhjZ2QmMj9CX0VmbjN3bvwFdl5mLh5WaoN2cv5yZtl2Yz92Lc9CX6MHc0RHaiojIsJye.jpg)
Slab allocation
Slab Allocation的原理
将配置設定的記憶體分割成各種尺寸的塊(chunk), 并把尺寸相同的塊分成組(chunk的集合),每個chunk集合被稱為slab。
Memcached的記憶體配置設定以Page為機關,Page預設值為1M,可以在啟動時通過-I參數來指定。
Slab是由多個Page組成的,Page按照指定大小切割成多個chunk。
chunk 最小的單元
page中包含了多個chunk
slab中包含了多個page
chunk < page < slab
Growth factor(生長因子),控制chunk大小
Memcached在啟動時通過-f選項可以指定 Growth Factor因子。該值控制chunk大小的差異。預設值為1.25。
通過memcached-tool指令檢視指定Memcached執行個體的不同slab狀态,可以看到各Item所占大小(chunk大小)差距為1.25
指令:# memcached-tool 127.0.0.1:11211 display
Memcached的資料過期方式
Lazy Expiration :
Memcached 内部不會監視記錄是否過期,而是在get時檢視記錄的時間戳,檢查記錄是否過期。這種技術被稱為lazy(惰性)expiration。是以,Memcached不會在過期監視上耗費CPU時間。
LRU :
Memcached會優先使用已逾時的記錄的空間,但即使如此,也會發生追加新記錄時空間不足的情況,此時就要使用名為Least Recently Used(LRU)機制來配置設定空間。顧名思義,這是删除“最近最少使用”的記錄的機制。是以,當記憶體空間不足時(無法從slab class擷取到新的空間時),就從最近未被使用的記錄中搜尋,并将其空間配置設定給新的記錄。從緩存的實用角度來看,該模型十分理想。
三、安裝memcached
memcached 是基于 libevent的,需要先安裝libevent
rpm -qa libevent 檢視已經安裝
安裝 yum install -y memcached
啟動 systemctl start memcached
預設監聽11211端口
更改memcached的啟動選項:
方法一:
/usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024 通過指令行,編輯參數啟動
方法二:
vim /etc/sysconfig/memcached 可以配置參數
可以加上監聽的ip,可以把OPTIONS="" 改為OPTIONS="127.0.0.1"
memcached的常用選項:
其中-m指定memcached配置設定記憶體
-c指定最大并發數
-u指定運作memcached服務的使用者
四、檢視memcached狀态
檢視Memcached運作狀态,使用memcached-tool
memcached-tool 127.0.0.1:11211 stats
需要關注的兩條:
get_hits
curr_items 目前存在memcached中的項目有多少,命中了多少
使用get_hits除以curr_items可以計算出命中率
或者使用 :
echo stats |nc 127.0.0.1 11211
需要安裝nc工具 yum install -y nc
如果安裝libmemcached後,可以使用指令: yum install -y libmemcached
memstat --servers=127.0.0.1:11211 檢視memcached服務狀态
五、memcached指令行
telnet 127.0.0.1 11211 連接配接
ctrl ] 退出
set key2 0 30 2 set用來存儲資料,key2是key的名字(可以自定義),30代表過期時間(機關秒), 2表示要存的數值為2個位元組
get key2 擷取數值是否存儲成功使用get 加 key的名字
如果定義了3個位元組,但是輸入了兩個位元組,會報錯
replace key3 1 0(永遠不過期) 5 替換
delete key3 删除
Memcached文法規則
<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n
注:\r\n在windows下是Enter鍵
<command name> 可以是set, add, replace
set表示按照相應的<key>存儲該資料,沒有的時候增加,有的時候覆寫
add表示按照相應的<key>添加該資料,但是如果該<key>已經存在則會操作失敗
replace表示按照相應的<key>替換資料,但是如果該<key>不存在則操作失敗。
<key> 用戶端需要儲存資料的key
<flags> (即上面key名稱後面的0)是一個16位的無符号的整數(以十進制的方式表示)。該标志将和需要存儲的資料一起存儲,并在用戶端get資料時傳回。用戶端可以将此标志用做特殊用途,此标志對伺服器來說是不透明的。
<exptime> 為過期的時間。若為0表示存儲的資料永遠不過期(但可被伺服器算法:LRU 等替換)。如果非0(unix時間或者距離此時的秒數),當過期後,伺服器可以保證使用者得不到該資料(以伺服器時間為标準)。
<bytes> 需要存儲的位元組數,當使用者希望存儲空資料時<bytes>可以為0
<data block>需要存儲的内容,輸入完成後,最後用戶端需要加上\r\n(直接點選Enter)作為結束标志。
六、memcached資料導出和導入
重新開機時,會情況memcached中的資料,此時最好把資料導出
memcached-tool 127.0.0.1:11211 dump > data.txt 導出到data.txt檔案中
導入:
nc 127.0.0.1 11211 < data.txt 注意是否需要加:
memcached在資料導出的那一刻,就已經過期了
注意:導出的資料是帶有一個時間戳的,這個時間戳就是該條資料過期的時間點,如果目前時間已經超過該時間戳,那麼是導入不進去的
七、PHP連接配接Memcached
先安裝php的memcache擴充
cd /usr/local/src/
源碼包下載下傳: wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
tar zxvf memcache-2.2.3.tgz
cd memcache-2.2.3
生成configure檔案: /usr/local/php-fpm/bin/phpize
./configure --with-php-config=/usr/local/php-fpm/bin/php-config
make && make install
安裝完後會有類似這樣的提示:Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
然後修改vim /usr/local/php-fpm/etc/php.ini 添加一行 : extension="memcache.so“
檢查 /usr/local/php/bin/php-fpm -m
下載下傳測試腳本 :
curl www.apelearn.com/study_v2/.memcache.txt > 1.php 2>/dev/null
1.php内容:
<?php
//連接配接Memcache Memcache
$mem = new Memcache;
$mem->connect("localhost", 11211);
//儲存資料
$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br>";
//替換資料
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";
//儲存數組資料
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
//删除資料
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";
//清除所有資料
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
//關閉連接配接
$mem->close();
?>
執行腳本
/usr/local/php-fpm/bin/php 1.php
或者将1.php放到某個虛拟主機根目錄下面,在浏覽器通路,即可看到效果
最終可以看到資料如下:
[0] => aaa
[1] => bbb
[2] => ccc
[3] => ddd
八、memcached中存儲session
本執行個體是在lamp/lnmp環境下實作
編輯 vim /usr/local/php-fpm/etc/php.ini 添加兩行
預設以檔案形式存儲(預設放在tmp)
下載下傳一個存儲seesion的php腳本:
wget http://study.lishiming.net/.mem_se.txt
進入到nginx的虛拟主機目錄
把剛剛下載下傳的檔案移動過來,改名: mv /root/.mem_se.txt 123.php
curl localhost/123.php 生成session檔案,執行一次,随機生成一次
不需要session存在tmp下的設定:
三種方法,進行測試:
(一)
php-fpm.conf對應的pool中添加
php_value[session.save_handler] = memcache
php_value[session.save_path] = " tcp://192.168.183.3:11211"
重新開機php : /etc/init.d/php-fpm restart
curl localhost/123.php 正常的會有後面的數值,也是key的名稱
telnet 127.0.0.1 11211 連接配接
get p7g6tggmo6l9goghk414d6h0a0 使用get檢視
或者:
(二)
注釋:;session.save_handler = files
指定存儲類型 : session.save_handler = memcache
指定memcached的伺服器的ip和端口 : session.save_path = "tcp://192.168.183.3:11211"
重新開機php : /etc/init.d/php-fpm restart
rm -rf /tmp/sess_* 把剛才在tmp目錄下測試的檔案删除
在生成session檔案,此時tmp下沒有
或者:
(三)
httpd.conf中對應的虛拟主機中添加
php_value session.save_handler "memcache"
php_value session.save_path "tcp://192.168.183.3:11211"
轉載于:https://my.oschina.net/u/4093217/blog/3072408