一、關(guān)系數(shù)據(jù)庫(kù)與非關(guān)系型數(shù)據(jù)庫(kù)概述
1、關(guān)系型數(shù)據(jù)庫(kù)
- 關(guān)系型數(shù)據(jù)庫(kù)是一個(gè)結(jié)構(gòu)化的數(shù)據(jù)庫(kù),創(chuàng)建在關(guān)系模型(二維表格模型)基礎(chǔ)上,一般面向于記錄。
- SQL 語(yǔ)句(標(biāo)準(zhǔn)數(shù)據(jù)查詢語(yǔ)言)就是一種基于關(guān)系型數(shù)據(jù)庫(kù)的語(yǔ)言,用于執(zhí)行對(duì)關(guān)系型數(shù)據(jù)庫(kù)中數(shù)據(jù)的檢索和操作。
- 主流的關(guān)系型數(shù)據(jù)庫(kù)包括 Oracle、MySQL、SQL Server、Microsoft Access、DB2 等
2、非關(guān)系型數(shù)據(jù)庫(kù)
- NoSQL(NoSQL = Not Only SQL ),意思是“不僅僅是 SQL”,是非關(guān)系型數(shù)據(jù)庫(kù)的總稱。
- 除了主流的關(guān)系型數(shù)據(jù)庫(kù)外的數(shù)據(jù)庫(kù),都認(rèn)為是非關(guān)系型。
- 主流的 NoSQL 數(shù)據(jù)庫(kù)有 Redis、MongBD、Hbase、Memcached 等。
3、關(guān)系數(shù)據(jù)庫(kù)與非關(guān)系型數(shù)據(jù)庫(kù)區(qū)別
(1)數(shù)據(jù)存儲(chǔ)方式不同
- 關(guān)系型和非關(guān)系型數(shù)據(jù)庫(kù)的主要差異是數(shù)據(jù)存儲(chǔ)的方式。關(guān)系型數(shù)據(jù)天然就是表格式的,因此存儲(chǔ)在數(shù)據(jù)表的行和列中。數(shù)據(jù)表可以彼此關(guān)聯(lián)協(xié)作存儲(chǔ),也很容易提取數(shù)據(jù)。
- 與其相反,非關(guān)系型數(shù)據(jù)不適合存儲(chǔ)在數(shù)據(jù)表的行和列中,而是大塊組合在一起。非關(guān)系型數(shù)據(jù)通常存儲(chǔ)在數(shù)據(jù)集中,就像文檔、鍵值對(duì)或者圖結(jié)構(gòu)。你的數(shù)據(jù)及其特性是選擇數(shù)據(jù)存儲(chǔ)和提取方式的首要影響因素
(2)擴(kuò)展方式不同
- SQL和NoSQL數(shù)據(jù)庫(kù)最大的差別可能是在擴(kuò)展方式上,要支持日益增長(zhǎng)的需求當(dāng)然要擴(kuò)展。
- 要支持更多并發(fā)量,SQL數(shù)據(jù)庫(kù)是縱向擴(kuò)展,也就是說提高處理能力,使用速度更快速的計(jì)算機(jī),這樣處理相同的數(shù)據(jù)集就更快了。因?yàn)閿?shù)據(jù)存儲(chǔ)在關(guān)系表中,操作的性能瓶頸可能涉及很多個(gè)表,這都需要通過提高計(jì)算機(jī)性能來客服。雖然SQL數(shù)據(jù)庫(kù)有很大擴(kuò)展空間,但最終肯定會(huì)達(dá)到縱向擴(kuò)展的上限。
- 而NoSQL數(shù)據(jù)庫(kù)是橫向擴(kuò)展的。因?yàn)榉顷P(guān)系型數(shù)據(jù)存儲(chǔ)天然就是分布式的,NoSQL數(shù)據(jù)庫(kù)的擴(kuò)展可以通過給資源池添加更多普通的數(shù)據(jù)庫(kù)服務(wù)器(節(jié)點(diǎn))來分擔(dān)負(fù)載。
(3)對(duì)事務(wù)性的支持不同
- 如果數(shù)據(jù)操作需要高事務(wù)性或者復(fù)雜數(shù)據(jù)查詢需要控制執(zhí)行計(jì)劃,那么傳統(tǒng)的SQL數(shù)據(jù)庫(kù)從性能和穩(wěn)定性方面考慮是你的最佳選擇。SQL數(shù)據(jù)庫(kù)支持對(duì)事務(wù)原子性細(xì)粒度控制,并且易于回滾事務(wù)。
- 雖然NoSQL數(shù)據(jù)庫(kù)也可以使用事務(wù)操作,但穩(wěn)定性方面沒法和關(guān)系型數(shù)據(jù)庫(kù)比較,所以它們真正閃亮的價(jià)值是在操作的擴(kuò)展性和大數(shù)據(jù)量處理方面。
4、非關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)生背景
-
可用于應(yīng)對(duì)web2.0純動(dòng)態(tài)網(wǎng)站類型的三高問題
-
關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)都有各自的特點(diǎn)與應(yīng)用場(chǎng)景,兩者的緊密結(jié)合將會(huì)給Web2.0的數(shù)據(jù)庫(kù)發(fā)展帶來新的思路。
-
讓關(guān)系數(shù)據(jù)庫(kù)關(guān)注在關(guān)系上,非關(guān)系型數(shù)據(jù)庫(kù)關(guān)注在存儲(chǔ)上。
-
例如,在讀寫分離的MySQL數(shù)據(jù)庫(kù)環(huán)境中,可以把經(jīng)常訪問的數(shù)據(jù)存儲(chǔ)在非關(guān)系型數(shù)據(jù)庫(kù)中,提升訪問速度。
MySQL高熱數(shù)據(jù) ----》 redis
web ----》 redis ----》 MySQL
CPU ----》 內(nèi)存/緩存 ----》 磁盤
5、總結(jié)
關(guān)系型數(shù)據(jù)庫(kù)
實(shí)例 -> 數(shù)據(jù)庫(kù) -> 表(table)-> 記錄行(row)、數(shù)據(jù)字段(column)
非關(guān)系型數(shù)據(jù)庫(kù)
梳理 -> 數(shù)據(jù)庫(kù) -> 集合(collection) -> 鍵值對(duì)(key-value)
- 非關(guān)系型數(shù)據(jù)庫(kù)不需要手動(dòng)建數(shù)據(jù)庫(kù)和集合(表)
二、Redis簡(jiǎn)介
- Redis 是一個(gè)開源的、使用 C 語(yǔ)言編寫的 NoSQL 數(shù)據(jù)庫(kù)。
- Redis 基于內(nèi)存運(yùn)行并支持持久化(支持存儲(chǔ)在磁盤里),采用key-value(鍵值對(duì))的存儲(chǔ)形式,是目前分布式架構(gòu)中不可或缺的一環(huán)。
1、Redis服務(wù)器的原理
- Redis服務(wù)器程序是單進(jìn)程模型,也就是在一臺(tái)服務(wù)器上可以同時(shí)啟動(dòng)多個(gè)Redis進(jìn)程,Redis的實(shí)際處理速度則是完全依靠于主進(jìn)程的執(zhí)行效率。
- 若在服務(wù)器上只運(yùn)行一個(gè)Redis進(jìn)程,當(dāng)多個(gè)客戶端同時(shí)訪問時(shí),服務(wù)器的處理能力是會(huì)有一定程度的下降
- 若在同一臺(tái)服務(wù)器上開啟多個(gè)Redis進(jìn)程,Redis在提高并發(fā)處理能力的同時(shí)會(huì)給服務(wù)器的CPU造成很大壓力。
- 在實(shí)際生產(chǎn)環(huán)境中,需要根據(jù)實(shí)際的需求來決定開啟多少個(gè)Redis進(jìn)程。若對(duì)高并發(fā)要求更高一些,可能會(huì)考慮在同一臺(tái)服務(wù)器上開啟多個(gè)進(jìn)程。若 CPU 資源比較緊張,采用單進(jìn)程即可。
2、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 及 Ordered Sets 等數(shù)據(jù)類型操作。
-
(3)支持?jǐn)?shù)據(jù)的持久化|可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
-
(4)原子性:Redis 所有操作都是原子性的。
-
(5)支持?jǐn)?shù)據(jù)備份|即 master-salve 模式的數(shù)據(jù)備份
-
Redis作為基于內(nèi)存運(yùn)行的數(shù)據(jù)庫(kù),緩存是其最常應(yīng)用的場(chǎng)景之一。
-
除此之外,Redis常見應(yīng)用場(chǎng)景還包括獲取最新N個(gè)數(shù)據(jù)的操作、排行榜類應(yīng)用、計(jì)數(shù)器應(yīng)用、存儲(chǔ)關(guān)系、實(shí)時(shí)分析系統(tǒng)、日志記錄。
3、為什么redis速度快
-
redis是純內(nèi)存結(jié)構(gòu),數(shù)據(jù)操作都是在內(nèi)存中完成的
-
采用I/0多路復(fù)用,提高線程處理更多的網(wǎng)絡(luò)連接請(qǐng)求
-
數(shù)據(jù)讀寫采用單線程模式,可以減少多線程切換的消耗,同時(shí)也不用考慮鎖的性能影響
-
注:在 Redis 6.0 中新增加的多線程也只是針對(duì)處理網(wǎng)絡(luò)請(qǐng)求過程采用了多線性,而數(shù)據(jù)的讀寫命令,仍然是單線程處理的。
三、Redis 安裝部署
1、環(huán)境準(zhǔn)備
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
2、修改內(nèi)核參數(shù)
vim /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 2048
sysctl -p
3、安裝redis
yum install -y gcc gcc-c++ make
tar zxvf /opt/redis-7.0.9.tar.gz -C /opt/
cd /opt/redis-7.0.9
make
make PREFIX=/usr/local/redis install
#由于Redis源碼包中直接提供了 Makefile 文件,所以在解壓完軟件包后,不用先執(zhí)行 ./configure 進(jìn)行配置,可直接執(zhí)行 make 與 make install 命令進(jìn)行安裝。
4、創(chuàng)建redis工作目錄
mkdir /usr/local/redis/{conf,log,data}
cp /opt/redis-7.0.9/redis.conf /usr/local/redis/conf/
useradd -M -s /sbin/nologin redis
chown -R redis.redis /usr/local/redis/
5、環(huán)境變量
vim /etc/profile
PATH=$PATH:/usr/local/redis/bin #增加一行
source /etc/profile
6、修改配置文件
vim /usr/local/redis/conf/redis.conf
bind 127.0.0.1 192.168.80.10 #87行,添加 監(jiān)聽的主機(jī)地址
protected-mode no #111行,將本機(jī)訪問保護(hù)模式設(shè)置no。如果開啟了,那么在沒有設(shè)定bind ip且沒有設(shè)密碼的情況下,Redis只允許接受本機(jī)的響應(yīng)
port 6379 #138行,Redis默認(rèn)的監(jiān)聽6379端口
daemonize yes #309行,設(shè)置為守護(hù)進(jìn)程,后臺(tái)啟動(dòng)
pidfile /usr/local/redis/log/redis_6379.pid #341行,指定 PID 文件
logfile "/usr/local/redis/log/redis_6379.log" #354行,指定日志文件
dir /usr/local/redis/data #504行,指定持久化文件所在目錄
requirepass abc123 #1037行,增加一行,設(shè)置redis密碼
7、定義systemd服務(wù)管理腳本
vim /usr/lib/systemd/system/redis-server.service
[Unit]
Description=Redis Server
After=network.target
[Service]
User=redis
Group=redis
Type=forking
TimeoutSec=0
PIDFile=/usr/local/redis/log/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#啟動(dòng)服務(wù)
systemctl start redis-server
systemctl enable redis-server
netstat -lntp | grep 6379
四、Redis 命令工具
- redis-server:Redis 服務(wù)器啟動(dòng)命令
- redis-benchmark:性能測(cè)試工具,用于檢測(cè) Redis 在本機(jī)的運(yùn)行效率
- redis-check-aof:修復(fù)有問題的 AOF 持久化文件
- redis-check-rdb:修復(fù)有問題的 RDB 持久化文件
- redis-cli:Redis 客戶端命令行工具
- redis-sentinel:Redis 哨兵集群使用
1、redis-cli 命令行工具
語(yǔ)法:redis-cli -h host -p port [-a password]
- -h :指定遠(yuǎn)程主機(jī)
- -p :指定 Redis 服務(wù)的端口號(hào)
- -a :指定密碼,未設(shè)置數(shù)據(jù)庫(kù)密碼可以省略-a 選項(xiàng)
若不添加任何選項(xiàng)表示,則使用 127.0.0.1:6379 連接本機(jī)上的 Redis 數(shù)據(jù)庫(kù)文章來源:http://www.zghlxwxcb.cn/news/detail-526301.html
redis-cli -h 192.168.80.10 -p 6379 -a 'abc123'
2、redis-benchmark 測(cè)試工具-----
redis-benchmark 是官方自帶的 Redis 性能測(cè)試工具,可以有效的測(cè)試 Redis 服務(wù)的性能。
基本的測(cè)試語(yǔ)法:redis-benchmark [選項(xiàng)] [選項(xiàng)值]。文章來源地址http://www.zghlxwxcb.cn/news/detail-526301.html
- -h :指定服務(wù)器主機(jī)名。
- -p :指定服務(wù)器端口。
- -s :指定服務(wù)器 socket
- -c :指定并發(fā)連接數(shù)。 ?
- -n :指定請(qǐng)求數(shù)。
- -d :以字節(jié)的形式指定 SET/GET 值的數(shù)據(jù)大小。
- -k :1=keep alive 0=reconnect 。
- -r :SET/GET/INCR 使用隨機(jī) key, SADD 使用隨機(jī)值。
-P :通過管道傳輸請(qǐng)求。 - -q :強(qiáng)制退出 redis。僅顯示 query/sec 值。
- –csv :以 CSV 格式輸出。
- -l :生成循環(huán),永久執(zhí)行測(cè)試。
- -t :僅運(yùn)行以逗號(hào)分隔的測(cè)試命令列表。
- -I :Idle 模式。僅打開 N 個(gè) idle 連接并等待。
#向 IP 地址為 192.168.80.10、端口為 6379 的 Redis 服務(wù)器發(fā)送 100 個(gè)并發(fā)連接與 100000 個(gè)請(qǐng)求測(cè)試性能
redis-benchmark -h 192.168.80.10 -p 6379 -c 100 -n 100000
#測(cè)試存取大小為 100 字節(jié)的數(shù)據(jù)包的性能
redis-benchmark -h 192.168.80.10 -p 6379 -q -d 100
#測(cè)試本機(jī)上 Redis 服務(wù)在進(jìn)行 set 與 lpush 操作時(shí)的性能
redis-benchmark -t set,lpush -n 100000 -q
五、Redis 數(shù)據(jù)庫(kù)常用命令
- set:存放數(shù)據(jù),命令格式為 set key value
- get:獲取數(shù)據(jù),命令格式為 get key
127.0.0.1:6379> set teacher zhangsan
OK
127.0.0.1:6379> get teacher
"zhangsan"
1、keys 命令
- 可以取符合規(guī)則的鍵值列表,通常情況可以結(jié)合*、?等選項(xiàng)來使用。
127.0.0.1:6379> set k1 1
127.0.0.1:6379> set k2 2
127.0.0.1:6379> set k3 3
127.0.0.1:6379> set v1 4
127.0.0.1:6379> set v5 5
127.0.0.1:6379> set v22 5
127.0.0.1:6379> KEYS * #查看當(dāng)前數(shù)據(jù)庫(kù)中所有鍵
127.0.0.1:6379> KEYS v* #查看當(dāng)前數(shù)據(jù)庫(kù)中以 v 開頭的數(shù)據(jù)
127.0.0.1:6379> KEYS v? #查看當(dāng)前數(shù)據(jù)庫(kù)中以 v 開頭后面包含任意一位的數(shù)據(jù)
127.0.0.1:6379> KEYS v?? #查看當(dāng)前數(shù)據(jù)庫(kù)中以 v 開頭 v 開頭后面包含任意兩位的數(shù)據(jù)
2、exists 命令
- 可以判斷鍵值是否存在
127.0.0.1:6379> exists teacher #判斷 teacher 鍵是否存在
(integer) 1 # 1 表示 teacher 鍵是存在
127.0.0.1:6379> exists tea
(integer) 0 # 0 表示 tea 鍵不存在
3、del 命令
- 可以刪除當(dāng)前數(shù)據(jù)庫(kù)的指定 key
127.0.0.1:6379> keys *
127.0.0.1:6379> del v5
127.0.0.1:6379> get v5
4、type、命令
- 可以獲取 key 對(duì)應(yīng)的 value 值類型。
127.0.0.1:6379> type k1
string
5、expire 命令
- 可以為給定的 key 設(shè)置過期時(shí)間
127.0.0.1:6379> expire k1 10 #設(shè)置 k1 鍵的過期時(shí)間為 10 秒
6、ttl 命令
- 可以查看 key 還有多少秒過期,-1表示永不過期,-2表示已過期
127.0.0.1:6379> ttl k1
7、rename 命令
- 是對(duì)已有 key 進(jìn)行重命名。(覆蓋)
- 命令格式:rename 源key 目標(biāo)key
- 使用rename命令進(jìn)行重命名時(shí),無論目標(biāo)key是否存在都進(jìn)行重命名,且源key的值會(huì)覆蓋目標(biāo)key的值。在實(shí)際使用過程中,建議先用 exists 命令查看目標(biāo) key 是否存在,然后再?zèng)Q定是否執(zhí)行 rename 命令,以避免覆蓋重要數(shù)據(jù)。
127.0.0.1:6379> keys v*
1) "v1"
2) "v22"
127.0.0.1:6379> rename v22 v2
OK
127.0.0.1:6379> keys v*
1) "v1"
2) "v2"
127.0.0.1:6379> get v1
"4"
127.0.0.1:6379> get v2
"5"
127.0.0.1:6379> rename v1 v2
OK
127.0.0.1:6379> get v1
(nil)
127.0.0.1:6379> get v2
"4"
8、renamenx 命令
- 是對(duì)已有 key 進(jìn)行重命名,并檢測(cè)新名是否存在,如果目標(biāo) key 存在則不進(jìn)行重命名。(不覆蓋)
命令格式:renamenx 源key 目標(biāo)key
127.0.0.1:6379> keys *
127.0.0.1:6379> get teacher
"zhangsan"
127.0.0.1:6379> get v2
"4"
127.0.0.1:6379> renamenx v2 teacher
(integer) 0
127.0.0.1:6379> keys *
127.0.0.1:6379> get teacher
"zhangsan"
127.0.0.1:6379> get v2
"4"
9、dbsize 命令
- 是查看當(dāng)前數(shù)據(jù)庫(kù)中 key 的數(shù)目。
127.0.0.1:6379> dbsize
10、設(shè)置密碼
#使用config set requirepass yourpassword命令設(shè)置密碼
127.0.0.1:6379> config set requirepass 123456
#使用config get requirepass命令查看密碼(一旦設(shè)置密碼,必須先驗(yàn)證通過密碼,否則所有操作不可用)
127.0.0.1:6379> auth 123456
127.0.0.1:6379> config get requirepass
六、Redis 多數(shù)據(jù)庫(kù)常用命令
- Redis 支持多數(shù)據(jù)庫(kù),Redis 默認(rèn)情況下包含 16 個(gè)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)名稱是用數(shù)字 0-15 來依次命名的。
多數(shù)據(jù)庫(kù)相互獨(dú)立,互不干擾。
1、多數(shù)據(jù)庫(kù)間切換
命令格式:select 序號(hào)
使用 redis-cli 連接 Redis 數(shù)據(jù)庫(kù)后,默認(rèn)使用的是序號(hào)為 0 的數(shù)據(jù)庫(kù)。
127.0.0.1:6379> select 10 #切換至序號(hào)為 10 的數(shù)據(jù)庫(kù)
127.0.0.1:6379[10]> select 15 #切換至序號(hào)為 15 的數(shù)據(jù)庫(kù)
127.0.0.1:6379[15]> select 0 #切換至序號(hào)為 0 的數(shù)據(jù)庫(kù)
2、多數(shù)據(jù)庫(kù)間移動(dòng)數(shù)據(jù)
格式:move 鍵值 序號(hào)
127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> get k1
"100"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get k1
(nil)
127.0.0.1:6379[1]> select 0 #切換至目標(biāo)數(shù)據(jù)庫(kù) 0
OK
127.0.0.1:6379> get k1 #查看目標(biāo)數(shù)據(jù)是否存在
"100"
127.0.0.1:6379> move k1 1 #將數(shù)據(jù)庫(kù) 0 中 k1 移動(dòng)到數(shù)據(jù)庫(kù) 1 中
(integer) 1
127.0.0.1:6379> select 1 #切換至目標(biāo)數(shù)據(jù)庫(kù) 1
OK
127.0.0.1:6379[1]> get k1 #查看被移動(dòng)數(shù)據(jù)
"100"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get k1 #在數(shù)據(jù)庫(kù) 0 中無法查看到 k1 的值
(nil)
3、清除數(shù)據(jù)庫(kù)內(nèi)數(shù)據(jù)
FLUSHDB :清空當(dāng)前數(shù)據(jù)庫(kù)數(shù)據(jù)
FLUSHALL :清空所有數(shù)據(jù)庫(kù)的數(shù)據(jù),慎用!
到了這里,關(guān)于Redis 數(shù)據(jù)庫(kù)的概念、常用命令的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!