一、關系數據庫與非關系型數據庫
1.1 關系型數據庫
1.關系型數據庫是一個結構化的數據庫,創(chuàng)建在關系模型(二維表格模型)基礎上,一般面向于記錄
2.SQL語句(標準數據查詢語言)就是一種基于關系型數據庫的語言,用于執(zhí)行對關系型數據庫中數據的檢索和操作
3.主流的關系型數據庫包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等
1.2 非關系型數據庫
1.NoSQL(NoSQL = Not Only SQL ),意思是“不僅僅是 SQL”,是非關系型數據庫的總稱
2.除了主流的關系型數據庫外的數據庫,都認為是非關系型
3.主流的NoSQL數據庫有 Redis、MongBD、Hbase、Memcached等
1.3 關系數據庫與非關系型數據庫區(qū)別
1.3.1 數據存儲方式不同
1.關系型和非關系型數據庫的主要差異是數據存儲的方式。關系型數據天然就是表格式的,因此存儲在數據表的行和列中。數據表可以彼此關聯協作存儲,也很容易提取數據
2.與其相反,非關系型數據不適合存儲在數據表的行和列中,而是大塊組合在一起。非關系型數據通常存儲在數據集中,就像文檔、鍵值對或者圖結構。你的數據及其特性是選擇數據存儲和提取方式的首要影響因素
1.3.2 擴展方式不同
1.SQL和NoSQL數據庫最大的差別可能是在擴展方式上,要支持日益增長的需求當然要擴展
2.要支持更多并發(fā)量,SQL數據庫是縱向擴展,也就是說提高處理能力,使用速度更快速的計算機,這樣處理相同的數據集就更快了。因為數據存儲在關系表中,操作的性能瓶頸可能涉及很多個表,這都需要通過提高計算機性能來客服。雖然SQL數據庫有很大擴展空間,但最終肯定會達到縱向擴展的上限
3.NoSQL數據庫是橫向擴展的。因為非關系型數據存儲天然就是分布式的,NoSQL數據庫的擴展可以通過給資源池添加更多普通的數據庫服務器(節(jié)點)來分擔負載
1.3.3 對事務性的支持不同
1.如果數據操作需要高事務性或者復雜數據查詢需要控制執(zhí)行計劃,那么傳統(tǒng)的SQL數據庫從性能和穩(wěn)定性方面考慮是你的最佳選擇。SQL數據庫支持對事務原子性細粒度控制,并且易于回滾事務
2.雖然NoSQL數據庫也可以使用事務操作,但穩(wěn)定性方面沒法和關系型數據庫比較,所以它們真正閃亮的價值是在操作的擴展性和大數據量處理方面
1.4 非關系型數據庫產生背景
1.可用于應對web2.0純動態(tài)網站類型的三高問題
1)High performance————對數據庫高并發(fā)讀寫要求
2)Huge Storage————對海量數據高效存儲與訪問需求
3)High Scalability && High Availability————對數據庫高可擴展性與高可用性需求
2.關系型數據庫和非關系型數據庫都有各自的特點與應用場景,兩者的緊密結合將會給Web2.0的數據庫發(fā)展帶來新的思路。讓關系數據庫關注在關系上,非關系型數據庫關注在存儲上。例如,在讀寫分離的MySQL數據庫環(huán)境中,可以把經常訪問的數據存儲在非關系型數據庫中,提升訪問速度
1.5 總結
關系型數據庫:實例——數據庫——表——記錄行、數據字段
非關系型數據庫:實例——數據庫——集合——鍵值對,不需要手動建數據庫和集合(表)
二、Redis
2.1 簡介
1.Redis是一個開源的、使用C語言編寫的NoSQL數據庫
2.Redis基于內存運行并支持持久化,采用key-value(鍵值對)的存儲形式,是目前分布式架構中不可或缺的一環(huán)
2.2 Redis的單線程模式
1.Redis服務器程序是單進程模型,也就是在一臺服務器上可以同時啟動多個Redis進程,Redis的實際處理速度則是完全依靠于主進程的執(zhí)行效率
2.若在服務器上只運行一個Redis進程,當多個客戶端同時訪問時,服務器的處理能力是會有一定程度的下降
3.若在同一臺服務器上開啟多個Redis進程,Redis在提高并發(fā)處理能力的同時會給服務器的CPU造成很大壓力
4.在實際生產環(huán)境中,需要根據實際的需求來決定開啟多少個Redis進程。若對高并發(fā)要求更高一些,可能會考慮在同一臺服務器上開啟多個進程。若 CPU 資源比較緊張,采用單進程即可
2.3 Redis的優(yōu)點
1.具有極高的數據讀寫速度:數據讀取的速度最高可達到110000次/s,數據寫入速度最高可達到81000次/s
2.支持豐富的數據類型:支持key-value、Strings、Lists、Hashes、Sets及Sorted Sets等數據類型操作
1)string :字符串(可以為整型、浮點型和字符串,通稱為元素)
2)list :列表(實現隊列,元素不唯一,先入先出原則)
3)set :集合(各不相同的元素)
4)hash :hash散列值(hash的key必須是唯一的)
5)set/sorted set :集合/有序集合
3.支持數據的持久化:可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用
4.原子性:Redis所有操作都是原子性的
5.支持數據備份:即master-salve模式的數據備份
2.4 Redis的應用場景
Redis作為基于內存運行的數據庫,緩存是其最常應用的場景之一。除此之外,Redis常見應用場景還包括獲取最新N個數據的操作、排行榜類應用、計數器應用、存儲關系、實時分析系統(tǒng)、日志記錄
2.5 Redis速度快的原因
1.Redis是純內存結構,避免了磁盤的I/O等耗時操作
2.Redis命令處理的核心模塊為單線程,減少了鎖競爭,以及頻繁創(chuàng)建線程和銷毀線程的代價,減少了線程上下文切換的消耗
3. 采用了I/O多路復用機制,大大提升了并發(fā)效率
注:I/O多路復用程序雖然會同時監(jiān)聽多個socket連接,但是其會將監(jiān)聽的socket都放到一個隊列里面,然后通過這個隊列有序的,同步的將每個socket對應的時間傳送到文件事件分派器,再由文件事件分派器給對應的事件處理器進行處理,只有當一個socket所對應的事件被處理完畢之后,I/O多路復用程序才會繼續(xù)向文件事件分派器傳送下一個socket所對應的的事件,這也可以驗證上面的結論,處理客戶端的命令請求是單線程的方式逐個處理,但是事件處理器內并不是只有一個線程
三、Redis安裝部署
3.1 關閉防火墻和安全功能
systemctl stop firewalld
setenforce 0
yum install -y gcc gcc-c++ make
3.2 解壓包并編譯安裝
cd /opt
tar zxvf redis-5.0.7.tar.gz
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
#由于Redis源碼包中直接提供了makefile文件,所以在解壓完軟件后,不用先執(zhí)行 ./configure 進行配置,可直接執(zhí)行make與make install命令進行安裝
3.3 執(zhí)行并修改配置文件
#執(zhí)行軟件包中提供的 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 #默認監(jiān)聽端口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 #可執(zhí)行文件路徑
Cli Executable : /usr/local/redis/bin/redis-cli #客戶端命令工具
----------------------------------------------------------
3.4 將redis的可執(zhí)行程序文件放入路徑環(huán)境變量
ln -s /usr/local/redis/bin/* /usr/local/bin/
/etc/init.d/redis_6379 stop #停止
/etc/init.d/redis_6379 start #啟動
/etc/init.d/redis_6379 restart #重啟
/etc/init.d/redis_6379 status #狀態(tài)
3.5 修改配置/etc/redis/6379.conf參數
vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.80.11 #70行,添加 監(jiān)聽的主機地址
port 6379 #93行,Redis默認的監(jiān)聽端口
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 #重啟redis服務
netstat -natp | grep redis
四、Redis命令工具
redis-server #用于啟動 Redis 的工具
redis-cli #Redis命令行工具
redis-benchmark #用于檢測 Redis 在本機的運行效率
redis-check-aof #修復 AOF 持久化文件
redis-check-rdb #修復 RDB 持久化文件
4.1 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.11 -p 6379 -a 264196
4.2 redis-benchmark測試工具
redis-benchmark 是官方自帶的Redis性能測試工具,可以有效的測試 Redis服務的性能
語法:redis-benchmark [選項] [選項值]
-h 指定服務器主機名
-p 指定服務器端口
-s 指定服務器socket
-c 指定并發(fā)連接數
-n 指定請求數
-d 以字節(jié)的形式指定 SET/GET 值的數據大小。
-k 1=keep alive 0=reconnect
-r SET/GET/INCR 使用隨機 key, SADD使用隨機值
-P 通過管道傳輸請求
-q 強制退出 redis。僅顯示query/sec值
–csv 以CSV格式輸出
-l 生成循環(huán),永久執(zhí)行測試
-t 僅運行以逗號分隔的測試命令列表
-I Idle 模式。僅打開N個idle連接并等待
例:
向IP地址為 192.168.80.11、端口為6379的 Redis服務器發(fā)送100個并發(fā)連接與10萬個請求測試性能
redis-benchmark -h 192.168.80.11 -p 6379 -c 100 -n 100000
測試存取大小為100字節(jié)的數據包的性能
redis-benchmark -h 192.168.80.11 -p 6379 -q -d 100
測試本機上Redis服務在進行set與lpush操作時的性能
redis-benchmark -t set,lpush -n 100000 -q
五、Redis單個數據庫常用命令
5.1 存放/獲取數據——set/get
set:存放數據,命令格式為 set key value
get:獲取數據,命令格式為 get key
5.2 結合通配符查看鍵值列表——keys
#keys 命令可以取符合規(guī)則的鍵值列表,通常情況可以結合*、?等選項來使用。
keys * #查看當前數據庫中所有的數據
keys v* #查看當前數據庫中以v開頭的數據
keys v?? #查看當前數據庫中以v開頭后面包含任意一位的數據
keys v?? #查看當前數據庫中以v開頭后面包含任意兩位的數據
5.3 判斷鍵值是否存在——exists
語法:exists [鍵]
返回值為1表示存在,0表示不存在
5.4 刪除當前數據庫的指定key——del
語法:del [鍵]
5.5 獲取key對應的value值類型——type
語法:type [鍵]
5.6 對已有key進行重命名(覆蓋)——rename
語法:rename 源key 目標key
使用rename命令進行重命名時,無論目標key是否存在都進行重命名,且源key的值會覆蓋目標key的值。
在實際使用過程中,建議先用exists命令查看目標key是否存在,然后再決定是否執(zhí)行rename命令,以避免覆蓋重要數據。
5.7 對已有key進行重命名(不覆蓋)——renamex
語法:renamex 源key 目標key
#renamenx 命令是對已有key進行重命名,并檢測新名是否存在,如果目標 key 存在則不進行重命名(不覆蓋)
5.8 查看當前數據庫中key的數目——dbsize
5.9 設置密碼
#設置密碼
config set requirepass password
#查看密碼(一旦設置密碼,必須先驗證通過密碼,否則所有操作不可用)
auth 密碼
config get requirepass
#刪除密碼
auth 密碼
config get requirepass ''
例:
config set requirepass 264196
auth 264196
...
config get requirepass ''
六、Redis多數據庫之間常用命令
1.Redis支持多數據庫,Redis 默認情況下包含 16 個數據庫,數據庫名稱是用數字 0-15 來依次命名的
2.多數據庫相互獨立,互不干擾
6.1 多數據庫間切換
語法:select 序號
使用redis-cli連接Redis數據庫后,默認使用的是序號為0的數據庫
6.2 多數據庫間移動數據
語法:move 鍵值 序號
6.3 清除數據庫內數據
FLUSHDB :清空當前數據庫數據
FLUSHALL :清空所有數據庫的數據,慎用!
本文摘自 :https://www.cnblogs.com/