NoSQL(NoSQL = Not Only SQL),意味反sql運動,是一項全新的數據庫革命性運動,早期就有人提出,發展至2009年趨勢愈加高漲。它指的是非關係型的數據庫。javascript
隨着互聯網web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的sns類型的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲自己的特色獲得了很是迅速的發展。php
高併發讀寫的性能 大數據量的擴展(分佈式存儲) 配置簡單css
靈活、高效的操做與數據模型 低廉的成本html
沒有統一的標準 沒有正式的官方支持 各類產品還不算成熟java
新浪微博 Redis Google Bigtable Amazon SimpleDB 淘寶數據平臺 Tairmysql
優酷視頻 MongoDB 飛信空間 HandlerSocket 視覺中國網站 MongoDBlinux
Memcached是danga的一個項目,最先是LiveJournal 服務的,最初爲了加速 LiveJournal 訪問速度而開發的,後來被不少大型的網站採用。 官方網站: www.danga.com 和 memcached.orgweb
Memcached是一個高性能的分佈式的內存對象緩存系統,目前全世界很多人使用這個緩存項目來構建本身大負載的網站,來分擔數據庫的壓力,經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,而後從內存中讀取,從而大大提升讀取速度。(注: 摘自百度全科)redis
Memcached是一個高性能的分佈式的內存對象緩存系統sql
分佈式的概念:咱們在實際的項目中可使用多臺memcache服務器,共同工做,存儲的數據是分佈式的。
一、下載軟件,並解壓,拷貝到指定的位置,通常便於管理,和服務器的環境在同一個目錄下
二、以管理員的方式進入到cmd窗口,並進入到memcache所在的目錄
memcache.exe –d install 安裝:安裝完成後,經過Windows+R調出運行界面輸入services.msc查看服務以下
三、安裝完成後,啓動memcache服務
memcached.exe –d start
啓動後,能夠經過netstat –an命令查看memcahce的端口是否監聽狀態,memcache的端口號是,11211
四、安裝可能失敗的緣由:
a 若是你是用win7,win8系統,他對安全性要求高,所以,須要你們使用管理員的身份來安裝和啓動. 具體是 程序開始===>全部程序==》附件==》cmd(單擊右鍵,選擇以管理員的身份來執行)
b存放memcached.exe 目錄不要有中文或者特殊字符
c 安裝成功,可是啓動會報告一個錯誤信息,提示缺乏xx.dll ,你能夠從別的機器拷貝該dll文件,而後放入到system32下便可.
d若是上面三個方法都不能夠,能夠直接 cmd>memcached.exe -p 端口 【這種方式不能關閉窗口】
五、在啓動時指定的一些基本命令
-p 監聽的端口 -l <ip地址>綁定地址(默認:全部都容許,不管內外網或者本機ip,有安全隱患,若設置爲127.0.0.1就只能本機訪問)
-d start 啓動memcached服務 -d restart 重起memcached服務 -d stop|shutdown 關閉正在運行的memcached服務
-d install 安裝memcached服務 -d uninstall 卸載memcached服務 -u 以的身份運行 (僅在以root運行的時候有效)
-m 最大內存使用,單位MB。默認64MB -M 內存耗盡時返回錯誤,而不是刪除項 -c 最大同時鏈接數,默認是1024
-f 塊大小增加因子,默認是1.25 -n 最小分配空間,key+value+flags默認是48 -h 顯示幫助
鏈接方式:telnet ip地址 端口號 telnet localhost 11211
數據存儲格式:相似於關聯數組
第一列 第二列
鍵名(通常是字符串) 具體的數據內容(除了資源)
增刪改查操做
一、添加數據
add 鍵的名稱 0 緩存的時間 數據的長度 (回車後添加內容) 0表示不壓縮:
好比:add color 0 100 3 表示向memcache裏面添加的數據鍵爲color,緩存的週期是100秒,數據的長度是3
二、獲取數據
get 鍵名 get color
三、修改數據
replace 要求鍵名必須存在,若是不存在,則提示一個錯誤。
set set 指令也能夠替換數據,若是鍵存在則替換,若是不存在,則等於添加。
四、刪除數據
基本語法:delete 鍵名稱
flush_all 清空全部的數據
五、其餘的一些命令
六、獲取memcache查詢的成功率
memcache查詢效率 = get_hits / cmd_get
一、從網上下載memcache php的擴展,該擴展要和php的版本一致。要下載php版本對應的memcache的擴展。
二、把對應的memcache擴展拷貝到php安裝目錄的ext下面。
三、修改php配置文件php.ini打開擴展支持 extension=php_memcache.dll
四、重啓apache,經過運行phpinfo()函數來進行測試。
五、簡單使用,能夠存儲字符串、整數、小數、對象、數組,其中存儲數組時只能是一維數組,存儲時以序列化方式存儲
<?php $mem=new Memcache(); $mem->connect("localhost",11211); //先完成數據的取出 //若是把取出的data數據給緩存到memcache裏面 //取出的數據是由sql語句決定的。鍵由sql語句字符串,值就是取出的數據 $sql = "select title from dede_archives limit 5"; $key = md5($sql); echo $key; //先從memcache裏面取出數據 $data = $mem->get($key);//根據鍵名稱從memcache裏面取出數據 //判斷是否取出數據,若是數據爲空,則從數據庫裏面獲取數據。 if(!$data){ $conn = mysql_connect("localhost",'root','root'); mysql_query("use itdede"); //mysql_select_db(); mysql_query("set names utf8"); $res = mysql_query($sql,$conn); $data = array(); while($row=mysql_fetch_assoc($res)){ $data[]=$row; } //從數據庫裏面獲取的數據,添加到memcache裏面。 $mem->add($key,$data,MEMCACHE_COMPRESSED,100); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN"> <head> <title>新建網頁</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="description" content="" /> <meta name="keywords" content="" /> <script type="text/javascript"></script> <style type="text/css"></style> </head> <body> <?php foreach($data as $v){?> <li><?php echo $v['title']?></li> <?php }?> </body> </html>
使用範圍:在沒有php操做memcache擴展的前提下使用,推薦使用php,memcache的擴展。
測試前:要關閉擴展。具體的使用步驟:
一、把源碼文件拷貝到項目的指定位置。
二、引入源碼文件
方法一:在php.ini文件中配置
一、設置存儲方式: session.save_handler=memcache
二、設置存儲位置:session.save_path="tcp://localhost:11211,tpc://192.168.1.89:11211"
session文件存儲到memcache是經過sessionid做鍵的;把session文件存儲到memcache後,不影響session的任何操做。
方法二:直接在文件中設置,其實這樣更好,由於不會影響到別人的使用session的方式
ini_set("session.save_handler","memcache");
ini_set("session.save_path","tcp://localhost:11211");
原理以下圖: 具體代碼以下圖:
若是隻有一臺電腦,無需虛擬機也能夠模擬兩臺memcache 服務器。能夠經過memcached.exe –p 11210來開啓。
具體代碼如圖:
一、生命週期的問題
①秒數,可是有限制,不能超過 2592000秒(30天)。
②時間戳,好比咱們要設置超過1個月,則以下設置
$mem->add('name1','yangguang',MEMCACHE_COMPRESSED,time()+3600*24*31);若是設置爲0,則表示永不過時。
存儲到memcache裏面的數據,什麼狀況下會丟失:
(1)生命週期到了(2)關閉memcache服務(3)關機,重啓。
二、memcache中善於存儲哪些數據
①更新比較頻繁的數據(用戶的在線狀態),查詢比較頻繁,數據量不是很大。
②安全性不是很高。
若是沒有memcache這個產品,能夠經過mysql的memory存儲引擎。
三、memcache的安全性
①內網(兩塊網卡,memcache在啓動時指定那臺訪問)
memcached –d –u root –l 192.168.1.100 –p 11211.指定只有192.168.1.100服務器才能訪問。
②防火牆
在linux中,設置命令:iptables -a input -p 協議 -s 能夠訪問ip -dport 端口 -j ACCEPT
例如:
iptables –a input –p tcp –s 192.168.1.1 –dport 11211 –j ACCEPT
iptables –a input –p tcp –s 192.168.1.1 –dport 11211 –j ACCEPT
四、Memcached機制深刻了解
①基於c/s架構,協議簡單
②基於libevent的事件處理
③內置內存存儲方式
④基於客戶端的分佈式
redis是一個開源的,先進的key-value存儲。它一般被稱爲數據結構服務器,由於鍵能夠包含字符串、哈希、鏈表、集合和有序集合。
(1)架構方式:c/s 客戶端和服務器
(2)redis不只能夠存儲到內存中,並且能夠把數據同步到硬盤中,達到數據的存儲持久化。
(3)redis數據存儲是鍵值對,存儲的值的類型有五種:string(字符串),hash(哈希),list(鏈表),set(無序集合),zset(有序集合),這些數據類型都支持push/pop、add/remove及取交集和並集及更豐富的操做、Redis支持各類不一樣方式的排序。
(4)提供的API語言包括:C C++ C# Clojure Common Lisp Erlang Haskell Java Javascript Lua Objective-C Perl PHP Python Ruby Scala Go Tcl
http://redis.googlecode.com/files/redis-2.4.17.tar.gz
tar zxvf redis-2.4.17.tar.gz
cd redis-2.4.17
make
cd src && make install
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
mv redis.conf /usr/local/redis/etc
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
啓動格式:redis-server 指定的配置文件
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
打開配置文件/etc/redis.conf,若是須要在後臺運行,把daemonize項改成yes
pkill redis-server
string(字符串):相似於memcache裏面的數據存儲方式 key values
hash(哈希):相似於關係型數據庫裏面的行,也是鍵值對,值裏面又有鍵值對
list(鏈表):能夠模擬隊列和棧。數據存儲是有順序的。
隊列:先進先出。棧:先進後出。
set(集合) 集合的示意圖:
zset(有序集合) 集合裏面的內容是有序的
String是最簡單的類型,一個 key對應一個Value,String類型是二進制安全的。Redis的 string能夠包含任何數據,好比jpg圖片或者序列化的對象。
語法:set 鍵名稱 值。set name zhangsan,從新設置則直接覆蓋
語法:get 鍵值。get name
setnx name zhangsan
語法:setex 名稱 有效期 值。setex color 10 red
語法:setrange 鍵名稱 開始替換序號 替換的內容。setrange email 7 qq.com
語法: mset 名稱1 值1 名稱2 值2 mset name lisi age 18 height 168
msetnx name lisi age 18 height 168
getset name wangwu
getrange name 0 5
mget name age height
incr age incrby age 45
decr age decrby age 45
append name is man
strlen name
Redis hash是一個string類型的field和value的映射表。它的添加、刪除操做都是0(1)(平均)。hash特別適合用於存儲對象。相較於將對象的每一個字段存成單個string類型。將一個對象存儲在hash類型中會佔用更少的內存,而且能夠更方便的存取整個對象。
語法: hset 哈希名稱 字段名稱 值 hset myhash name xiaowang
語法:hget 哈希名稱 字段名稱 hget myhash name
hsetnx myhash name lisi
語法:hmset 哈希名稱 field1 value1 field2 value2 hmset hash2 name yuguo age 77
語法:hmget 哈希名稱 field1 field2 hmset hash2 name age
hincrby hash2 age 20
hexists hash2 age
hlen hash2
語法:hdel 哈希名 field hdel hash2 age
hkeys hash2
hvals hash2
hgetall hash2
list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的全部值等等,操做中key 理解爲鏈表的名字。redis的list類型其實就是一個每一個子元素都是string 類型的雙向鏈表。咱們能夠經過push、pop操做從鏈表的頭部或者尾部添加刪除元素,這樣list既能夠做爲棧,又能夠做爲隊列。
語法:lpush 鏈表名稱 值內容
語法:lrange 鏈表名稱 0 -1,注意0 和 -1 表示取值範圍,從頭部到尾部。
語法:rpush 鏈表名稱 值內容
set是集合,它是string類型的無序集合。set是經過hash table實現的、添加、刪除和查找的複雜度都是0(1)。對集合咱們能夠取並集、交集、差集。經過這些操做咱們能夠實現sns中的好友推薦和blog的tag功能。
語法:sadd 集合名 元素
語法:sdiffstore 新的集合 集合1 集合2
sorted set是set的一個升級版本,他在set的基礎上增長了一個順序屬性,這一屬性在添加修改元素的時候能夠指定,每次指定後,zset會自動從新按新的值調整順序。能夠理解爲有兩列的mysql表,一列存value,一列存順序。操做中的key理解爲zset的名字。
語法:zadd 集合名 序號 內容
(11)zremrangebyrank刪除集合中排名在給定區間的元素
redis提供了豐富的命令對數據庫和各類數據庫類型進行操做,這些命令能夠在linux終端使用。
本例中咱們獲取了dir這個參數配置的值,若是想獲取所有參數的配置只須要執行」config get *」便可將所有的值都顯示出來
設置客戶端鏈接後進行任何其餘操做前須要使用密碼。注意:由於 redis速度至關快,因此在一臺比較好的服務器下,一個外部的用戶能夠在一秒鐘進行150k次的密碼嘗試,這意味着你須要指定很是很是強大的密碼來防止暴力破解。
#requirepass 設置的密碼 設置完密碼後,redis服務要重啓
好比:requirepass guangzhou
第一種方式:登陸後,執行auth 設置的密碼 後才能操做,不然不能任何操做
第二種方式:在登陸時,輸入密碼 /usr/local/redis/bin/redis-cli –a 設置的密碼
redis是一個支持持久化的內存數據庫,也就是說redis須要常常將內存中的數據同步到硬盤來保證持久化。
redis支持兩種持久化方式:
快照是默認的持久化方式。這種方式是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。能夠經過配置設置自動作快照持久化的方式。咱們能夠配置redis在n秒內若是超過m個key修改就自動作快照。
快照方式的缺點:因爲快照方式是在必定間隔作一次的,因此若是redis意外down掉的話,就會丟失最後一次快照後的全部修改。
aof比快照方式有更好的持久化性,是因爲在使用aof時,redis會將每個收到的寫命令都經過write函數追加到文件中,當redis重啓時會經過從新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。
固然因爲os會在內核中緩存write作的修改,因此可能不是當即寫到磁盤上。這樣aof方式的持久化也仍是有可能會丟失部分修改。能夠經過配置文件告訴reids咱們想要經過fsync函數強制os寫入到磁盤的時機。
daemonize若是須要在後臺運行,把該項改成yes pidfile:配置多個pid的地址 默認在/var/run/redis.pid
bind:綁定ip,設置後只接受來自該ip的請求 port:監聽端口,默認爲6379
timeout:設置客戶端鏈接時的超時時間,單位爲秒。 logfile:配置log文件的地址。
databases:設置數據庫的個數,默認使用的數據庫爲0 sava:設置redis進行數據庫鏡像的頻率。
rdbcompression:在進行鏡像備份時,是否進行壓縮。 Dbfilename:鏡像備份文件的文件名。
Dir:數據庫鏡像備份的文件放置路徑。 Slaveof:設置數據庫爲其餘數據庫的從數據庫。
Masterauth:主數據庫鏈接須要的密碼驗證。 Requirepass:設置登陸時須要使用的密碼。
Maxclients:限制同時鏈接的客戶數量 Maxmemory:設置redis可以使用的最大內存。
Appendonly:開啓append only模式。