非關係數據庫一Memcached

第三十四課 非關係數據庫一Memcached

目錄
1、nosql介紹
2、memrcached介紹
3、安裝memcached
4、查看memcachedq狀態
5、memcached命令行
6、memcached數據導出和導入
7、php鏈接memcached
8、memcached中存儲sessionsphp


1、nosql介紹

非關係型數據庫就是NoSQL,關係型數據庫表明MySQLhtml

對於關係型數據庫來講,是須要把數據存儲到庫、表、行、字段裏,查詢的時候根據條件一行一行地去匹配,當量很是大的時候就很耗費時間和資源,尤爲是數據是須要從磁盤裏去檢索mysql

NoSQL數據庫存儲原理很是簡單(典型的數據類型爲k-v),不存在繁雜的關係鏈,好比mysql查詢的時候,須要找到對應的庫、表一般是多個表)以及字段。nginx

NoSQL數據能夠存儲在內存裏,查詢速度很是快web

NoSQL在性能表現上雖然能優於關係型數據庫,可是它並不能徹底替代關係型數據庫redis

NoSQL由於沒有複雜的數據結構,擴展很是容易,支持分佈式sql

常見NoSQL數據庫mongodb

k-v形式的:memcached、redis 適合儲存用戶信息,好比會話、配置文件、參數、購物車等等。這些信息通常都和ID(鍵)掛鉤,這種情景下鍵值數據庫是個很好的選擇。數據庫

文檔數據庫:mongodb 將數據以文檔的形式儲存。每一個文檔都是一系列數據項的集合。每一個數據項都有一個名稱與對應的值,值既能夠是簡單的數據類型,如字符串、數字和日期等;也能夠是複雜的類型,若有序列表和關聯對象。數據存儲的最小單位是文檔,同一個表中存儲的文檔屬性能夠是不一樣的,數據可使用XML、JSON或者JSONB等多種形式存儲。vim

列存儲 Hbase

圖形關係存儲 Neo4J、Infinite Graph、OrientDB


2、memrcached介紹

Memcached是國外社區網站LiveJournal團隊開發,目的是爲了經過緩存數據庫查詢結果,減小數據庫訪問次數,從而提升動態web站點性能。

官方站點 http://www.memcached.org/

數據結構簡單(k-v),數據存放在內存裏

多線程

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

基於libevent的事件處理

自主內存存儲處理(slab allowcation)

數據過時方式:Lazy Expiration 和 LRU

memcached數據流向

Slab Allocation的原理

將分配的內存分割成各類尺寸的塊(chunk), 並把尺寸相同的塊分紅組(chunk的集合),每一個chunk集合被稱爲slab。

Memcached的內存分配以Page爲單位,Page默認值爲1M,能夠在啓動時經過-I參數來指定。

Slab是由多個Page組成的,Page按照指定大小切割成多個chunk。

Memcached在啓動時經過-f選項能夠指定 Growth Factor因子。該值控制chunk大小的差別。默認值爲1.25。

經過memcached-tool命令查看指定Memcached實例的不一樣slab狀態,能夠看到各Item所佔大小(chunk大小)差距爲1.25

命令:# memcached-tool 127.0.0.1:11211 display

Lazy Expiration

Memcached 內部不會監視記錄是否過時,而是在get時查看記錄的時間戳,檢查記錄是否過時。這種技術被稱爲lazy(惰性)expiration。所以,Memcached不會在過時監視上耗費CPU時間。

LRU

