當(dāng)前位置:首頁 > IT技術(shù) > 數(shù)據(jù)庫 > 正文

Redis非關(guān)系型數(shù)據(jù)庫—Redis簡介、部署及常用命令
2021-09-14 16:40:18

目錄

一、關(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/

開通會員,享受整站包年服務(wù)立即開通 >