單元目標:
1.NoSQL介紹
2.Redis的介紹
3.Redis適用場合
4.Redis的安裝與部署
5.Redis的數據類型
6.Redis的經常使用命令
7.Redis的高級應用
經過這七點你們會對redis有深入的理解。首先看NoSQL的介紹,什麼是NoSQL啊,NoSQL = Not Only SQL,什麼意思啊?不只僅爲SQL,他意爲反SQL運動,是一項全新的數據庫革命性運動,早期就有人提出,發展至2009年趨勢愈加高漲。它指的是
非關係型的數據庫。
還記得我們的mysql嗎,還有誰呢,sql server,oracle等等一些數據庫,這些數據庫都是關係型數據庫,而NoSQL呢,是非關係型數據庫。隨着互聯網web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,MySql在處理高併發讀寫的時候壓力會很是的大,暴露了不少難以克服的問題,而我們的NoSQL呢,因爲它自己的一些特色呢,獲得了很是迅速的發展。
那麼它有什麼特色呢,首先的我們的redis它是以key-value的形式存儲的,key是鍵,鍵值式存儲,什麼是鍵值式存儲我想你們並不陌生,JS裏面我們用鍵值式存儲的數據類型是什麼類型,JS裏面我們用JSON對象,JSON對象,他是個大括號,{key:value,key:value}這就是一個鍵值式存儲的JSON,這就是一個JSON對象。而我們的PHP當中,以key-value形式存儲的數據類型有什麼呢,數組,array(「key」 = > value)
以上這兩種數據類型,是否是都是以key-value形式來存儲的吧。那麼NoSQL和我們傳統的關係型數據庫有什麼不同呢,它不必定遵循我們傳統數據庫的一些基本要求,好比說遵循
SQL標準、
ACID屬性、
表結構等等。
我們在mysql當中進行增刪改查,插入一條數據用insert語句,刪是delete語句,改用update語句,查用select語句,這整個都是一個SQL標準語句,整個都是一個語句,但這些個語句呢,在我們的NoSQL當中徹底不適用,也就是說在NoSql當中我們的SQL語句是很差使的,還有我們的ACID屬性,
什麼是ACID屬性呢,ACID表明我們的事務處理,雖然我們的redis也支持事務,可是redis的事務還很是很是的簡單,以致於還知足不了我們的要求。什麼是事務啊,舉個例子:
舉個銀行轉帳的例子,好比說小李有1000元,小明手裏也爲1000元,如今我要實現一個功能,我如今要把這小李手裏的這1000元轉帳給小明,轉帳之後我們小李是否是要變成900,而後小明變成1100,那麼整個的一個過程是什麼呢,首先第一步,是否是要從小李那裏減100,第二步呢,是否是要給小明加100,這是否是一個過程,而這整個的一個過程就稱之爲一個事務,若是我執行完第一步,第二步沒有執行,那麼整個事務會幹嗎,會回滾,也就是說,第一步完成,第二步沒有完成,我們第一步也會幹嗎,也會回撤,是什麼意思呢,好比說我第一步,小李減了100,這個時候服務器忽然被關掉了,說着說down掉了啦,服務器出了問題啦,那我小明是否是沒有加上這100,那我不可能把這100塊錢蒸發掉吧,我們這樣作就不合適了,因此整個要作一個事務,也就是說這兒你減了100啦,可是你小明這兒沒有加上100,這個事務是沒有完成的,那麼你這兒小李減100就,不成功,不成功你的小李的帳戶不會被減100,這就是說這兩步都完成,這一個事務纔算是完成,若是其中的一步沒有完成,整個都會回滾到初始狀態,這就是我們的ACID屬性。
我們的NoSQL一樣沒有一個固定的表結構,我們還及得mysql當中,若是咱們要插入一條數據,你首先要先建好我們的表結構,而後經過我們的表結構來往裏面插入數據對不對,可是我們的NoSQL不須要,你們若是學過我們前門的mogodb數據庫,我們是否是沒有建立一個表啊,直接往裏面插入數據,一樣redis也是同樣的,這是他同一個的一個NoSQL的一個特色,
那麼你們來看一下這一類NoSQL的數據庫它們都有什麼樣的特色啊,
首先他
非關係型,這是他主要的特色,
而後他是什麼
分佈式的,他在建立之初就是以分佈式來建立的,這個作起來主從分離,主從複製,主從分離,讀寫分離,
這個作起來要比我們的mysql要簡單一些要輕鬆一些,而且他是
開源的,
以及他是
水平可擴展的,
NoSQL特色,
在
處理超大量的數據上有很大的有勢,要比我們的mysql要有很大的優點,
再有呢,
運行在較便宜的PC服務器集羣上,
以及它擊碎了性能瓶頸,
我們在作mysql是否是作了不少優化吖,可是NoSQL呢不須要,NoSQL性能很是高,來我們來看一下,他具備什麼樣的性能,爲何它的性能好呢,
NoSQL的適用場景,
首先我們的NoSQL呢,對於數據的高併發讀寫有很大的優點,
我們在對mysql進行一次上萬次的sql查詢,可能還頂得住,可是若是對mysql進行一個上萬次寫的請求呢,我們的硬盤io是否是就沒法承受了,對我們的io是否是要求就比較高,這樣就會形成我們的效率低下吧~
可是NoSQL呢對於我們上萬次的寫是很是很是的輕鬆的,
對於海量數據的高效率存儲和訪問呢,國外一個站friedfeed一個月就能夠達到2.5億的用戶動態,對於我們關係型數據庫來講呢,在一張2.5億條數據的表裏面要進行SQL查詢,你們可想而知是否是很是很是的慢,以致於慢到我們不能夠忍受,可是NoSQL作起來會很是的輕鬆,
對數據的高可擴展和高可用性呢,首先對於一個要24小時提供不間斷服務的網站來講呢,對數據庫系統進行升級和擴展是否是很是痛苦啊,每每須要停機維護以及數據遷移,那爲何數據庫我們不能來增長一個服務器結點呢,
不能增長服務器結點來完成呢,這個時候我們NoSQL來作分佈式吧,剛剛說過了NoSQL來作分佈式是否是很是的輕鬆,以及NoSQL沒有一個固定的表結構,
在你未來對系統進行迭代開發的時候,若是我們要對錶結構進行更改,MySQL作起來是否是很是的麻煩,要對之前的數據進行徹底的更改吧,
可是我們的NoSQL不須要,由於他沒有固定的表結構,這是NoSQL三個重要的適用場景,
Redis的介紹,這是他官方的一個介紹,
Redis is an open source, advanced key-value store. It is often referred to as
a data structure server since keys can contain strings, hashes, lists, sets and
sorted sets.
爲何要定義個數據結構服務器,學過數據結構的都知道,字符串,哈希,鏈表,集合以及有序集合,這五種類型是否是相似於我們的數據結構裏面的類型,
Redis是一個開源的,先進的key-value存儲。他一般被稱爲數據結構服務器,由於鍵能夠包含字符串,哈希,鏈表,結合和有序集合,
redis的鏈表能夠作成棧,也能夠作成隊列,棧是先進後出,而我們的隊列呢,是否是先進先出呢,由於上下是通的,而我們的棧呢是上通下堵的,
Redis是一個Key-Value存儲系統。它支持存儲的value類型不少,包括string(字符串)、list(鏈表)、set(集合)、zset(有序集合)。
這些數據類型呢,都支持什麼,push/pop、add/remove。
push/pop什麼意思啊,還記得我們php裏面,對數組進行壓入跟彈出嗎,array_push這是我們對數組進行一個壓入吧,對它彈出呢,是否是array_pop同樣的,
一樣的我們的list裏面,我一樣能夠往裏面壓入數據,也能夠向外面彈數據,一樣的對我們的集合,集合就相似於我們數學裏面的一個集合,
這個集合能夠添加add,能夠刪除remove,能夠對他裏面的鍵進行添加和刪除,以及集合與集合之間能夠有交集,還有並集,還能夠是差集,這是集合的相關操做,
因此說我們的redis操做起來是很是的豐富的,它還支持各類不一樣方式的排序,由於redis還有有序集合,有序集合他是給你增長一個字段,增長一個鍵來存儲它的順序,
爲了保證效率數據都是緩存在內存中的,這就是redis快的一個緣由,可是
存儲在內存當中,我們是否是
有必定的風險啊,若是我哪一天我服務器忽然斷掉了,忽然down掉了,內存當中的東西是否是會釋放,
數據是否是也會丟失啊,因此我們的redis支持,
週期性的把數據更新到磁盤裏面。或者把相關的讀寫操做寫入,讀不存啊,
把修改或者寫入操做,追加到我們的記錄文件裏面。
這個時候有相似於我們的bin-log了吧,相似於mysql當中的bin-log啦存的都是
更新數據、刪除數據或者是插入數據的相關操做吧,
這就是說我們更新或者寫入磁盤有兩種方式,一種是
把數據進行快照,還有一種方式就是
把我們的操做記錄下來,這是他保存數據的兩種方式,
Redis提供的API語言包括我們的c、c++、C#、Erlang、java、Javascript、Lua、Objective-C、Perl、PHP、Python、Ruby等
目前全球最大的Redis用戶是新浪微博,在新浪有200多臺物理機,有400多個端口正在運行這Redis,有超過4G的數據在Redis上來爲微博用戶提供服務。
那他在新浪微博是怎麼用的呢,在新浪微博redis的部署場景不少,大概分爲以下的2種:
1.應用程序直接訪問Redis數據庫,
applications是我們的應用程序,他直接向我們的redis服務器來進行寫入操做吧,讀呢,一樣也從我們的數據庫中來讀,
這是他的第一種場景,這樣子作起來是否是比較簡單,是否是和我們的php+mysql是否是同樣的啊,
這樣子作起來比較簡單,只不過說僅僅是怎麼的mysql替換成了redis,可是這樣子作起來有些不安全,若是我那天redis down掉了,
或者是內存當中的數據被釋放掉了,我數據是否是永久丟失了,這樣會有必定的問題,
2.那麼他有第二種場景,首先應用程序,直接訪問我們的redis,可是當redis訪問失敗時候,他會用第二種方案,直接訪問mysql。
首先我們的應用程序會先訪問redis,由於redis會比我們的mysql要快吧,這麼這個時候redis會跟後面的mysql集羣來進行同步,他倆的數據是徹底
同步的,
當你的redis集羣出現問題了之後,我就是當前的應用系統直接去訪問他不成功了吧,直接去訪問redis不成功了吧,那怎麼辦,他會去找誰啊,回去找後面的mysql,
這樣子是否是達到一個
雙重保險啊,以致於我們的網站不會被G掉,這是redis在新浪微博的兩種適用場景,
redis把海量數據裝進redis比mysql把海量數據裝入mysql要輕鬆多,
把大象裝進冰箱的過程:
一、打開冰箱門
二、把大象裝進去
三、把冰箱門關上
首先
鏈接數據庫,而後把數據
寫入到數據庫裏面,最後
關閉數據庫吧,
redis很容易讓大象本身走進冰箱裏面,由於,我剛纔是否是說了,他有五種數據類型,
這五種數據類型呢,能夠爲大象定製不一樣的冰箱,也就是說爲我們的數據定製不一樣的數據類型,
這樣作起來靈活的數據結構和數據操做,
redis具體的適用場景:
1.取最新的n個數據的操做,
2.排行榜應用,取top n操做,
3。須要精確誰的難過過時時間的應用,redis能夠對鍵設置過時時間,多長時間有效,這是MySQL沒法作到的。
4.計數器的應用,新浪微博主要用在計數器上面,
5.Uniq的操做,獲取哦某段時間全部數據排重值,
6.實時系統,反垃圾系統
7.Pub/Sub構建實時消息系統,這是redis獨有的一個系統,pub/sub,發佈與訂閱,後面詳細介紹,
8.構建隊列系統,list類型能夠構建棧或者隊列,
9.以及redis能夠作緩存,
說着這麼多我們的redis跟我們的mysql到底有什麼樣的不一樣點,
redis
|
mysql
|
mogodb
|
庫
|
庫
|
庫
|
無
|
表
|
集合
|
無
|
字段行列
|
無
|
首先第一點redis和mysql都有庫的概念,第二點我們的mysql是否是有個表的概念,可是我們的redis沒有表的概念,
第三點mysql有字段的概念 ,行跟列的概念,redis沒有這些概念,mogodb也是有庫,那表呢是集合,可是這個集合跟redis的集合是不同的,
我們redis的集合是數據類型,而mogodb中的集合呢,類是於mysql當中的表,那麼字段跟行跟列呢,他一樣也沒有,
reids沒有表和字段,前面說過啦,NoSQL不存在表結構吧,這就是他不存在表結構的緣由,這就是這三個的對比,
Redis的安裝和部署,
下載Stable穩定版本的,儘可能不要用Release版本的或者測試版本的。我們儘可能使用它的標準版,這樣子穩定一些。
第一步下載下載完之後我們給它傳到linux下,行嗎,我們作安裝與部署我們所有在linux下面去作,
首先我們第一步是先解壓,安裝我們的源代碼包的時候須要先解壓,解壓用我們的tar
tar zxvf redis-2.4.17.tar.gz
選擇用zxvf,v表明現實詳細信息,這個v能夠不加,而後後面選中你的包名,解壓出來幹嗎進入到我們的包裏面
cd redis-2.4.17
redis不一樣於mogodb,mogodb是否是我們解壓出來以後就直接看成綠色版來用啊,
我們redis須要編譯,須要make一下,可是他沒有幹嗎,沒有配置configure吧
直接進行編譯,沒有進行配置,配置完之後直接跳到它的src文件夾裏面
cd src
&&
make install
來進行安裝,這樣子就會使我們的redis安裝成功,
安裝成功之後呢,我們爲了便於管理,我們給他建立一個文件夾,建立到我們的usr/local/redis/bin目錄下面。
步驟三,移動文件,便於管理:
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
mv /lamp/redis-2.4.17/redis.conf /usr/local/redis/etc
cd /lamp/redis-2.4.17/src
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli
redis-server /usr/local/redis/bin
/bin 用來放
命令,
/etc 用來放
配置文件,
建立完文件後,咱們使用mv,mv能夠移動,也能夠更名,
把命令和配置文件都移動過來,這樣作是爲了管理,
步驟四:啓動Redis服務:啓動用的是我們的redis-server命令,可是要指定一個配置文件
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
Redis服務端默認的鏈接端口是6379,
mysql的默認端口是 3306
mogodb默認端口是 27017 28017
那麼啓動完服務以後怎麼來啓動redis客戶端呢,
步驟五:客戶端鏈接
能夠經過redis-cli命令
/usr/local/redis/bin/redis-cli
步驟六:中止Redis實例
咱們可使用/usr/local/redis/bin/redis-cli shutdown
也可使用pkill redis-server
也可使用killall
還能夠好似用kill -9均可以的,
啓動虛擬機,
我先來講一下個人環境,我們來,對虛擬機,我們來使用VMware Nerwork Adapter VMnet1,
打開網絡與共享中心->更改適配器設置
爲何不實用橋接呢,使用橋接我們是否是得插網線啊,我們爲了方便啊,
我們使用VMnet1->屬性,來看一下它的屬性,來打開一下它的ipv4
ip我這裏是
88網段的,而且
ip是88.1
個人
Linux系統的ip是88.89是跟他統一網段的,
若是不是同一網段,我們是否是鏈接不成功啊,
必須是同一網段啊,可是ip不可以相同,
VMware Workstation->File->Open
首先打開個人一個鏡像啊,這是以前我作好的一個系統,
這個系統呢,我前面有快照,我們把他恢復到純lamp環境下,這裏面我只有
我們的lamp環境,沒有其餘軟件,好我們啓動一下,
系統啓動成功我們用root用戶來登陸,登陸成功之後我們來看一下我們的ip地址,
看ip我們用什麼命令,
ifconfig
eth0的ip是192.168.88.89
lo是什麼,lo是迴環網卡,
那好我如今既而後ip地址,我能夠
經過VMnet1對我們的linxu進行遠程鏈接,
登陸成功之後我們用ifconfg看下是否是192.168.88.89看一下是否是登陸成功了,
登陸成功之後,咱們先看下我們的軟件包,一個是redis-2.4.17.tar這是他的服務器軟件包
owlient-phpredis-2.1.1.-1-g90ecd17.tar這個包是我們的php鏈接redis須要打的一個擴展模塊,
今天先利用ftp把redis-2.4.17.tar上傳到服務器上面, 咱們進入到根目錄下面的lamp目錄下面,編譯我們lamp環境的時候,我全部的
軟件包都在這裏面放着,redis也不例外,咱們把他放進來,傳上來之後,咱們
#cd /lamp
#ll
發現我們的redis是否是上傳成功,上傳成功之後我們第一步是否是須要解壓啊,用tar命令來解壓,由於壓縮包以tar.gz結尾的,
#tar zxvf redis-2. ....用tab補全,
解壓成功之後,進入到我們的redis目錄
#cd redis-2.4.17
進來之後第二步須要幹什麼,須要make,make是我們的編譯吧~
編譯成功之後我們須要進入,
#ll
須要進入我們的
src目錄下
#cd src
而後
#make install
那如今來看一下,
#ll
如今來看一下是否是有我們的redis的相關命令
redis-cli等等,,,,
那好我如今爲了便於管理,我們須要建立文件夾,
#cd /usr/local/
我全部的源代碼包都安裝在此,
#ll
我全部的軟件都在這裏放着,咱們把redis也放在這裏能夠吧,
建立目錄我們用mkdir命令
-p指定一個遞歸建立,
#mkdir -p /usr/local/redis/bin 存放redis命令
#mkdir -p /usr/local/redis/etc 來存放redis配置文件
如今就有了一個redis文件夾,
#cd /lamp/
#cd redis-2.4.17
#ll
如今就把redis.conf移動到redis下面的etc下面
#mv ./redis.conf usr/local/redis/etc/
下一步我們在移動src裏面的相關命令,把全部標綠色的命令都移動到redis/bin/目錄地下,
這兩個目錄是我剛纔建立的,
這個時候已經安裝成功了,我們能夠啓動一下,
#cd bin
咱們剛纔說了啓動redis服務用我們的redis-server命令
#./redis-server
啓動,這個時候啓動成功,可是有一個
警告
:
你們會看到,他佔用我們當前的一個session(會話), 他沒有後臺啓動吧,端口是6379是他的一個默認端口,
可是沒有一個配置文件指定, 沒有指定配置文件,我剛剛說了,啓動的時候,是否是能夠指定我們的配置文件。
#./redis-server /usr/local/redis/etc/redis.conf
第一個警告沒有,啓動,那我如今仍是在前臺運行,佔用我們的session
我們先給她關閉掉,用Ctrl + C退出,那麼我們有沒有辦法讓他回臺運行呢,
還及得mysql當中啓動mysql後臺啓動mysql是怎麼啓動的嗎
#mysqld_safe --user=mysql &
若是要後臺啓動是否是
加一個&符,表示後臺做業,
那我們mogodb後臺啓動是怎麼啓動的,是否是加一個#--fork
這是mysql跟mogodb後臺啓動的兩種方式,那我們redis後臺啓動怎麼啓動啊,能用這兩種方式嗎,答案是不行的,那我們怎麼樣讓他進行後臺啓動呢,
首先我們啦看下配置文件,redis配置文件中有個daemonize,若是須要後臺運行,把該項改成yes,
我手工編輯一下,
#vi /usr/loval/redis/etc/redis.conf
首先第一項就是daemonize默認是no,把他改爲yes,下面咱們來啓動並指定他的配置文件,
你們來看如今是否是沒有東西在前臺做業了,可是啓動成功了沒有呢,那我們來看一下它的端口,看以進程啓動我們是否是用
#ps -ef | grep redis
那麼怎麼看它的端口,你們還記得redis的端口,默認端口是
6379,
我們查看這個6379端口占用了沒有,我們用命令:
#netstat -tunpl | grep 6379
也就是說我們的redis服務器啓動成功,而且我們的配置文件指定了
/usr/local/redis/etc/redis.conf
那麼配置文件裏面除了對我們後臺運行有配置,還有什麼配置啊,來我們詳細來看一下,
pidfile 配置多個pid的地址 默認在/var/run/redis.pid
還能夠綁定我們的ip用
bind 幫頂ip,設置後
只接受來自該ip的請求,
port 監聽端口,默認爲6379
timeout設置客戶端鏈接時的超時時間,單位爲秒,
loglevel,logfile ,日誌級別和日誌文件,
databases設置數據庫的個數,默認使用的數據庫爲0,
save設置redis進行數據庫鏡像的頻率,同步我們的數據,
rdbcompression在進行鏡像備份的時候,是否進行壓縮,
Slaveof作我們主從的,在從服務器上面來配置的,
設置數據庫爲其餘數據庫的從數據庫,等等一些內容,
Appendfsync 這是對我們的數據進行備份的第二種方式,設置對appendonly.aof文件同步的頻率,
vm打頭的全是設置虛擬內存的,
#vi redis.conf
看下配置文件裏面都有什麼內容,
大家這個時候我們的redis就啓動成功了,那麼redis啓動成功之後,我們怎麼創建,客戶端與服務器端的鏈接
用redis-cli
# ./redis-cli
這個時候是否是進入成功啊,看這裏有一個,提示,ip和端口,
退出是exit,或者是quit同樣的,
咱們關閉redis服務,能夠用
#pkill redis-server
#!net 回車輸出:
netstat -tunpl | grep 6379
#netstat -tunpl | grep 6379 按向上的箭頭便可出現,
這個時候咱們發現6379的端口沒有人佔用了,也就是說我們的redis服務器已經被關閉了
這個時候再
#./redis-cli 還能進去嗎
這裏有一個提示,
Could not connect to Redis at 127.0.0.1:6379:Connection refused