目錄
1、nosql介紹
2、memrcached介紹
3、安裝memcached
4、查看memcachedq狀態
5、memcached命令行
6、memcached數據導出和導入
7、php鏈接memcached
8、memcached中存儲sessionsphp
非關係型數據庫就是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
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獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。從緩存的實用角度來看,該模型十分理想。
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
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
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)
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
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]#
本實例是在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中