Memcached數據操做

[toc]
#php

1、memcached數據的導入和導出

Memcached相似於mysql同樣,一樣支持相似於mysql中建立一個庫,建立一個表,插入一個表,查看錶數據等。html

1.1 登陸 Memcached

[root@xavi ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

1.2 基礎操做

手動存儲一個數據:
set key2 0 30 2

其中key2 表明着 key值
0表明着 flags 標記
30表明着 過時時間
2表明着 2個字節

set 根據最後面的數值 輸入2 即只能夠存儲2個字節,輸入3只能夠存儲3個字節。

set key2 0 30 2
abc
CLIENT_ERROR bad data chunk
ERROR
12
ERROR
set key1 0 20 3
abc
STORED

使用 get 查詢存儲值

set key1 0 30 3  
cds
STORED
get key1  //注意這裏設定的過時時間是30秒,要再過時前查詢有效
VALUE key1 0 3
cds
END

1.3 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> 是一個16位的無符號的整數(以十進制的方式表示)。該標誌將和須要存儲的數據一塊兒存儲,並在客戶端get數據時返回。客戶端能夠將此標誌用作特殊用途,此標誌對服務器來講是不透明的。
  • <exptime> 爲過時的時間。若爲0表示存儲的數據永遠不過時(但可被服務器算法:LRU 等替換)。若是非0(unix時間或者距離此時的秒數),當過時後,服務器能夠保證用戶得不到該數據(以服務器時間爲標準)。
  • <bytes> 須要存儲的字節數,當用戶但願存儲空數據時<bytes>能夠爲0
  • <data block>須要存儲的內容,輸入完成後,最後客戶端須要加上\r\n(直接點擊Enter)做爲結束標誌。
示例展現:(在telnet模式下,使用「Ctrl + delete鍵刪除」)

set key3 1 100 4    //存儲一個4字節值
abcd
STORED
get key3            //查詢key3的值
VALUE key3 1 4
abcd
END
replace key3 1 200 5        //替換key3的值
abcdx
STORED
get key3        //查詢替換後的值
VALUE key3 1 5
abcdx
END
delete key3     //刪除key3的值
DELETED
get key3
END

2、Memcached數據導出和導入

隨意創建幾條數據mysql

set name 1 0 6
xavier
STORED
set age 1 0 2
20
STORED
set k1 1 0 5   
12345
STORED

memcached退出

按下"ctrl+]" ,而後輸入quitnginx

2.1 memcached數據導出

首先查看下以前的操做web

cmd_get和cmd_set算法

mark

[root@xavi ~]# memcached-tool 127.0.0.1:11211 dump
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 3
Dumping bucket 1 - 3 total items
add k1 1 1527337188 5
12345
add name 1 1527337188 6
xavier
add age 1 1527337188 2
20
[root@xavi ~]# memcached-tool 127.0.0.1:11211 dump >data.txt //能夠把導出數據重定向到txt文檔中
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 3
Dumping bucket 1 - 3 total items
[root@xavi ~]# cat data.txt
add k1 1 1527337188 5
12345
add name 1 1527337188 6
xavier
add age 1 1527337188 2
20

2.2 導入:nc 127.0.0.1 11211 < data.txt

若nc命令不存在,yum install ncsql

  • [ ] 注意:導出的數據是帶有一個時間戳的,這個時間戳就是該條數據過時的時間點,若是當前時間已經超過該時間戳,那麼是導入不進去的。vim

  • [ ] 若是僅僅是爲了測試,這樣能夠辦到,由於memcached是緩存在內存中的,只要重啓機器或者重啓memcached服務緩存數據就會丟失,而後咱們再次使用nc 導入就能夠了 ↓
[root@xavi ~]# systemctl restart memcached
[root@xavi ~]# nc 127.0.0.1 11211 < data.txt
STORED
STORED
STORED

3、 php鏈接memcached

3.1 先安裝php的memcache擴展

[root@xavi ~]# cd /usr/local/src
[root@xavi src]# wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz 
[root@xavi src]# tar zxf memcache-2.2.3.tgz
[root@xavi src]# cd memcache-2.2.3
[root@xavi memcache-2.2.3]# /usr/local/php-fpm/bin/phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226

執行配置文件並編譯windows

./configure --with-php-config=/usr/local/php-fpm/bin/php-config
[root@xavi memcache-2.2.3]# make
[root@xavi memcache-2.2.3]# make install
Installing shared extensions:     /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/

查看生成的so文件數組

[root@xavi memcache-2.2.3]# ls /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
memcache.so  opcache.a  opcache.so

3.2 而後修改php.ini

vim /usr/local/php-fpm/etc/php.ini 
添加一行:
extension="memcache.so"

mark

3.3 檢查:

/usr/local/php-fpm/sbin/php-fpm -m
發現已經出現了 memcache 模塊

mark

3.4 測試:

編輯測試腳本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();
?>

----------------------------
如上腳本意爲:

鏈接memcache  set一個數據, 保存 替換刪除 關閉 等。

執行這個php文件腳本

[root@xavi memcache-2.2.3]# cd
[root@xavi ~]# vim 1.php
[root@xavi ~]# /usr/local/php-fpm/bin/php 1.php
Get key1 value: This is first value<br>Get key1 value: This is replace value<br>Get key2 value: Array
(
    [0] => aaa
    [1] => bbb
    [2] => ccc
    [3] => ddd
)
<br>Get key1 value: <br>Get key2 value: <br>

4、memcached中存儲session

本節應用場景爲LNMP架構下作的負載均衡。假如第一次登陸是在A服務器上,第二次登陸是在B服務器上,假如使用的是nginx代理upstream可使用ip_hash;若是使用LVS呢?解決方法是:把session不存在服務器的磁盤上,而是存在memcached上去。memcached做爲一個公共的服務器,任何web服務器均可以鏈接!

  • 本實例是在lamp/lnmp環境下實現
編輯php.ini添加兩行(待測試)
vim /usr/local/php-fpm/etc/php.ini
session.save_handler = memcache 
session.save_path = "tcp://192.168.0.9:11211"

或者httpd.conf中對應的虛擬主機中添加
php_value session.save_handler "memcache" 
php_value session.save_path "tcp://192.168.0.9:11211"

或者php-fpm.conf對應的pool中添加
php_value[session.save_handler] = memcache
php_value[session.save_path] = "tcp://192.168.0.9:11211 "

4.1 下載測試文件

[root@xavi ~]# cat .mem_se.txt
<?php 
session_start(); 
if (!isset($_SESSION['TEST'])) { 
$_SESSION['TEST'] = time(); 
} 
$_SESSION['TEST3'] = time(); 
print $_SESSION['TEST']; 
print "<br><br>"; 
print $_SESSION['TEST3']; 
print "<br><br>"; 
print session_id(); 
?>

打開php.ini文件,查找session
mark

將其移動到虛擬主機目錄中:

如何找到虛擬主機的目錄呢

vim /usr/local/nginx/conf/vhost/aaa.com.conf

server
{
    listen 80 default_server;
    server_name aaa.com;
    index index.html index.htm index.php;
    root /data/nginx/default; //這是root路徑
location ~ \.php$
      {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/xavi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/nginx/default$fastcgi_script_name;
      }
}
[root@xavi ~]# mv /root/.mem_se.txt /data/wwwroot/www.dsf.com

[root@xavi ~]# cd /data/wwwroot/www.dsf.com/

[root@xavi www.dsf.com]# cp .mem_se.txt 1.php

cp .mem_se.txt 1.php

未能驗證成功,待查明緣由

相關文章
相關標籤/搜索