關系資料庫與非關系型資料庫
··1、關系型資料庫
·· 關系型資料 庫是一**個結構化的資料**庫,建立在關系模型(二維表格模型)基礎上,一般面向于記錄。
`·SQL語句(标準資料查詢語言)就是一種基**于關系型**資料庫的語 言,用于執**行對關系型資料庫中**資料的檢索和操作。主流的關系型數··據庫包括Oracle、MySQL、sQLServer、 Microsoft Access、DB2等。
2、非關系型資料庫
··NosQL(NoSQL=NotonlysQL),意思是"不僅**僅是sQL",是非關系型資料庫的總稱。
··除了主流的關系型資料庫外的資料庫,都認為是非關系**型。主流的NosQL資料庫有Redis、MongBD、 Hbase、Memcached等。
3、關系型教據庫和非關系型資料庫差別
··資料存儲方式不同:
··關系型和非關系型資料庫的主要差異是資料存儲的方式。
··關系型資料天然就是表格式的,是以存儲在資料表的行和**列中。資料表可以彼此關聯協作存儲,也很容易提取資料。與其相反,非關系型資料不适合存儲在資料表的行和列中,而是大塊組合在一起。**非關系型資料通常存儲在資料集中,就像文檔、鍵值對或者圖結構。你的···資料及**其特 性 是選**擇資料存儲和提取萬式的首要影響因素。
①關系型:依賴于關系模**型E-R圖,同時以表格式的方式存儲資料
②非關系型:除了以表格形式存儲之**外,通常會以大塊的形式組合在一起進行存儲資料
··擴充方式不同:
···SQL,和NosQL資料庫最大**的差别可能**是在擴充方式上,要支援日益增長的需求當然要擴充。要支援更多并發量,SgL,資料庫是縱向擴···展,也就是說提高處理能力,使用速度更快速的計算機,**這樣處**理相同的資料集就更快了。
··因為數 據存儲在關系表中,操作**的性能瓶頸**可能涉及很多個表,這都需要通過提高**計算機性能**來克服。雖然SQL資料庫有很天擴充空間,但最終肯 定會達到縱向擴充的上限。而NosQL資料庫是橫向擴充的。 因為非關系型資料**存儲天**然就是分布式的,No8QL資料庫的擴充可以通過給資源池**添加更多普通的資料庫伺服器(節點)來分擔負載。
關系:縱向(天然表格式); 非關:橫向(天然分布式)**
對事務性的支援不同
·· 如果資料操作需要高事務性或者複雜資料查詢需要控制執行計劃,那麼傳統的RQL數**據庫從性能**和穩定性方面考慮是最佳選擇。SQL資料 庫支援對事**務原子性**細粒度控制,并且易于復原事務。
··雖然NosQL資料庫**也可以 使**用事務操**作,但穩定性方**面沒法和關系型資料庫比較,是以它們真正閃亮的價值是在操作的擴充性和大··資料量處 理方面。
··關系型:特别适合高事務性要求和**需要控制執**行計劃的任務;非關系:此處會稍顯弱勢,其**價值點在于高**擴充性和大資料量處理方面
··4、非關系型資料庫産生背景
關系型資料庫和非關系型資料庫都有各自的特點與應用場景,兩者的緊**密結合将會**給Web2.0的資料庫發展帶來新的思路。讓關系資料庫關注在 關系上,**非關系型資料**庫關注在存儲上。
例如,在讀寫分離的MysQt.資料庫環境中,可以把經常通路的資料存儲在非關系型資料庫 中,提升通路速度。
關系資料庫:儲存位置磁盤
非關資料庫(記憶體/緩存資料庫):保**存的位置是**緩存/記憶體(效率、速度塊〉特殊的是redis,因為redis 可以将記憶體中的資料儲存在磁盤中
Mysql 高熱玫據——》redisweb ——redis —》mysglCPU——》記憶體/緩存—》磁盤
總結:
關系型資料庫:
執行個體->資料庫L>表(table)->記錄行(row)、資料字段(column)—》存儲資料
非關系型資料庫:
執行個體**->資料庫->集合(collection) -->鍵值對(key-value)workdir=/usr/ local/mysql
非關系型資料庫不需要手動建資料**庫和集合(表)。
Redis簡介
1、Redis是一個開源的、使用C語言編寫的NoSQL資料庫。
Redis基于記憶體運作并支援持久化(支援存儲在磁盤),采用key-value(鍵值對**)的存儲形式,是目前分布式架構中不可或缺的一環。
2、Redis伺服器程式是單程序模型
Redis服務在一台伺服器上可以同時啟動多個Redis程序,Redis的實際處理速度則足完全依靠于主程序的執行效率**。若在伺服器上隻運作一個Redis程序,當多個用戶端同時通路時,伺服器的處理能力是會有一定程度的下降:若在同一台伺服器上開啟多個Redis程序,
Redis在提高 并發處理能力的同時會給伺服器的cPt造成很大壓力。即:在實際生産環境中,需要根據實際的需求來決定開啟多少個Redis程序。
建議可以開2個程序
原因:
1、備份
2、抗高并發的同時盡量不給cPu造成太大的壓力若對高并發要求更高一些,可能會考慮在同一台伺服器上開啟多個程序。
若cPo資源比較緊張,采用單程序即可。
3、Redis具有的有點
比較對象sql資料庫和其他nosql資料庫
具有極高的資料讀寫速度:資料讀取的速度最高可達到110000 次/s,資料寫入速度最高可達到81000 次/s。
支援豐富的資料類型:支援key-value、Strings、Lists、Hashes(散列值)、Sets 及ordered Sets等資料類型操作
string 字元串(可以為整形、浮點和字元型,統稱為元素)
list 清單 (實作隊列,元素不唯一,先入先出原則)
set 集合: (各不相同的元素)
hash hash散列值: ( hash的key必須是唯一的)
set /ordered ets 集合/有序集合
- 支援資料的持久化:可以将記憶體中的資料儲存在磁盤中,重新開機的時候可以再次加載進行使用。
- 原子性:Re dis所有操作都是原子性的。
- 支援資料備份:即master-salve模式的資料備份。
redis部署步驟
1、Redis安裝部署
- 上傳 redis-5.0.7.tar.gz 軟體包解壓至 /opt目錄下
tar xzf redis-5.0.7.tar.gz -C /opt
- 安裝依賴元件
yum install -y gcc gcc-c++ make
- 編譯安裝
cd /opt/ redis-5.0.7/
make
make PREFIX=/usr/local/redis install
由于Redis源碼包中直接提供了Makefile檔案,是以在解壓完軟體包後,不用先執行,./configure;進行配置,可直接執行make 與make install指令進行安裝
- 執行軟體包提供的 install_server.sh 腳本檔案設定Redis服務所需要的相關配置檔案
cd /opt/redis-5.0.7/utils
./install_server.sh
回車。。。。
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server
#需要手動修改為/usr/local/redis/bin/redis-server注意要一次性正确輸入

selected config:
Port : 6379 #預設偵聽端口為6379
Config file : /etc/redis/6379.conf #配置檔案路徑
Log file : /var/log/redis_6379.log #日志檔案路徑
Data dir : /var/lib/ redis/ 6379 #資料檔案路徑
Executable : /usr/local/redis/bin/redis-server #可執行檔案路徑
cli Executable : /usr/local/redis/bin/redis-cli #用戶端指令工具
- 把redis的可執行檔案放入路徑環境變量的目錄中便于系統識别
ln -s /usr/local/redis/bin/* /usr/local/bin/
- Redis服務控制
/etc/init.d/ redis_6379 stop #停止
/etc/init.d/redis_6379 start #啟動
/etc/init.d/redis_6379 restart #重新開機
/etc/init.d/redis_6379 status #狀态
- 修改配置 /etc/redis/6379.conf 參數
vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.80.1 #70行,添加監聽的主機位址(隻改了這一個)
port 6379 #93行,Redis預設的監聽端口
daemonize yes #137行,啟用守護程序
pidfile /var/run/redis_6379.pid #159行,指定PID檔案
loglevel notice #167行,日志級别
logfile /var/log/redis_6379.log #172行,指定日志檔案
- 重新啟動
/etc/init.d/redis_6379 restart
1、Redis指令工具
redis-server:用于啟動Redis 的工具
redis-benchmark:用于檢測Redis在本機的運作效率
redis-check-aof:修複AOF持久化檔案
redis-check-rdb:修複RDB持久化檔案
redis-cli: Redis 指令行工具.
# rdb和aof 是redis服務中持久化功能的兩種形式 RDB AOF
# redis-cli 常用于登陸至 redis資料庫
2、redis-cli 指令行工具(遠端登陸)
文法: redis-cli -h host -p port -a password
-h :指定遠端主機
-p:指定Redis 服務的端口号
-a :指定密碼,未設定資料庫密碼可以省略-a選項
若不添加任何選項表示,則使用127.0.0.1:6379連接配接本機上的 Redis資料庫
redis-cli -h 192.168.80.1 -p 6379
3、redis-benchmark 測試工具
redis-benchmark 是官方自帶的 Redis 性能測試工具,可以有效的測試Redis服務的性能。
基本的測試文法: redis-benchmark [選項] [選項值]
-h:指定伺服器主機名。
-p:指定伺服器端口。
-s:指定伺服器socket(套接字)
-c:指定并發連接配接數。
-n:指定請求數。
-d:以位元組的形式指定 SET/GET值的資料大小。
-k: 1=keep alive O=reconnect
-r: SET/GET/INCR 使用随機key,SADD使用随機值。
-P:通過管道傳輸<numreq>請求。
-q:強制退出redis。僅顯示query/sec值。
--csv:以cSv格式輸出。
-l:生成循環,永久執行測試。
-t:僅運作以逗号分隔的測試指令清單。
-I : Idle模式。僅打開N個idle連接配接并等待。
- 向IP位址為192.168.112.110、端口為6379 的Redis伺服器發送100個并發連接配接與100000個請求測試性能
redis-benchmark -h 192.168.112.110 -p 6379 -c 100 -n 100000 #測試每秒的資料類型平均請求連接配接出來
- 測試存取大小為100位元組的資料包的性能
redis-benchmark -h 192.168.112.110 -p 6379 -q -d 100
- 測試本機上Redis 服務在進行set 與push操作時的性能
redis-benchmark -t set,push -n 100000 -q
4、Redis資料庫常用指令
set:存放資料,指令格式為set key value
get:擷取資料,指令格式為get key
[[email protected] utils]# redis-cli 進入資料庫
127.0.0.1:6379>
- 檢視目前資料庫中所有的鍵
keys * //相當于MySQL中的show databases;
- 存放資料
set teacher zhangsan //存放teacher鍵,值為zhangsan
get teacher 擷取
-
keys指令可以取符合規則的鍵值清單,通常情況可以結合*,?等選項來使用
建立存放資料模闆
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> set k1 2
OK
127.0.0.1:6379> set k2 2
OK
127.0.0.1:6379> set k3 3
OK
127.0.0.1:6379> set v1 4
OK
127.0.0.1:6379> set v5 5
OK
127.0.0.1:6379> set v22 5
OK
- 檢視目前資料庫中以v開頭的資料
127.0.0.1:6379> keys v*
- 檢視目前資料庫中以v開頭後面包含任意一位的資料
127.0.0.1:6379> keys v?
- 檢視目前資料庫中以v開頭v開頭後面包換任意兩個的資料
127.0.0.1:6379> keys v??
- exists指令可以判斷鍵值是否存在
127.0.0.1:6379> exists teacher
(integer) 1 //傳回為1說明有此鍵
- del指令可以删除目前資料庫的指定key
127.0.0.1:6379> del teacher
(integer) 1
127.0.0.1:6379> exists teacher
(integer) 0
127.0.0.1:6379> get teacher
(nil)
- rename指令是對已有key進行重命名。(覆寫)
指令格式: rename 源key 目标key
使用rename指令進行重命名時,無論目标key是否存在都進行重命名,且源key的值會覆寫目标key的值。在實際使用過程中,建議先用exists指令檢視目标key是否存在,然後再決定是否執行rename指令,以避免覆寫重要資料
127.0.0.1:6379> rename k1 k11 //重命名會做覆寫
-
renamenx
rename n不進行修改 x進行修改
nx組合:先判斷指令的作用是對已有key進行重命名,并檢測新名是否存在,如果目标key存在則不進行重命名。(不覆寫)
指令格式: renamenx 源key 目标key
- desize指令的作用是檢視目前資料庫中key的數目
127.0.0.1:6379> dbsize
(integer) 9 //目前庫中有9個鍵
- 使用config set requirepass your password 指令設定密碼
127.0.0.1:6379> config set requirepass 123456 //以鍵值的方式進行存儲
OK
127.0.0.1:6379> auth 123456 //認證
OK
127.0.0.1:6379> config get requirepass //擷取密碼
1) "requirepass"
2) "123456"
- 删除密碼
127.0.0.1:6379> config set requirepass '' //密碼設定為空
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
Redis 多資料庫常用指令(16個庫 0-15)
Redis支援多資料庫,Redis預設情況下包含16個資料庫,資料庫名稱是用數字0-15來依次命名的。多資料庫互相獨立,互不幹擾。
- 多資料庫間切換
指令格式: select 序号
127.0.0.1:6379> select 10 ##切換至序号為10的資料庫
OK
127.0.0.1:6379[10]> select 15
OK
127.0.0.1:6379[15]> select 16
(error) ERR DB index is out of range
127.0.0.1:6379[15]> select 0
OK
127.0.0.1:6379> set k1 100 #在序号為0的資料庫寫入
OK
127.0.0.1:6379> get k1
"100"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get k1 #切換至其他資料庫查詢不到
(nil)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get k1
"100"
使用redis-cli連接配接Redis資料庫後,預設使用的是序号為0的資料庫。
- 多資料庫間移動資料
格式: move 鍵值 序号
Redis 高可用
···持久化:持久化是最簡單的高可用方法(有時甚**至不被歸為高可**用的手段),主要作用是資料備份,即将資料存儲在硬碟, 保證資料不會··因程序退出而丢失。
··主從複制:主從複制是高可用Redis的基礎,**哨兵和叢集**(cluster)都是在主從複制基礎上實作高可用的。
··主 從複制主要實作**了資料的多**機備份,以及對于讀操作的負載均衡和簡單的故障恢複。缺陷:故障恢複無法自動化;寫操作 無法負載均··衡;存儲能力受**到單機的限**制(吃資源)。
`·哨兵﹔在主從複制的基礎上,哨兵實作了自動化的故障恢複。
··缺陷:寫操作無法負載**均衡;存儲能**力受到單機的限制。
··叢集(cluster) :通過叢集,
Redis持久化
··持久化的功能:Redis是記憶體資料庫,資料都是存儲在記憶體中,為了避免伺服器斷電等原因導緻Redis程序異常退出後資料 的永久丢失,··需要定期将Redis中的資料以某種形式(或命資料令)從記憶體儲存到硬碟;
···當下次Redis重新開機時,利用持久化檔案實作資料恢複。除此之外,為了進行災難備份,可以将持久化檔案拷貝到一個遠端位置(NFS) 。
1、Redis提供兩種方式進行持久化:
RDB持久化:原理是将Reids在記憶體中的資料庫記錄定時儲存到磁盤上。
( 類似快照)AOF持久化(append only file):原理是将Reids的操作日**志以追加的**方式寫入檔案,類似于MySQL的binlogo(基于 日志持久化方式)由于A**OF持久化的實**時性更好,即當程序意外退出時丢失的資料更少,是以A**z**流的持久化方式, RDB持久**化基本都會**開啟(用于叢集
··2、RDB持久化
··RDB持久化是指在指定的**時間間隔**内将記憶體中目前程序中的資料生成快照儲存到硬碟(是以也稱作快照持久化),用二進制 壓縮存儲,儲存的檔案字尾是rdb;當Redis重新啟動時,可以**讀取快照文**件恢複資料。
···3、觸發條件
··①手動觸發:save指令和bgsave指令都可以生成RDB檔案。
··save指令會阻塞Redis伺服器程序,直到**RDB檔案創**建完畢為止, 在Redis伺服器阻**塞期間,服**務器不能處理任何指令 請求。而`··bgsave指令會建立一個子程序,由子程序來負責建立RDB檔案 ,父程序(即Redis主程序)則繼續處理請求。
···bgsave指令執行過程中,隻有**fork子程序時**會阻塞伺服器,而對 于save指令,整個過程都會阻塞伺服器,是以save已基本被廢棄,線上環境要杜絕save的使用。往往生産環境bgsave依 然不允許輕易使用
···②自動觸發:在自動觸發RDB持久化時,Redis也會選擇bgsave而不是save來進行持久化。
自動觸發最常見的情況是**在配置檔案中**通過save m n,指定當m秒内發生n次變化時,會觸發bgsave
vim /etc/redis/6379.conf
#----219行----以下三個save條件滿足任意一個時,都會引起bgsave的調用
save 900 1 :當時間到900秒時,如果redis資料發生了至少1次變化,則執行bgsave
save 300 10 :當時間到300秒時,如果redis資料發生了至少10次變化,則執行bgsave
save 60 10000 :當時間到60秒時,如果redis資料發生了至少10000次變化,則執行bgsave
#----242行----是否開啟RDB檔案壓縮
rdbcompression yes
#----254行----指定RDB檔案名
dbfilename dump.rdb
#----264行----指定RDB檔案和AOF檔案所在目錄
dir /var/lib/redis/6379
···③其他自動觸發機制
除了save m n 以外,還有一些其他情況會觸發bgsave:
在主從複制場景下,如果從節點執行全量複制操作,則主節點會執行bgsave指令,并将rdb檔案發送給從節點。
執行shutdown指令時,自動執行rdb持久化
4、執行流程
···①Redis父進**程首先判**斷:目前是否在執行save,或bgsave/bgrewriteao**z**程序,如果在執行則bgsav**z**傳回。 bgsave/bgrewriteaof的子進**程不能**同時執行,主要是基于性能方面的考慮:兩個并發的子程序同時執行大量的磁盤寫操作,可能引起嚴重的性能問題。
···②父**程序執**行fork**z**子程序,這個過程中父程序是阻塞的,Redis不能執行來自用戶端的任何指令
···③父程序fork後,bgsave指令傳回”Background saving started”資訊并不再阻塞父程序,**并可以響應其**他指令
···④子程序建立RDB檔案,根據父程序記憶體快照生成臨時快照檔案,**完成後對**原有檔案進行原子替換
···⑤子程序發送信号**給父程序表示**完成,父程序更新統計資訊
AOF 持久化
···RDB持久化是将程序資料寫入檔案,而AOF持久化,則是**将Redis執**行的每次寫、删除指令記錄到**單獨的**日志檔案 中,查詢操作不··會記錄; 當Redis重新開機時再次執行A**z**中的指令來恢複資料。
與RDB相比,AOF的實時性更好,是以已成為主流的持久化方案
- 開啟AOF
vim /etc/redis/6379.conf
#----700行----修改;開啟AOF
appendonly yes
#----704行----指定AOF檔案名稱
appendfilename "appendonly.aof"
#----796行----是否忽略最後一條可能存在問題的指令
aof-load-truncated yes
#指redis在恢複時,會忽略最後一條可能存在問題的指令,預設為yes,即在aof寫入時,可能存在指令錯誤的問題(突然斷電導緻未執行結束),這種情況下,yes會log并繼續,而no會直接恢複失敗
/etc/init.d/redis_6379 restart
#需要先取消密碼
RDB 和 AOF 的優缺點
RDB 持久化
··優點:RDB檔案緊湊,體積小,網絡傳輸快,适合全量複制;恢複速**度比AOF快很**多。當然,與AOF相比,RDB最重要 的優點之一是對性能的影響相對較小。
···缺點:RDB檔案的緻命缺點在于其資料快照的持**久化方式決定了**必然做不到實時持久化,而在資料越來越重要的今天,資料的大量丢失很多時候是無法接受的,**是以AOF**持久化成為主流。此外,RDB檔案需要滿足特定格式,相容性差(如老 版本的Redis不相容新版本的RDB檔案)。
····對于RDB持久化,一方面是bgsave在進行fork操作時Redis主程序會阻塞,**另一方面,子進**程向硬碟寫資料也會帶來IO壓力。
AOF 持久化
···在這與RDB持久化相對應,AOF的優點在于支援秒級持久化、相容性好,缺點是文**件大、恢複速度慢、**對性能影響大。對于 AOF持久···化,向硬碟寫資料的頻率大大提高(everysec政策下為秒級),IO壓力更大,甚至可能造成AOF追加阻塞問題。AOF 檔案的重寫與RDB的bgsave類似,會有fork時的阻塞和子程序的IO壓力問**題。相對來**說,由于AOF向硬碟中寫資料的頻率 更高,是以對 Redis主程序**性能··的影響會**更大裡插入代碼片
Redis 性能管理
- 檢視Redis記憶體使用
redis-cli -h 192.168.112.110 -p 6379
info memory
···記憶體碎片率:
··作業系統配置設定的記憶體值used_memory_rss除以Redis使用的記憶體值used_memory計算得出**記憶體碎片**是由作業系統低效的配置設定/回收實體内··存導緻的(不連續的**實體記憶體分**配)跟蹤記憶體碎片率對了解Redis執行個體的資源性能是非常重要的:記憶體碎 片率稍大于1是合理的,這個值表示記憶體碎片率比較低記憶體碎片率超過1.5,說明Redis消耗**了實際需要**實體記憶體的150%,其中50%是記憶體碎片率。需要在redis-cli···工具上輸入shutdown save 指令,并重新開機 Redis 伺服器。記憶體碎片率低于1的,說明 Redis記憶體配置設定超出了實體記憶體,作業系統正在進·行記憶體交換。需要增**加可用實體**記憶體或減少 Redis 記憶體占用。
`··記憶體使用率:
···redis執行個體的記憶體使用率超過可用最大記憶體,操作**系統将開始進**行記憶體與swap空間交換。
···避免記憶體交換發生的方法:針對緩存資料大小選擇安裝 Redis 執行個體盡可**能的使用H**ash資料結構存儲,設定key的過期時 間
内回收key:
···保證合理配置設定redis有限的内**存資源**。當達到設定的最大閥值時,需選擇一種k**ey的回收策**略,預設情況下回收政策是禁止删除。配置檔案中修改 maxmemory-policy 屬性值:
vim /etc/redis/6379.conf
#----598取消注釋----
maxmemory-policy noenviction
volatile-lru :使用LRU算法從已設定過期時間的資料集合中淘汰資料
volatile-ttl :從已設定過期時間的資料集合中挑選即将過期的資料淘汰
volatile-random :從已設定過期時間的資料集合中随機挑選資料淘汰
allkeys-lru :使用LRU算法從所有資料集合中淘汰資料
allkeys-random :從資料集合中任意選擇資料淘汰
noenviction :禁止淘汰資料