Memcached會優先使用已超時的記錄的空間,但即便如此,也會發生追加新記錄時空間不足的狀況,此時就要使用名爲Least Recently Used(LRU)機制來分配空間。顧名思義,這是刪除「最近最少使用」的記錄的機制。所以,當內存空間不足時(沒法從slab class獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。從緩存的實用角度來看,該模型十分理想。


3、安裝memcached

1.安裝memcached,libmemcached,libevent

[root@lanquark sh]# yum install -y memcached libmemcached libevent
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink                                                                                                                              | 6.8 kB  00:00:00 
...中間略...
Installed:
libevent.x86_64 0:2.0.21-4.el7   libmemcached.x86_64 0:1.0.16-5.el7    memcached.x86_64 0:1.4.15-10.el7_3.1                     
Complete!

2.啓動memcached服務

[root@lanquark sh]# systemctl start memcached.service
[root@lanquark sh]# systemctl status memcached.service
[root@lanquark sh]# systemctl enable memcached.service

3.編譯memcached配置文件

vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
#測試環境設爲127.0.0.1
OPTIONS="127.0.0.1"

4.重啓memcached服務

[root@lanquark sh]# systemctl restart memcached.servicec


4、查看memcached狀態

1.用memcached-tool查看

[root@lanquark sh]# memcached-tool 127.0.0.1:11211 stats 
#127.0.0.1:11211   Field       Value
         accepting_conns           1
               auth_cmds           0
             auth_errors           0
                   bytes           0
              bytes_read           7
           bytes_written           0
              cas_badval           0
                cas_hits           0
              cas_misses           0
               cmd_flush           0
                 cmd_get           0
                 cmd_set           0
               cmd_touch           0
             conn_yields           0
   connection_structures          11
        curr_connections          10
              curr_items           0
               decr_hits           0
             decr_misses           0
             delete_hits           0
           delete_misses           0
       evicted_unfetched           0
               evictions           0
       expired_unfetched           0
                get_hits           0
              get_misses           0
              hash_bytes      524288
       hash_is_expanding           0
        hash_power_level          16
               incr_hits           0
             incr_misses           0
                libevent 2.0.21-stable
          limit_maxbytes    67108864
     listen_disabled_num           0
                     pid       12641
            pointer_size          64
               reclaimed           0
            reserved_fds          20
           rusage_system    0.012032
             rusage_user    0.004812
                 threads           4
                    time  1534868520
       total_connections          11
             total_items           0
              touch_hits           0
            touch_misses           0
                  uptime          90
                 version      1.4.15

2.nc工具查看,若是沒有nc,能夠用yum安裝

[root@lanquark sh]# rpm -q nc
package nc is not installed

[root@lanquark sh]# yum -y install nc
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * epel: mirrors.tongji.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package nmap-ncat.x86_64 2:6.40-13.el7 will be installed
--> Processing Dependency: libpcap.so.1()(64bit) for package: 2:nmap-ncat-6.40-13.el7.x86_64
--> Running transaction check
---> Package libpcap.x86_64 14:1.5.3-11.el7 will be installed
--> Finished Dependency Resolution
...中間略...
Installed:
  nmap-ncat.x86_64 2:6.40-13.el7                                                                                                                                         
Dependency Installed:
  libpcap.x86_64 14:1.5.3-11.el7                                                                                                                                         
Complete!

Complete!
[root@lanquark sh]# echo stats |nc 127.0.0.1 11211
STAT pid 12641
STAT uptime 30508
STAT time 1534898938
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 1.488076
STAT rusage_system 0.930047
STAT curr_connections 10
STAT total_connections 12
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 13
STAT bytes_written 1024
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END

3.經過memstat查看

#若是沒有memstat命令,需安裝libmemcached
[root@lanquark sh]# memstat --servers=127.0.0.1:11211 
Server: 127.0.0.1 (11211)
         pid: 12641
         uptime: 30985
         time: 1534899415
         version: 1.4.15
         libevent: 2.0.21-stable
         pointer_size: 64
         rusage_user: 1.523973
         rusage_system: 0.931317
         curr_connections: 10
         total_connections: 13
         connection_structures: 11
         reserved_fds: 20
         cmd_get: 0
         cmd_set: 0
         cmd_flush: 0
         cmd_touch: 0
         get_hits: 0
         get_misses: 0
         delete_misses: 0
         delete_hits: 0
         incr_misses: 0
         incr_hits: 0
         decr_misses: 0
         decr_hits: 0
         cas_misses: 0
         cas_hits: 0
         cas_badval: 0
         touch_hits: 0
         touch_misses: 0
         auth_cmds: 0
         auth_errors: 0
         bytes_read: 30
         bytes_written: 2071
         limit_maxbytes: 67108864
         accepting_conns: 1
         listen_disabled_num: 0
         threads: 4
         conn_yields: 0
         hash_power_level: 16
         hash_bytes: 524288
         hash_is_expanding: 0
         bytes: 0
         curr_items: 0
         total_items: 0
         expired_unfetched: 0
         evicted_unfetched: 0
         evictions: 0
         reclaimed: 0


5、memcached命令行

1.鏈接memcached

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

2.set 命令用於將 value(數據值) 存儲在指定的 key(鍵) 中。

[root@lanquark sh]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set key2 0 30 2
ab
STORED
get key2
VALUE key2 0 2
ab
END
^]

基礎語法:
set key flags exptime bytes [noreply] 
value 

參數說明以下:

key:鍵值 key-value 結構中的 key,用於查找緩存值。

flags:能夠包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息。

exptime:在緩存中保存鍵值對的時間長度(以秒爲單位,0 表示永遠)

bytes:在緩存中存儲的字節數

noreply(可選): 該參數告知服務器不須要返回數據

value:存儲的值(始終位於第二行)(可直接理解爲key-value結構中的value)

3.add 命令用於將 value(數據值) 存儲在指定的 key(鍵) 中。

[root@lanquark sh]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
add new_key 0 900 10
data_value
STORED

基本語法:
add key flags exptime bytes [noreply]
value

參數說明以下:

key:鍵值 key-value 結構中的 key,用於查找緩存值。

flags:能夠包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息。

exptime:在緩存中保存鍵值對的時間長度(以秒爲單位,0 表示永遠)

