相比于其他的內存/緩存數據庫,redis可以方便的實現持久化的功能(保存至磁盤中)
一、關系數據庫與非關系型數據庫
1.1 關系型數據庫
一個結構化的數據庫,創建在關系模型基礎上一般面向于記錄
SQL語句 (標準數據查詢語言) 就是一種基于關系型數據庫的語言,用于執行對關系型數據庫中數據的檢索和操作。
主要有Oracle、MySQL、SQLServer、Microsoft Access、DB2等非關系型數據庫
1.2 非關系型數據庫
除了主流的關系型數據庫外的數據庫,都認為是非關系型
包括Redis、MongBD、Hbase、CouhDB等
1.3 關系型數據庫和非關系型數據庫的區別
1.3.1 數據存儲方式不同
關系型數據天然就是表格式的,因此存儲在數據表的行和列中。數據表可以彼此關聯協作存儲,也很容易提取數據。
非關系型數據不適合存儲在數據表的行和列中,而是大塊組合在一起。非關系型數據通常存儲在數據集中,就像文檔、鍵值對或者圖結構。你的數據及其特性是選擇數據存儲和提取方式的首要影響因素。
關系型 依賴于關系模型E-R圖,同時以表格形式的方式存儲數據
非關系型 除了以表格形式存儲之外,通常會以大塊的形式組合在一起進行存儲數據
1.3.2 擴展方式不同
SQL數據庫是縱向擴展,也就是說提高處理能力(增加更多的CPU),使用速度更快速的計算機,這樣處理相同的數據集就更快了。因為數據存儲在關系表中,操作的性能瓶頸可能涉及很多個表,這都需要通過提高計算機性能來克服。雖然SQL數據庫有很大擴展空間,但最終肯定會達到縱向擴展的上限。適用于小規模的數據庫或需要快速擴展的情況。
而NoSQL數據庫是橫向擴展的。因為非關系型數據存儲天然就是分布式的,NoSQL數據庫的擴展可以通過給資源池添加更多普通的數據庫服務器 (節點) 來分擔負載。將數據分片存儲在多臺服務器上,每臺服務器負責處理部分數據。通過分區、分片技術來實現數據的水平劃分和負載均衡。適用于大規模數據和高并發的場景。
關系 縱向 天然表格式
非關 橫向 天然分布式
1.3.2.1橫向擴展和復制的常用用途有:
1、讀操作的負載均衡。
2、寫操作的負載均衡。按信息角色分發,很少更新的表放在一個服務器,頻繁更新的表分割到多個服務器上面;按地理區域分割,流量直接定向到最近的服務器。
3、熱備份進行災難避免。配置專門的salve作為熱備份。
4、遠程復制進行災難避免。
5、制作備份。在完全不影響master的前提下執行備份。
6、生成報表。創建數據報表會降低服務器性能,影響較大,后臺作業可以專門salve執行。
橫向擴展只能擴展讀操作,不能擴展寫操作。分片(sharding)的技術擴展寫操作。
同步復制要求master必須等待所有slave的寫操作完成。需要額外的同步機制來保證一致性,一般通過兩階段提交(two-phase commit)協議來實現。協議之所以慢,是因為需要4次消息傳遞,包括事務消息和準備請求的消息,master的提交會被阻塞直到所有slave確認事務。異步復制只需要一條事務消息即可。
異步復制其實是犧牲一致性為代價換取性能
有兩個問題:1、master出現故障,事務就會消失;2、slave執行的查詢可能返回舊數據。
簡單拓撲和樹形拓撲用于橫向擴展,雙主拓撲用于故障轉移,環形拓撲和雙主結構允許站點本地允許時還能將變更復制到其他站點。
級聯復制,添加額外的slave作為中繼salve,通過管理一群slave來減輕master上的復制負載。普通salve需要將變更應用到數據庫,但不寫入二進制日志。relay需要寫入二進制日志,但不應用變更。realy使用blackhole引擎,relay會產生額外延遲。
過濾復制事件
1、master上過濾事件,master過濾器,控制哪些被寫入二進制日志。無法使用PITR準確恢復數據庫。binlog-do-db、binlog-ignore-db,多個數據庫需要重復使用選項。
2、salve上過濾事件,slave過濾器,控制哪些在slave上執行。所有變更通過網絡傳送,浪費帶寬??梢赃^濾數據庫,還可以過濾單個表以及使用通配符過濾一組表。replicate-do-db、replicate-ignore-db、replicate-do-table=dbname.tablename、replicate-ignore-table=dbname.tablename、replicate-wild-do-table、replicate-wild-ignore-table。
擔心網絡流量,可以在master保存完整二進制日志,relay過濾,減少流量。
數據的一致性管理
mysql5.6引入了全局事務標識符(GTID),master上提交的事務做個標記,等slave獲取到這個事務時才在slave上執行查詢。
級聯部署一致性,,第一是利用全局事務標識符來提升slave,并反復輪詢slave有沒有處理這個事務;第二是利用函數master-pos-wait函數將maeter到salve路徑上的relay都連接起來,保證所有變化都能傳遞到salve。
1.3.3 對事務的支持性不同
如果數據操作需要高事務性或者復雜數據查詢需要控制執行計劃,那么傳統的SQL數據庫從性能和穩定性方面考慮是最佳選擇。SQL數據庫支持對事務(ACID)原子性細粒度控制,并且易于回滾事務。
雖然NoSQL數據庫也可以使用事務操作,但穩定性方面沒法和關系型數據庫比較,所以它們真正閃亮的價值是在操作的擴展性和大數據量處理方面。
① 關系型:特別適合高事務性要求和需要控制執行計劃的任務
② 非關系:此處會稍顯弱勢,其價值點在于高擴展性和大數據量處理方面
1.3.4 非關系型數據庫產生背景
可用于應對Web2.0純動態網站類型的三高問題。
(1) High performance-------對數據庫高并發讀寫需求
(2) HugeStorage--------------對海量數據高效存儲與訪問需求
(3) High Scalability && High Availability------- 對數據庫高可擴展性與高可用性需求
關系型數據庫和非關系型數據庫都有各自的特點與應用場景,兩者的緊密結合將會給Web2.0的數據庫發展帶來新的思路。
讓關系數據庫關注在關系上,非關系型數據庫關注在存儲上。
例如,在讀寫分離的MySQL數據庫環境中,可以把經常訪問的數據存儲在非關系型數據庫中,提升訪問速度。
MySQL高熱數據 ----》 redis
web ----》 redis ----》 MySQL
CPU ----》 內存/緩存 ----》 磁盤
總結
關系型數據庫:
實例–>數據庫–>表(table)–>記錄行(row)、數據字段(column)——》存儲數據
非關系型數據庫:
實例–>數據庫–>集合(collection) -->鍵值對(key-value)
workdir=/usr/local/mysql
非關系型數據庫不需要手動建數據庫和集合(表)。
二、Redis簡介
Redis是一個開源的、使用C語言編寫的NoSQL 數據庫。【非關系型數據庫】
Redis基于內存運行并支持持久化(支持存儲在磁盤),采用**key-value (鍵值對)**的存儲形式,是目前分布式架構中不可或缺的一環。
2.1 Redis服務器程序的單線程模型
Redis服務器程序是單進程模型
Redis服務在一臺服務器上可以同時啟動多個Redis進程,Redis的實際處理速度則是完全依靠于主進程的執行效率。若在服務器上只運行一個Redis進程,當多個客戶端同時訪問時,服務器的處理能力是會有一定程度的下降;若在同一臺服務器上開啟多個Redis進程,Redis在提高并發處理能力的同時會給服務器的CPU造成很大壓力。即: 在實際生產環境中,需要根據實際的需求來決定開啟多少個Redis進程。
建議可以開2個進程
1、備份
2、抗高并發的同時盡量不給CPU造成太大的壓力
若對高并發要求更高一些,可能會考慮在同一臺服務器上開啟多個進程。若CPU資源比較緊張,采用單進程即可。
單進程快速的原因:
PS : 補充加深一點
使用 epoll(默認) + I/O多路復用機制
首先,Redis 是跑在單進程中的,所有的操作都是按照順序線性執行的,但是由于讀寫操作等待用戶輸入或輸出都是阻塞的,所以 I/O 操作在一般情況下往往不能直接返回,這會導致某一文件的 I/O 阻塞導致整個進程無法對其它客戶提供服務,而 I/O 多路復用就是為了解決這個問題而出現的。
epoll 機制優勢:
1. epoll 沒有最大并發連接的限制,上限是最大可以打開文件的數目,這個數字一般遠大于 2048, 一般來說這個數目和系統內存關系很大 ,具體數目可以 cat /proc/sys/fs/file-max 察看。
2. 效率提升, Epoll 最大的優點就在于它只管你“活躍”的連接 ,而跟連接總數無關,因此在實際的網絡環境中, Epoll 的效率就會遠遠高于 select 和 poll 。
3. 內存拷貝, Epoll 在這點上使用了“共享內存 ”,這個內存拷貝也省略了
I/O多路復用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒,能夠通知程序進行相應的操作。
2.2 I/O復用技術介紹
一個線程同時追蹤、管理多個連接(原本默認情況下是一個線程對應一個連接)
回調: 預先定義具體的執行過程(定義一個方法) ,等待調用,在一個線程給執行時,可以根據“觸發器”“鉤子” 完成回調,回調的目的是提高處理性能 和節省資源
2.3 Redis 具有以下幾個優點(redis 特性(與其他nosql對比))
(1)、具有極高的數據讀寫速度:數據讀取的速度最高可達到 110000 次/s,數據寫入速度最高可達到 81000 次/s。
(2)、支持豐富的數據類型:支持key-value、 Strings、Lists、 Hashes(散列值)、 Sets 及Ordered Sets 等數據類型操作。
ps:
string 字符串(可以為整形、浮點和字符型,統稱為元素)
list 列表:(實現隊列,元素不唯一,先入先出原則)
set 集合:(各不相同的元素)
hash hash散列值:(hash的key必須是唯一的)
set /ordered sets 集合/有序集合
(3)支持數據的持久化:可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
(4)原子性:Redis所有操作都是原子性的。
(5)支持數據備份:即master-salve 模式的數據備份。
豐富的特性 – Redis還支持 publish(消息發布)/subscribe(訂閱), 通知, 設置key有效期等等特性。
Redis作為基于內存運行的數據庫,緩存是其最常應用的場景之一。除此之外,Redis常見應用場景:包括獲取最新N個數據的操作、排行榜類應用、計數器應用、存儲關系、實時分析系統、日志記錄。
支持key-value、 Strings、Lists、 Hashes(散列值)、 Sets 及Ordered Sets 等數據類型操作。
三、安裝Redis和Redis命令工具
3.1 安裝Redis
systemctl stop firewalld
setenforce 0
yum install -y gcc gcc-c++ make
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7/
make && make PREFIX=/usr/local/redis install
#由于Redis源碼包中直接提供了Makefile 文件,所以在解壓完軟件包后,不用先執行./configure 進行配置,可直接執行make與make install命令進行安裝