在現(xiàn)在的互聯(lián)網(wǎng)大潮中,NoSQL可謂是家喻戶曉,Redis作為NoSQL中及其重要的一員,使我們走向架構(gòu)道路的一條必經(jīng)之路。作為運維工程師來說,是必須要掌握的!
成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的博愛網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!既然提到了Redis數(shù)據(jù)庫是非關(guān)系型數(shù)據(jù),并且需要掌握Redis數(shù)據(jù)庫。那么關(guān)于關(guān)系型數(shù)據(jù)庫與非關(guān)系型數(shù)據(jù)庫的基本概念是必須要了解的。
數(shù)據(jù)庫按照其結(jié)構(gòu)可以分為關(guān)系型數(shù)據(jù)庫與其他數(shù)據(jù)庫,而這些其他數(shù)據(jù)庫,我們統(tǒng)稱為非關(guān)系型數(shù)據(jù)庫。
關(guān)系型數(shù)據(jù)庫是一個結(jié)構(gòu)化的數(shù)據(jù)庫,創(chuàng)建在關(guān)系模型基礎(chǔ)上,一般面向記錄。它借助于集合代數(shù)等數(shù)學(xué)概念和方法來處理數(shù)據(jù)庫中的數(shù)據(jù)。關(guān)系模型指二維表格模型,因而一個關(guān)系型數(shù)據(jù)庫就是由二維表及其之間的聯(lián)系組成的一個數(shù)據(jù)組織,現(xiàn)實世界中,各種實體與實體之間的各種聯(lián)系都可以用關(guān)系模型來表示。SQL(結(jié)構(gòu)化查詢語言)語句就是一種基于關(guān)系型數(shù)據(jù)庫的語言,用于執(zhí)行對關(guān)系型數(shù)據(jù)庫中數(shù)據(jù)的檢索和操作。
主流的關(guān)系型數(shù)據(jù)庫包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等。
NoSQL:意思是“不僅僅是SQL”,是非關(guān)系型數(shù)據(jù)庫的總稱。主流的NoSQL數(shù)據(jù)庫有Redis、MongDB、Hbase、CouhDB等。這些數(shù)據(jù)庫,他們的存儲方式,存儲結(jié)構(gòu)以及使用場景都是完全不同的。所以我們認(rèn)為它是一個非關(guān)系型數(shù)據(jù)庫的集合,而不是像關(guān)系型數(shù)據(jù)庫一樣,是一個統(tǒng)稱。簡單來說:主流的關(guān)系型數(shù)據(jù)庫之外的數(shù)據(jù)庫,都可以成為非關(guān)系型數(shù)據(jù)庫。NoSQL數(shù)據(jù)庫憑借著其非關(guān)系型、分布式、開源和橫向擴(kuò)展等優(yōu)勢,被認(rèn)為是下一代數(shù)據(jù)庫產(chǎn)品。
關(guān)系型數(shù)據(jù)庫已經(jīng)誕生很久了,而且我們一直都在使用,沒有發(fā)生有什么問題,面對這樣的情況,為什么還能產(chǎn)生非關(guān)系型數(shù)據(jù)庫?
隨著Web 2.0網(wǎng)站的興起,關(guān)系型數(shù)據(jù)庫在應(yīng)對Web 2.0網(wǎng)站,特別是海量數(shù)據(jù)和高并發(fā)的SNS(社交網(wǎng)絡(luò)服務(wù))類型的Web 2.0網(wǎng)站時,暴露出很多難以解決的問題。主要的就是三高問題:
Web 2.0網(wǎng)站會根據(jù)用戶的個性化信息來實時生成動態(tài)頁面和提供動態(tài)信息。因此,無法使用動態(tài)頁面靜態(tài)化技術(shù),所以數(shù)據(jù)庫的并發(fā)負(fù)載非常高,一般會達(dá)到10000次/s以上的讀寫請求。關(guān)系型數(shù)據(jù)庫對于上萬次的查詢請求還是可以勉強支撐的。當(dāng)出現(xiàn)上萬次的寫數(shù)據(jù)請求時,硬盤I/O就已經(jīng)無法承受了。對于普通的BBS網(wǎng)站,往往也會存在高并發(fā)的寫數(shù)據(jù)請求。比如:爆料明星等,就會有很多人評論。結(jié)果很有可能因為流量過大而引起網(wǎng)站癱瘓。
類似于大型的社交網(wǎng)站,比如:Facebook、Friendfeed等。每天都會產(chǎn)生大型的用戶動態(tài)信息。例如:Facebook一個月就會產(chǎn)生2.5億條用戶動態(tài)信息。對于關(guān)系型數(shù)據(jù)庫來說,在一個包含2.5億條記錄的表中執(zhí)行SQL查詢。效率是非常低的。
在Web架構(gòu)中,數(shù)據(jù)庫是最難進(jìn)行橫向擴(kuò)展的。當(dāng)應(yīng)用系統(tǒng)的用戶量與訪問量與日俱增時,數(shù)據(jù)庫是沒辦法像Web服務(wù)器一樣,簡單得通過添加硬件和服務(wù)器節(jié)點來擴(kuò)展其性能和負(fù)載能力的。尤其對于一些需要24小時對外提供服務(wù)器的網(wǎng)站來說,數(shù)據(jù)庫的升級與擴(kuò)展往往會伴隨著停機維護(hù)與數(shù)據(jù)遷移,其工作量是非常龐大的。
關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫都有各自的特點與應(yīng)用場景。兩者的緊密結(jié)合將會給Web 2.0的數(shù)據(jù)庫發(fā)展帶來新的思路。讓關(guān)系型數(shù)據(jù)庫關(guān)注在關(guān)系上,非關(guān)系型數(shù)據(jù)庫關(guān)注在存儲上。
通過以上內(nèi)容,大致可以了解到非關(guān)系的一些基本概念,接下來進(jìn)一步的了解——Redis數(shù)據(jù)庫。
Redis是一個開源的、使用C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、key-value(鍵值對)數(shù)據(jù)庫,是目前分布式架構(gòu)中不可或缺的一環(huán)。
Redis服務(wù)器程序是單進(jìn)程模型,也就是在一臺服務(wù)器上可以同時啟動多個Redis進(jìn)程,而Redis的實際處理速度則完全依靠于主進(jìn)程的的執(zhí)行效率。若在服務(wù)器上只運行一個Redis進(jìn)程,當(dāng)多個客戶端同時訪問時,服務(wù)器的處理能力會有一定程度的下降,若在同一臺服務(wù)器上開啟多個Redis進(jìn)程,Redis在提高并發(fā)處理能力的同時會給服務(wù)器的CPU造成很大壓力。也就是說,在實際生產(chǎn)環(huán)境中,需要根據(jù)實際的需求來決定開啟多少個Redis進(jìn)程。若對高并發(fā)要求更高一些,可能會考慮在同一臺服務(wù)器上開啟多個進(jìn)程。若CPU資源比較緊張,采用單進(jìn)程即可。
redis具有以下顯著的優(yōu)點:
- 具有極高的讀寫速度,數(shù)據(jù)讀取的速度高可達(dá)到110000次/s;數(shù)據(jù)寫入速度高可達(dá)到81000次/s;
- 支持豐富的數(shù)據(jù)類型,不僅僅支持簡單的key-value數(shù)據(jù)類型,還支持Strings、Lists、Hashes、Sets及Ordered Sets等數(shù)據(jù)類型操作;
- 支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在硬盤中,重啟時可以再次加載使用;
- 原子性,Redis所有的操作都是原子性的;
- 支持?jǐn)?shù)據(jù)備份,及master-salve模式的數(shù)據(jù)備份;
Redis數(shù)據(jù)庫作為內(nèi)存運行的數(shù)據(jù)庫,緩存是其較常應(yīng)用的場景之一,除此之外,Redis常見應(yīng)用場景還包括獲取N個數(shù)據(jù)的操作、排行榜應(yīng)用、計數(shù)器應(yīng)用、存儲關(guān)系、實施分析系統(tǒng)、日志記錄等。
Redis數(shù)據(jù)庫的安裝相對于其他服務(wù)來說比較簡單,可以通過官網(wǎng)下載相應(yīng)的軟件包,也可以使用本人發(fā)布的網(wǎng)盤鏈接:https://pan.baidu.com/s/1bOhIr3yJmSVUpjTdv_x3Kw
提取碼:zp79
上傳到Linux服務(wù)器進(jìn)行解壓、安裝即可!
通常情況下在Linux系統(tǒng)中進(jìn)行源碼編譯安裝,需要執(zhí)行./configure進(jìn)行環(huán)境檢查與配置。從而生成Makefile文件,再執(zhí)行make && make install命令進(jìn)行編譯安裝,而Redis源碼包直接提供了Makefile文件,所以在解壓完軟件包后,可直接進(jìn)入解壓后的軟件包目錄,執(zhí)行make && make install命令進(jìn)行編譯安裝即可!如下:
[root@localhost ~]# tar zxf redis-3.2.9.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/redis-3.2.9/
[root@localhost redis-3.2.9]# make && make install
按照以上這樣的方式安裝,redis服務(wù)默認(rèn)的安裝位置是/usr/src/redis-3.2.9/src
在安裝過程中,如果想要安裝到指定目錄最好先進(jìn)入相應(yīng)的目錄,再執(zhí)行相應(yīng)的操作即可!也可以使用以下命令:
[root@localhost redis-3.2.9]# make && make PREFIX=/usr/local/ install
//安裝到/usr/local目錄
make install 只是安裝了二進(jìn)制文件到系統(tǒng)中,并沒有啟動腳本和配置文件。軟件包中默認(rèn)提供了一個install_server.sh腳本文件。通過該腳本文件可以設(shè)置Redis服務(wù)所需要的相關(guān)配置文件。當(dāng)腳本執(zhí)行完畢,Redis服務(wù)就已經(jīng)啟動,默認(rèn)偵聽端口為6379。具體命令如下:
[root@localhost redis-3.2.9]# cd /usr/src/redis-3.2.9/utils/
[root@localhost utils]# ./install_server.sh
//進(jìn)入指定的目錄,運行腳本
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] //設(shè)置端口號
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] //設(shè)置默認(rèn)的配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] //設(shè)置日志文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] //設(shè)置數(shù)據(jù)目錄
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] //執(zhí)行命令存放位置
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli //這是客戶端命令
Is this ok? Then press ENTER to go on or Ctrl-C to abort. //確認(rèn)信息,回車即可!
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
//以上這些信息選擇默認(rèn)即可!
[root@localhost ~]# netstat -anpt | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 6396/redis-server 1
//確認(rèn)監(jiān)聽端口為6379
安裝完成之后(服務(wù)器默認(rèn)已經(jīng)啟動)可以使用Redis的服務(wù)控制腳本對Redis服務(wù)進(jìn)行控制,命令如下:
[root@localhost ~]# /etc/init.d/redis_6379 status
Redis is running (6396)
[root@localhost ~]# /etc/init.d/redis_6379 stop
[root@localhost ~]# /etc/init.d/redis_6379 restart
Redis主配置文件為/etc/redis/6379.conf,配置文件默認(rèn)就可以滿足需求,當(dāng)然也可根據(jù)實際情況對配置文件進(jìn)行修改, 配置文件大致內(nèi)容:
[root@localhost ~]# vim /etc/redis/6379.conf
……………… //省略部分內(nèi)容
bind 127.0.0.1 192.168.1.1 //監(jiān)聽的主機地址(最好加上自己的IP地址)
port 6379 //監(jiān)聽端口
daemonize yes //啟動守護(hù)進(jìn)程
pidfile /var/run/redis_6379.pid //指定PID文件
loglevel notice //日志級別
logfile /var/log/redis_6379.log //指定日志文件
//redis服務(wù)的配置文件幾乎不需要修改任何內(nèi)容就可直接工作!
//修改完配置文件重啟服務(wù),這是常識,不要大意!??!
[root@localhost ~]# /etc/init.d/redis_6379 restart
關(guān)于優(yōu)化Redis服務(wù)可以參考的參數(shù)有:
Redis軟件提供了多個命令工具,當(dāng)Redis安裝時,所包含的軟件工具會同時被安裝到系統(tǒng)中,在系統(tǒng)中可以直接使用。
Redis服務(wù)命令工具的作用:
- redis-server:用于啟動Redis服務(wù)的工具;
- redis-benchmark:用于檢測Redis在本機的運行效率;
- redis-check-aof:修復(fù)AOF持久化文件;
- redis-check-rdb:修復(fù)RDB持久化文件;
- redis-cli:Redis命令工具;
這篇博文主要介紹redis-cli、redis-benchmark命令工具的使用。
Redis數(shù)據(jù)庫系統(tǒng)也是一個典型的C/S(客戶端/服務(wù)器端)架構(gòu)的應(yīng)用,要訪問Redis數(shù)據(jù)庫需要使用專門的客戶端軟件。Redis服務(wù)的客戶端軟件就是自帶的redis-cli命令行非法操作。使用redis-cli連接到指定數(shù)據(jù)庫,連接成功后會進(jìn)入提示符為“遠(yuǎn)程主機IP地址:端口號>”的數(shù)據(jù)庫操作環(huán)境。用戶就可以輸入各種操作語句對數(shù)據(jù)庫進(jìn)行管理。比如:
[root@localhost ~]# redis-cli //連接到本機的Redis數(shù)據(jù)庫
127.0.0.1:6379> ping //檢測Redis服務(wù)是否為啟動狀態(tài)
PONG
在進(jìn)行數(shù)據(jù)庫連接操作時,客戶端(前提是支持redis命令工具)可以通過選項來指定遠(yuǎn)程主機上的Redis數(shù)據(jù)庫(Redis服務(wù)器配置文件中必須有真實的IP地址),實驗環(huán)境,我就把Redis服務(wù)器的防火墻強行關(guān)閉了,實際環(huán)境中,肯定是要開啟相應(yīng)端口。命令格式如下:
[root@localhost ~]# redis-cli -h 192.168.1.1 -p 6379
192.168.1.1:6379> info //登錄成功,使用“info”可以查看Redis服務(wù)器的詳細(xì)信息
//“-h”指定遠(yuǎn)程主機、“-p”指定Redis服務(wù)的端口號、“-a”指定redis數(shù)據(jù)庫的密碼(如果沒有密碼即可省略)
在數(shù)據(jù)庫操作環(huán)境中,使用help命令可以獲取命令的相應(yīng)幫助。
有三種獲取命令幫助的方式:
- help @
:獲取 中的命令列表 - help
:獲取某個命令的幫助 - help
:獲取可能幫助的主題列表
具體操作方法如下:
[root@localhost ~]# redis-cli
127.0.0.1:6379> help @list //查看所有與list數(shù)據(jù)類型相關(guān)的命令
………… //內(nèi)容太多,這里就省略了
127.0.0.1:6379> help set //查看set命令的命令格式及幫助
SET key value [EX seconds] [PX milliseconds] [NX|XX]
summary: Set the string value of a key
since: 1.0.0
group: string
redis-benchmark 是官方自帶的Redis性能測試工具,可以有效地測試Redis服務(wù)的性能。常用的選項如圖:
根據(jù)以上 選項可以針對某臺Redis服務(wù)器進(jìn)行性能檢測,命令格式如下:
[root@localhost ~]# redis-benchmark -h 192.168.1.1 -p 6379 -c 100 -n 10000
……………… //省略部分內(nèi)容
====== MSET (10 keys) ======
10000 requests completed in 0.26 seconds
100 parallel clients
3 bytes payload
keep alive: 1
16.44% <= 1 milliseconds
95.07% <= 2 milliseconds
96.67% <= 3 milliseconds
97.93% <= 4 milliseconds
99.24% <= 5 milliseconds
99.44% <= 6 milliseconds
99.67% <= 7 milliseconds
99.92% <= 8 milliseconds
100.00% <= 9 milliseconds
38759.69 requests per second
//針對IP地址為192.168.1.1、端口號為6379的Redis服務(wù)器發(fā)送100個并發(fā)連接與10000個請求測試性能
[root@localhost ~]# redis-benchmark -h 192.168.1.1 -p 6379 -q -d 100
//針對IP地址為192.168.1.1、端口號為6379的Redis服務(wù)器測試存取大小為100B的數(shù)據(jù)包的性能
[root@localhost ~]# redis-benchmark -h 192.168.1.1 -p 6379 -t set,lpush -n 10000 -q
SET: 37313.43 requests per second
LPUSH: 45248.87 requests per second
//針對IP地址為192.168.1.1、端口號為6379的Redis服務(wù)器在進(jìn)行set與lpush操作時的性能
//實驗環(huán)境,性能較差,多多諒解!
通過博文前面的介紹,已經(jīng)知道Redis數(shù)據(jù)庫采用key-value(鍵值對)的數(shù)據(jù)存儲形式。
使用的命令大致是:
- set:存放數(shù)據(jù),基本格式:set key value;
- get:獲取數(shù)據(jù),基本格式:get key;
比如:
127.0.0.1:6379> set k1 qq
OK
127.0.0.1:6379> get k1
"qq"
使用keys命令可以獲取符合規(guī)則的鍵值列表,通??梢越Y(jié)合“*”、“?”等選項使用。例如:
127.0.0.1:6379> keys * //查看當(dāng)前數(shù)據(jù)庫的所有鍵
1) "mylist"
2) "k2"
3) "k11"
4) "counter:__rand_int__"
5) "key:__rand_int__"
6) "k1"
7) "k3"
//不光是自己設(shè)置的鍵,還有系統(tǒng)默認(rèn)的鍵
127.0.0.1:6379> keys k* //查看當(dāng)前數(shù)據(jù)庫中以“k”開頭的鍵
1) "k2"
2) "k11"
3) "key:__rand_int__"
4) "k1"
5) "k3"
127.0.0.1:6379> keys k? //查看當(dāng)前數(shù)據(jù)庫中以“k”開頭后面包含任意一位的鍵
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> keys k?? //查看當(dāng)前數(shù)據(jù)庫中以“k”開頭后面包含任意兩位的鍵
1) "k11"
使用exists命令可以判斷鍵值是否存在,例如:
127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> exists k0
(integer) 0
//返回值1表示存在;0表示不存在
使用del命令可以刪除當(dāng)前數(shù)據(jù)庫的指定key,例如:
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> get k1
(nil)
//刪除之后,k1鍵對應(yīng)的數(shù)據(jù)也就消失了
使用type命令可以獲取key對應(yīng)的value值類型,例如:
127.0.0.1:6379> type k2
string
//字符串類型
rename命令是對已有key進(jìn)行重命名,格式為:“rename 源key 目標(biāo)key”。使用rename命令進(jìn)行重命名操作時,無論目標(biāo)key是否存在都進(jìn)行重命名,而且源key的值會覆蓋目標(biāo)key的值。在實際使用過程中,建議使用exists命令查看目標(biāo)key是否存在,再決定是否執(zhí)行rename命令,避免覆蓋重要數(shù)據(jù)。例如:
127.0.0.1:6379> get k2
"1qq"
127.0.0.1:6379> get k3
"1q"
127.0.0.1:6379> rename k2 k3
OK
127.0.0.1:6379> get k3
"1qq"
renamenx命令語法格式、作用與rename命令相同,不同點在于使用renamex命令進(jìn)行重命名是,如果目標(biāo)key存在則不進(jìn)行重命名。例如:
127.0.0.1:6379> keys k??
1) "k11"
127.0.0.1:6379> renamenx k3 k11
(integer) 0
//返回值是0,表示失敗
dbsize命令的作用是查看當(dāng)前數(shù)據(jù)庫中key的數(shù)目,例如:
127.0.0.1:6379> dbsize
(integer) 5
Redis支持多數(shù)據(jù)庫,默認(rèn)有16個數(shù)據(jù)庫,數(shù)據(jù)庫名稱是用數(shù)字0-15來表示的。切換數(shù)據(jù)庫的操作,如下:
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379>
//使用select命令進(jìn)行切換,端口號后面什么都沒有,則表示0號數(shù)據(jù)庫
Redis的多數(shù)據(jù)庫在一定程度上是相對獨立的。例如:
127.0.0.1:6379> set q1 1
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get q1
(nil)
Redis數(shù)據(jù)庫提供了一個“move”命令,可以進(jìn)行多數(shù)據(jù)庫的數(shù)據(jù)移動。例如:
127.0.0.1:6379> move q1 1
(integer) 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get q1
"1"
//將0號數(shù)據(jù)庫中“q1”的數(shù)據(jù)移動到1號數(shù)據(jù)庫
Redis數(shù)據(jù)庫的整庫數(shù)據(jù)刪除主要分為兩個部分:
- 清空當(dāng)前數(shù)據(jù)庫的數(shù)據(jù),使用“flushdb”命令可以實現(xiàn);
- 清空所有數(shù)據(jù)庫的數(shù)據(jù),使用“flushall”命令可以實現(xiàn)。
但是,數(shù)據(jù)清空操作比較危險,生產(chǎn)環(huán)境下,一般不建議使用。
———————— 本文至此結(jié)束,感謝閱讀 ————————
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。