關系數(shù)據(jù)庫與非關系型數(shù)據(jù)庫
關系型數(shù)據(jù)庫
關系型數(shù)據(jù)庫是一個結構化的數(shù)據(jù)庫,創(chuàng)建在關系模型(二維表格模型)基礎上,一般面向于記錄。
SQL 語句(標準數(shù)據(jù)查詢語言)就是一種基于關系型數(shù)據(jù)庫的語言,用于執(zhí)行對關系型數(shù)據(jù)庫中數(shù)據(jù)的檢索和操作。
主流的關系型數(shù)據(jù)庫包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2、PostgreSQL 等。
以上數(shù)據(jù)庫在使用的時候必須先建庫建表設計表結構,然后存儲數(shù)據(jù)的時候按表結構去存,如果數(shù)據(jù)與表結構不匹配就會存儲失敗。
非關系型數(shù)據(jù)庫
NoSQL(NoSQL = Not Only SQL ),意思是“不僅僅是 SQL”,是非關系型數(shù)據(jù)庫的總稱。
除了主流的關系型數(shù)據(jù)庫外的數(shù)據(jù)庫,都認為是非關系型。
不需要預先建庫建表定義數(shù)據(jù)存儲表結構,每條記錄可以有不同的數(shù)據(jù)類型和字段個數(shù)(比如微信群聊里的文字、圖片、視頻、音樂等)。
主流的 NoSQL 數(shù)據(jù)庫有 Redis、MongBD、Hbase、Memcached、ElasticSearch、TSDB 等。
關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫區(qū)別
數(shù)據(jù)存儲方式不同
關系型和非關系型數(shù)據(jù)庫的主要差異是數(shù)據(jù)存儲的方式。關系型數(shù)據(jù)天然就是表格式的,因此存儲在數(shù)據(jù)表的行和列中。數(shù)據(jù)表可以彼此關聯(lián)協(xié)作存儲,也很容易提取數(shù)據(jù)。
與其相反,非關系型數(shù)據(jù)不適合存儲在數(shù)據(jù)表的行和列中,而是大塊組合在一起。非關系型數(shù)據(jù)通常存儲在數(shù)據(jù)集中,就像文檔、鍵值對或者圖結構。你的數(shù)據(jù)及其特性是選擇數(shù)據(jù)存儲和提取方式的首要影響因素。
擴展方式不同
SQL和NoSQL數(shù)據(jù)庫最大的差別可能是在擴展方式上,要支持日益增長的需求當然要擴展。
要支持更多并發(fā)量,SQL數(shù)據(jù)庫是縱向擴展,也就是說提高處理能力,使用速度更快速的計算機,這樣處理相同的數(shù)據(jù)集就更快了。因為數(shù)據(jù)存儲在關系表中,操作的性能瓶頸可能涉及很多個表,這都需要通過提高計算機性能來克服。雖然SQL數(shù)據(jù)庫有很大擴展空間,但最終肯定會達到縱向擴展的上限。
而NoSQL數(shù)據(jù)庫是橫向擴展的。因為非關系型數(shù)據(jù)存儲天然就是分布式的,NoSQL數(shù)據(jù)庫的擴展可以通過給資源池添加更多普通的數(shù)據(jù)庫服務器(節(jié)點)來分擔負載。
?
對事務性的支持不同
如果數(shù)據(jù)操作需要高事務性或者復雜數(shù)據(jù)查詢需要控制執(zhí)行計劃,那么傳統(tǒng)的SQL數(shù)據(jù)庫從性能和穩(wěn)定性方面考慮是你的最佳選擇。SQL數(shù)據(jù)庫支持對事務原子性細粒度控制,并且易于回滾事務。
雖然NoSQL數(shù)據(jù)庫也可以使用事務操作,但穩(wěn)定性方面沒法和關系型數(shù)據(jù)庫比較,所以它們真正閃亮的價值是在操作的擴展性和大數(shù)據(jù)量處理方面。
非關系型數(shù)據(jù)庫產(chǎn)生背景
可用于應對 Web2.0 純動態(tài)網(wǎng)站類型的三高問題(高并發(fā)、高性能、高可用)。
(1)High performance——對數(shù)據(jù)庫高并發(fā)讀寫需求
(2)Huge Storage——對海量數(shù)據(jù)高效存儲與訪問需求
(3)High Scalability && High Availability——對數(shù)據(jù)庫高可擴展性與高可用性需求
關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫都有各自的特點與應用場景,兩者的緊密結合將會給Web2.0的數(shù)據(jù)庫發(fā)展帶來新的思路。讓關系型數(shù)據(jù)庫關注在關系上和對數(shù)據(jù)的一致性保障,非關系型數(shù)據(jù)庫關注在存儲和高效率上。例如,在讀寫分離的MySQL數(shù)據(jù)庫環(huán)境中,可以把經(jīng)常訪問的數(shù)據(jù)存儲在非關系型數(shù)據(jù)庫中,提升訪問速度。
總結
關系型數(shù)據(jù)庫:
實例-->數(shù)據(jù)庫-->表(table)-->記錄行(row)、數(shù)據(jù)字段(column)
非關系型數(shù)據(jù)庫:
實例-->數(shù)據(jù)庫-->集合(collection)-->鍵值對(key-value)
非關系型數(shù)據(jù)庫不需要手動建數(shù)據(jù)庫和集合(表)。
Redis簡介
Redis(遠程字典服務器) 是一個開源的、使用 C 語言編寫的 NoSQL 數(shù)據(jù)庫。
Redis 基于內存運行并支持持久化,采用key-value(鍵值對)的存儲形式,是目前分布式架構中不可或缺的一環(huán)。
Redis服務器程序是單進程模型,也就是在一臺服務器上可以同時啟動多個Redis進程,Redis的實際處理速度則是完全依靠于主進程的執(zhí)行效率。若在服務器上只運行一個Redis進程,當多個客戶端同時訪問時,服務器的處理能力是會有一定程度的下降;若在同一臺服務器上開啟多個Redis進程,Redis在提高并發(fā)處理能力的同時會給服務器的CPU造成很大壓力。即:在實際生產(chǎn)環(huán)境中,需要根據(jù)實際的需求來決定開啟多少個Redis進程。若對高并發(fā)要求更高一些,可能會考慮在同一臺服務器上開啟多個進程。若CPU資源比較緊張,采用單進程即可。
Redis 優(yōu)點
1、具有極高的數(shù)據(jù)讀寫速度:數(shù)據(jù)讀取的速度最高可達到 110000 次/s,數(shù)據(jù)寫入速度最高可達到 81000 次/s。
2、支持豐富的數(shù)據(jù)類型:支持 key-value、Strings、Lists、Hashes、Sets 及 Sorted Sets 等數(shù)據(jù)類型操作。
3、支持數(shù)據(jù)的持久化:可以將內存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載進行使用。
4、原子性:Redis 所有操作都是原子性的。
5、支持數(shù)據(jù)備份:即 master-salve 模式的數(shù)據(jù)備份。
Redis缺點
緩存和數(shù)據(jù)庫雙寫一致性問題
緩存雪崩問題
緩存擊穿問題
緩存的并發(fā)競爭問題
Redis使用場景
Redis作為基于內存運行的數(shù)據(jù)庫,是一個高性能的緩存,一般應用在Session緩存、隊列、排行榜、計數(shù)器、最近最熱文章、最近最熱評論、發(fā)布訂閱等。
Redis 適用于數(shù)據(jù)實時性要求高、數(shù)據(jù)存儲有過期和淘汰特征的、不需要持久化或者只需要保證弱一致性、邏輯簡單的場景。
我們通常會將部分數(shù)據(jù)放入緩存中,來提高訪問速度,然后數(shù)據(jù)庫承擔存儲的工作。
哪些數(shù)據(jù)適合放入緩存中
●即時性。例如查詢最新的物流狀態(tài)信息。
●數(shù)據(jù)一致性要求不高。例如門店信息,修改后,數(shù)據(jù)庫中已經(jīng)改了,五分鐘后緩存中才是最新的,但不影響功能使用。
●訪問量大且更新頻率不高,例如網(wǎng)站首頁的廣告信息,訪問量大,但是不會經(jīng)常變化。
Redis為什么這么快
1、Redis是一款純內存結構,避免了磁盤I/O等耗時操作。
2、Redis命令處理的核心模塊為單線程,不存在多線程切換而消耗CPU,不用考慮各種鎖的問題,不存在加鎖、釋放鎖的操作,沒有因為可能出現(xiàn)死鎖而導致性能消耗。
3、采用了 I/O 多路復用機制,大大提升了并發(fā)效率。
注:在 Redis 6.0 中新增加的多線程也只是針對處理網(wǎng)絡請求過程采用了多線性,而數(shù)據(jù)的讀寫命令,仍然是單線程處理的。文章來源:http://www.zghlxwxcb.cn/news/detail-708209.html
Redis 部署
#關閉防火墻 、安全機制
systemctl stop firewalld
setenforce 0
#解壓軟件包
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 文件,所以在解壓完軟件包后,不用先執(zhí)行 ./configure 進行配置,可直接執(zhí)行 make 與 make install 命令進行安裝。
#執(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 ,注意要一次性正確輸入
----------------------------------------------------------------------------------------------------------
Selected config:
Port : 6379 #默認偵聽端口為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/bin/redis-cli #客戶端命令工具
----------------------------------------------------------------------------------------------------------
#把redis的可執(zhí)行程序文件放入路徑環(huán)境變量的目錄中便于系統(tǒng)識別
ln -s /usr/local/redis/bin/* /usr/local/bin/
#當 install_server.sh 腳本運行完畢,Redis 服務就已經(jīng)啟動,默認監(jiān)聽端口為 6379
netstat -natp | grep redis
#修改配置 /etc/redis/6379.conf 參數(shù)
vim /etc/redis/6379.conf
bind 127.0.0.1 20.0.0.50 #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行,指定日志文件
#重啟redis
/etc/init.d/redis_6379 restart
Redis服務控制
#Redis 服務控制
/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)
Redis命令工具
redis-server:用于啟動 Redis 的工具
redis-benchmark:用于檢測 Redis 在本機的運行效率
redis-check-aof:修復 AOF 持久化文件
redis-check-rdb:修復 RDB 持久化文件
redis-cli:Redis 命令行工具
redis-benchmark 測試工具
redis-benchmark 是官方自帶的 Redis 性能測試工具,可以有效的測試 Redis 服務的性能。
基本的測試語法:redis-benchmark [選項] [選項值]。
-h :指定服務器主機名。
-p :指定服務器端口。
-s :指定服務器 socket
-c :指定并發(fā)連接數(shù)。 ?
-n :指定請求數(shù)。
-d :以字節(jié)的形式指定 SET/GET 值的數(shù)據(jù)大小。
-k :1=keep alive 0=reconnect 。
-r :SET/GET/INCR 使用隨機 key, SADD 使用隨機值。
-P :通過管道傳輸<numreq>請求。
-q :強制退出 redis。僅顯示 query/sec 值。
--csv :以 CSV 格式輸出。
-l :生成循環(huán),永久執(zhí)行測試。
-t :僅運行以逗號分隔的測試命令列表。
-I :Idle 模式。僅打開 N 個 idle 連接并等待。
#向 IP 地址為 20.0.0.50、端口為 6379 的 Redis 服務器發(fā)送 100 個并發(fā)連接與 100000 個請求測試性能
redis-benchmark -h 20.0.0.50 -p 6379 -c 100 -n 100000
#測試存取大小為 100 字節(jié)的數(shù)據(jù)包的性能
redis-benchmark -h 20.0.0.50 -p 6379 -q -d 100
#測試本機上 Redis 服務在進行 set 與 lpush 操作時的性能
redis-benchmark -t set,lpush -n 100000 -q
redis-cli 命令行工具
語法:redis-cli -h host -p port -a password
-h :指定遠程主機
-p :指定 Redis 服務的端口號
-a :指定密碼,未設置數(shù)據(jù)庫密碼可以省略-a 選項
若不添加任何選項表示,則使用 127.0.0.1:6379 連接本機上的 Redis 數(shù)據(jù)庫
#連接本機
redis-cli -h 20.0.0.50 -p 6379
Redis 數(shù)據(jù)庫常用命令
? ? ? ? 存放、獲取數(shù)據(jù)
set:存放數(shù)據(jù),命令格式為 set key value
get:獲取數(shù)據(jù),命令格式為 get key
例
20.0.0.50:6379> set A1 1
OK
20.0.0.50:6379> get A1
"1"
????????keys 命令
# keys 命令可以取符合規(guī)則的鍵值列表,通常情況可以結合*、?等選項來使用。
20.0.0.50:6379> KEYS * #查看當前數(shù)據(jù)庫中所有鍵
20.0.0.50:6379> KEYS v* #查看當前數(shù)據(jù)庫中以 v 開頭的數(shù)據(jù)
20.0.0.50:6379> KEYS v? #查看當前數(shù)據(jù)庫中以 v 開頭后面包含任意一位的數(shù)據(jù)
20.0.0.50:6379> KEYS v?? #查看當前數(shù)據(jù)庫中以 v 開頭 v 開頭后面包含任意兩位的數(shù)據(jù)
????????exists
# exists 命令可以判斷鍵值是否存在。
20.0.0.50:6379> exists teacher #判斷 teacher 鍵是否存在
(integer) 1 # 1 表示 teacher 鍵是存在
20.0.0.50:6379> exists tea
(integer) 0 # 0 表示 tea 鍵不存在
????????del
# del 命令可以刪除當前數(shù)據(jù)庫的指定 key。
20.0.0.50:6379> keys *
1) "counter:__rand_int__"
2) "myset:__rand_int__"
3) "mylist"
4) "A1"
5) "key:__rand_int__"
20.0.0.50:6379> del A1
(integer) 1
20.0.0.50:6379> get A1
(nil)
????????type
# type 命令可以獲取 key 對應的 value 值類型。
20.0.0.50:6379> type v3
string
20.0.0.50:6379> type v2
string
????????rename
# rename 命令是對已有 key 進行重命名。(覆蓋)
命令格式:rename 源key 目標key
使用rename命令進行重命名時,無論目標key是否存在都進行重命名,且源key的值會覆蓋目標key的值。在實際使用過程中,建議先用 exists 命令查看目標 key 是否存在,然后再決定是否執(zhí)行 rename 命令,以避免覆蓋重要數(shù)據(jù)。
20.0.0.50:6379> set vv1 10
OK
20.0.0.50:6379> set vv2 66
OK
20.0.0.50:6379> rename vv1 vv2
OK
20.0.0.50:6379> get vv1
(nil)
20.0.0.50:6379> get vv2
"10"
???????renamenx?
# renamenx 命令的作用是對已有 key 進行重命名,并檢測新名是否存在,如果目標 key 存在則不進行重命名。(不覆蓋)
命令格式:renamenx 源key 目標key
20.0.0.50:6379> set teacher laowang
OK
20.0.0.50:6379> set student xiaowang
OK
20.0.0.50:6379> renamenx teacher student
(integer) 0
20.0.0.50:6379> exists room
(integer) 0
20.0.0.50:6379> renamenx teacher room
(integer) 1
20.0.0.50:6379> get teacher
(nil)
20.0.0.50:6379> get room
"laowang"
?????????dbsize
# dbsize 命令的作用是查看當前數(shù)據(jù)庫中 key 的數(shù)目。
20.0.0.50:6379> keys *
1) "room"
2) "mylist"
3) "x1"
4) "student"
5) "x3"
6) "myset:__rand_int__"
7) "counter:__rand_int__"
8) "v2"
9) "vv2"
10) "key:__rand_int__"
20.0.0.50:6379> dbsize
(integer) 10
? ? ? ? 設置并查看密碼
#使用config set requirepass yourpassword命令設置密碼
20.0.0.50:6379> config set requirepass 123456
#使用config get requirepass命令查看密碼(一旦設置密碼,必須先驗證通過密碼,否則所有操作不可用)
20.0.0.50:6379> config set requirepass 123456
OK
20.0.0.50:6379> config get requirepass
(error) NOAUTH Authentication required.
20.0.0.50:6379> auth 123456
OK
20.0.0.50:6379> config get requirepass
1) "requirepass"
2) "123456"
Redis 多數(shù)據(jù)庫常用命令
Redis 支持多數(shù)據(jù)庫,Redis 默認情況下包含 16 個數(shù)據(jù)庫,數(shù)據(jù)庫名稱是用數(shù)字 0-15 來依次命名的。
多數(shù)據(jù)庫相互獨立,互不干擾。文章來源地址http://www.zghlxwxcb.cn/news/detail-708209.html
多數(shù)據(jù)庫間切換
#多數(shù)據(jù)庫間切換
命令格式:select 序號
使用 redis-cli 連接 Redis 數(shù)據(jù)庫后,默認使用的是序號為 0 的數(shù)據(jù)庫。
20.0.0.50:6379> select 10 #切換至序號為 10 的數(shù)據(jù)庫
OK
20.0.0.50:6379[10]> select 1 #切換至序號為 1 的數(shù)據(jù)庫
OK
20.0.0.50:6379[1]> select 0 #切換至序號為 0 的數(shù)據(jù)庫
OK
20.0.0.50:6379>
多數(shù)據(jù)庫間移動數(shù)據(jù)
#多數(shù)據(jù)庫間移動數(shù)據(jù)
格式:move 鍵值 序號
20.0.0.50:6379> set move test_move
OK
20.0.0.50:6379> select 10 #切換至目標庫
OK
20.0.0.50:6379[10]> keys * #查看庫中的鍵
(empty list or set)
20.0.0.50:6379[10]> select 0 #切換回創(chuàng)建鍵值的庫
OK
20.0.0.50:6379> move move 10 #執(zhí)行移動數(shù)據(jù)
(integer) 1
20.0.0.50:6379> get move #查看當前庫中移動的數(shù)據(jù)是否存在
(nil)
20.0.0.50:6379> select 10
OK
20.0.0.50:6379[10]> get move #移動數(shù)據(jù) 成功
"test_move"
清除數(shù)據(jù)庫內數(shù)據(jù)
FLUSHDB :清空當前數(shù)據(jù)庫數(shù)據(jù)
FLUSHALL :清空所有數(shù)據(jù)庫的數(shù)據(jù),慎用!
到了這里,關于Redis 非關系型數(shù)據(jù)庫 配置與優(yōu)化的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!