bytes:在緩存中存儲的字節數

noreply(可選): 該參數告知服務器不須要返回數據

value:存儲的值(始終位於第二行)(可直接理解爲key-value結構中的value)

4.replace 命令用於替換已存在的 key(鍵) 的 value(數據值)。
若是 key 不存在,則替換失敗,而且您將得到響應 NOT_STORED。

[root@lanquark sh]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
add mykey 0 900 10
data_value
STORED
get mykey
VALUE mykey 0 10
data_value
END
replace mykey 0 900 16
some_other_value  
STORED
get mykey
VALUE mykey 0 16
some_other_value
END

基本語法:
replace key flags exptime bytes [noreply]
value

參數說明以下:

key:鍵值 key-value 結構中的 key,用於查找緩存值。

flags:能夠包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息。

exptime:在緩存中保存鍵值對的時間長度(以秒爲單位,0 表示永遠)

bytes:在緩存中存儲的字節數

noreply(可選): 該參數告知服務器不須要返回數據

value:存儲的值(始終位於第二行)(可直接理解爲key-value結構中的value)

5.append 命令用於向已存在 key(鍵) 的 value(數據值) 後面追加數據 。

[root@lanquark sh]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set runoob 0 900 9
memcached
STORED
get runoob 
VALUE runoob 0 9
memcached
END
append runoob 0 900 5
redis
STORED
get runoob
VALUE runoob 0 14
memcachedredis
END

基本語法:
append key flags exptime bytes [noreply]
value

參數說明以下:

key:鍵值 key-value 結構中的 key,用於查找緩存值。

flags:能夠包括鍵值對的整型參數,客戶機使用它存儲關於鍵值對的額外信息。

exptime:在緩存中保存鍵值對的時間長度(以秒爲單位,0 表示永遠)

bytes:在緩存中存儲的字節數

noreply(可選): 該參數告知服務器不須要返回數據

value:存儲的值(始終位於第二行)(可直接理解爲key-value結構中的value)


6、memcached數據導出和導入

1.memcached數據導出

[root@lanquark sh]# memcached-tool 127.0.0.1:11211 dump > data.txt
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 3
Dumping bucket 1 - 3 total items
[root@lanquark sh]# cat data.txt 
add mykey 0 1534901468 16
some_other_value
add new_key 0 1534901149 10
data_value
add runoob 0 1534901739 14
memcachedredis

2.memcached數據的導入

[root@lanquark sh]# nc 127.0.0..1 11211 < data.txt 
Ncat: Could not resolve hostname "127.0.0..1": Name or service not known. QUITTING.
[root@lanquark sh]# nc 127.0.0.1 11211 < data.txt  
NOT_STORED
STORED
NOT_STORED
[root@lanquark sh]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
#new_key過時,因此查不到數據
get new_key
END
#runoob值未過時
get runoob
VALUE runoob 0 14
memcachedredis
END


7、php鏈接memcached

1.安裝php的memcached的擴展

#下載memcache插件
root@lanquark src]# wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
#解壓軟件包
[root@lanquark src]# tar -zxvf memcache-2.2.3.tgz 

[root@lanquark src]# cd memcache-2.2.3/
[root@lanquark memcache-2.2.3]# /usr/local/php-fpm/bin/phpize

./configure --with-php-config=/usr/local/php-fpm/bin/php-config

[root@lanquark memcache-2.2.3]# make && make install
...略...
Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
#編譯php.ini
[root@lanquark memcache-2.2.3]# vim /usr/local/php-fpm/etc/php.ini 
#在extension部分增長
extension=memcache.so

#驗證
[root@lanquark memcache-2.2.3]# /usr/local/php-fpm/sbin/php-fpm -m | grep mem
memcache

2.新建測試腳本

[root@lanquark memcache-2.2.3]# cd /usr/local/nginx/html/
[root@lanquark html]# vim 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();
?>

驗證
[root@lanquark html]# /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>[root@lanquark html]#


8、memcached中存儲sessions

本實例是在lamp/lnmp環境下實現

編輯php.ini添加兩行(須要重啓後才能生產)
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"

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

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

[root@lanquark html]# vim /usr/local/php-fpm/etc/php.ini
#在末尾添加,保存文件內容後。而後重啓服務器
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"

#新建session測試文件
[root@lanquark html]# vim session.php
<?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();
?> 

~                                                                                                                             
"session.php" [New] 12L, 237C written
[root@lanquark html]# curl localhost/session.php 
1534905865<br><br>1534905865<br><br>44v9rm4hitgelt78gl02r7rbt2 
[root@lanquark html]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get 44v9rm4hitgelt78gl02r7rbt2
VALUE 44v9rm4hitgelt78gl02r7rbt2 0 37
TEST|i:1534905865;TEST3|i:1534905865;
END
#說明session有保存在memcached中
相關文章
相關標籤/搜索