當前位置:首頁 > IT技術 > 數據庫 > 正文

Redis非關系型數據庫—Redis簡介、部署及常用命令
2021-09-14 16:40:18

一、關系數據庫與非關系型數據庫

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/

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