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