一 NoSQL簡介 php
NoSQL(NoSQL = Not Only SQL ),意即"不只僅是SQL",泛指非關係型的數據庫,隨着互聯網web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲其自己的特色獲得了很是迅速的發展。NoSQL數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤爲是大數據應用難題。 mysql
非關係型數據庫就是NoSQL,關係型數據庫表明MySQL linux
對於關係型數據庫來講,是須要把數據存儲到庫、表、行、字段裏,查詢的時候根據條件一行一行地去匹配,當量很是大的時候就很耗費時間和資源,尤爲是數據是須要從磁盤裏去檢索 git
NoSQL數據庫存儲原理很是簡單(典型的數據類型爲k-v),不存在繁雜的關係鏈,好比mysql查詢的時候,須要找到對應的庫、表(一般是多個表)以及字段。 web
NoSQL數據庫的四大分類 redis
k-v形式 算法
memcached、redis 適合儲存用戶信息,好比會話、配置文件、參數、購物車等等。這些信息通常都和ID(鍵)掛鉤,這種情景下鍵值數據庫是個很好的選擇。 sql
文檔數據庫 mongodb
mongodb將數據以文檔的形式儲存。每一個文檔都是一系列數據項的集合。每一個數據項都有一個名稱與對應的值,值既能夠是簡單的數據類型,如字符串、數字和日期等;也能夠是複雜的類型,若有序列表和關聯對象。數據存儲的最小單位是文檔,同一個表中存儲的文檔屬性能夠是不一樣的,數據可使用XML、JSON或者JSONB等多種形式存儲。 數據庫
列存儲數據庫。
這部分數據庫一般是用來應對分佈式存儲的海量數據。鍵仍然存在,可是它們的特色是指向了多個列。這些列是由列家族來安排的。如:Cassandra, HBase, Riak.
圖形(Graph)數據庫
圖形結構的數據庫同其餘行列以及剛性結構的SQL數據庫不一樣,它是使用靈活的圖形模型,而且可以擴展到多個服務器上。NoSQL數據庫沒有標準的查詢語言(SQL),所以進行數據庫查詢須要制定數據模型。許多NoSQL數據庫都有REST式的數據接口或者查詢API。如:Neo4J, InfoGrid, Infinite Graph.
NoSQL數據庫在如下的這幾種狀況下比較適用:
一、數據模型比較簡單;
二、須要靈活性更強的IT系統;
三、對數據庫性能要求較高;
四、不須要高度的數據一致性;
五、對於給定key,比較容易映射覆雜值的環境。
分類 |
Examples舉例 |
典型應用場景 |
數據模型 |
優勢 |
缺點 |
鍵值(key-value) |
Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB |
內容緩存,主要用於處理大量數據的高訪問負載,也用於一些日誌系統等等。 |
Key 指向 Value 的鍵值對,一般用hash table來實現 |
查找速度快 |
數據無結構化,一般只被看成字符串或者二進制數據 |
列存儲數據庫 |
Cassandra, HBase, Riak |
分佈式的文件系統 |
以列簇式存儲,將同一列數據存在一塊兒 |
查找速度快,可擴展性強,更容易進行分佈式擴展 |
功能相對侷限 |
文檔型數據庫 |
CouchDB, MongoDb |
Web應用(與Key-Value相似,Value是結構化的,不一樣的是數據庫可以瞭解Value的內容) |
Key-Value對應的鍵值對,Value爲結構化數據 |
數據結構要求不嚴格,表結構可變,不須要像關係型數據庫同樣須要預先定義表結構 |
查詢性能不高,並且缺少統一的查詢語法。 |
圖形(Graph)數據庫 |
Neo4J, InfoGrid, Infinite Graph |
社交網絡,推薦系統等。專一於構建關係圖譜 |
圖結構 |
利用圖結構相關算法。好比最短路徑尋址,N度關係查找等 |
不少時候須要對整個圖作計算才能得出須要的信息,並且這種結構不太好作分佈式的集羣方案。 |
二 Memcached數據存儲方式
Memcached是國外社區網站LiveJournal團隊開發,目的是爲了經過緩存數據庫查詢結果,減小數據庫訪問次數,從而提升動態web站點性能。
Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊。
官方站點 http://www.memcached.org/
數據結構簡單(k-v),數據存放在內存裏
多線程
基於c/s架構,協議簡單
基於libevent的事件處理
自主內存存儲處理(slab allowcation)
數據過時方式:Lazy Expiration 和 LRU
Memcached的數據流向:
1 web從db上查詢到結果
2 把結果存儲到memcached中
3 再次用到該結果,從緩存memcached中取
Slab allocation:
1:先把內存分紅不少個Slab,這個大小是預先規定好的,以解決內存碎片的問題。分配給Slab的內存空間被稱爲Page,默認是1M。一個Slab下能夠有多個Page。
2.Page爲內存分配的最小單位。
Memcached的內存分配以page爲單位,默認狀況下一個page是1M,能夠經過-I參數在啓動時指定。若是須要申請內存 時,memcached會劃分出一個新的page並分配給須要的slab區域。page一旦被分配在重啓前不會被回收或者從新分配
3.而後把一個Page分紅不少個chunk塊,chunk塊是用於緩存記錄的空間。Chunk的
大小是先有一個基本值,而後根據增加因子來增大。每個page中chunk是相等的空間大小。
Memcached裏面保存着slab內空閒的chunk列表,當收到要保存的item的時候,它
會根據item的大小,去選擇一個最合適的slab,而後找到空閒的chunk,把數據存放進去。
Growth factor:
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(Least Recently Used最近最少使用)
Memcached會優先使用已超時的記錄的空間,但即便如此,也會發生追加新記錄時空間不足的狀況,此時就要使用名爲Least Recently Used(LRU)機制來分配空間。顧名思義,這是刪除"最近最少使用"的記錄的機制。所以,當內存空間不足時(沒法從slab class獲取到新的空間時),就從最近未被使用的記錄中搜索,並將其空間分配給新的記錄。從緩存的實用角度來看,該模型十分理想。
懶惰刪除機制
刪除item對象時,不釋放內存,做刪除標記,指針放入slot回收插槽,次分配的時候直接使用
注意:memcached的LRU不是全局的,而是針對slab的,能夠說是區域性的
三 memcached安裝與啓動
yum list |grep memcache
yum install -y memcached libmemcached libevent
啓動:systemctl start memcached
[root@greg02 ~]#systemctl start memcached
[root@greg02 ~]#ps aux |grep memcache
memcach+ 2495 0.0 0.0 325568 1184 ? Ssl 18:17 0:00 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024
root 2502 0.0 0.0 112664 968 pts/0 S+ 18:17 0:00 grep --color=auto memcache
參數說明:
-d 是啓動一個守護進程
-m 是分配給Memcache使用的內存數量,單位是MB
-u 是運行Memcache的用戶
-l 是監聽的服務器IP地址
-p 是設置Memcache監聽的端口,最好是1024以上的端口
-c 選項是最大運行的併發鏈接數,默認是1024,按照你服務器的負載量來設定
-P 是設置保存Memcache的pid文件
vim /etc/sysconfig/memcached 能夠配置參數
好比加上監聽的ip,能夠把OPTIONS="" 改成OPTIONS="127.0.0.1"
其中-m指定memcached分配內存
-c指定最大併發數
-u指定運行memcached服務的用戶
啓動也能夠用:memcached -d -m 10 -u root -l 127.0.0.1 -p 12000 -c 256 -P /tmp/memcached.pid
四 查看memcached狀態
1.memcached-tool 127.0.0.1:11211 stats
2.echo stats |nc 127.0.0.1 11211須要安裝nc工具 yum install -y nc
3.若安裝libmemcached(yum install –y memcached)後,可使用命令
memstat --servers=127.0.0.1:11211 查看memcached服務狀態
五 memcached命令行
存儲命令: set/add/replace/append/prepend/cas
獲取命令: get/gets
其餘命令: delete/stats..
telnet 127.0.0.1 11211
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)做爲結束標誌。
Memcached數據示例:
六 Memcached數據導出和導入
導出:
memcached-tool 127.0.0.1:11211 dump > data.txt
cat data.txt
導入:
nc 127.0.0.1 11211 < data.txt
若nc命令不存在,yum install nc
注意:導出的數據是帶有一個時間戳的,這個時間戳就是該條數據過時的時間點,若是當前時間已經超過該時間戳,那麼是導入不進去的
vim mdata.txt中的設置。
七 PHP鏈接Memcached
先安裝php的memcache擴展
cd /usr/local/src/
wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz
tar zxf memcache-2.2.3.tgz
cd memcache-2.2.3
/usr/local/php-fpm/bin/phpize
[root@greg02 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
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
解決安裝yum install m4;yum install autoconf
./configure --with-php-config=/usr/local/php-fpm/bin/php-config
make && make install
安裝完後會有相似這樣的提示:
[root@greg02 memcache-2.2.3]#make install
Installing shared extensions: /usr/local/php-fpm/lib/php/extensions/no-debug-non-zts-20131226/
而後修改php.ini添加一行
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內容也能夠參考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/1.php
執行腳本
/usr/local/php-fpm/bin/php 1.php
或者將1.php放到某個虛擬主機根目錄下面,在瀏覽器訪問,便可看到效果
最終能夠看到數據以下:
[0] => aaa
[1] => bbb
[2] => ccc
[3] => ddd
八 Memcached中存儲session
本實例是在lamp/lnmp環境下實現
編輯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 "
wget http://study.lishiming.net/.mem_se.txt
mv .mem_se.txt /usr/local/apache2/htdocs/session.php
其中session.php內容能夠參考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/session.php
curl localhost/session.php
相似於1443702394<br><br>1443702394<br><br>i44nunao0g3o7vf2su0hnc5440
telnet 127.0.0.1 11211
get i44nunao0g3o7vf2su0hnc5440