非關係型數據庫(NoSQL)——Redis安裝及部署詳解

在如今的互聯網大潮中,NoSQL可謂是家喻戶曉,Redis做爲NoSQL中及其重要的一員,使咱們走向架構道路的一條必經之路。做爲運維工程師來講,是必需要掌握的!redis

既然提到了Redis數據庫是非關係型數據,而且須要掌握Redis數據庫。那麼關於關係型數據庫與非關係型數據庫的基本概念是必需要了解的。數據庫

1、關係型數據庫與非關係型數據庫的基本概念:

數據庫按照其結構能夠分爲關係型數據庫與其餘數據庫,而這些其餘數據庫,咱們統稱爲非關係型數據庫。vim

1.關係型數據庫

關係型數據庫是一個結構化的數據庫,建立在關係模型基礎上,通常面向記錄。它藉助於集合代數等數學概念和方法來處理數據庫中的數據。關係模型指二維表格模型,於是一個關係型數據庫就是由二維表及其之間的聯繫組成的一個數據組織,現實世界中,各類實體與實體之間的各類聯繫均可以用關係模型來表示。SQL(結構化查詢語言)語句就是一種基於關係型數據庫的語言,用於執行對關係型數據庫中數據的檢索和操做。緩存

主流的關係型數據庫包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等。服務器

2.非關係型數據庫

NoSQL:意思是「不只僅是SQL」,是非關係型數據庫的總稱。主流的NoSQL數據庫有Redis、MongDB、Hbase、CouhDB等。這些數據庫,他們的存儲方式,存儲結構以及使用場景都是徹底不一樣的。因此咱們認爲它是一個非關係型數據庫的集合,而不是像關係型數據庫同樣,是一個統稱。簡單來講:主流的關係型數據庫以外的數據庫,均可以成爲非關係型數據庫。NoSQL數據庫憑藉着其非關係型、分佈式、開源和橫向擴展等優點,被認爲是下一代數據庫產品。網絡

3.非關係型數據庫產生背景:

關係型數據庫已經誕生好久了,並且咱們一直都在使用,沒有發生有什麼問題,面對這樣的狀況,爲何還能產生非關係型數據庫?架構

隨着Web 2.0網站的興起,關係型數據庫在應對Web 2.0網站,特別是海量數據和高併發的SNS(社交網絡服務)類型的Web 2.0網站時,暴露出不少難以解決的問題。主要的就是三高問題:併發

1)對數據庫高併發讀寫需求

Web 2.0網站會根據用戶的個性化信息來實時生成動態頁面和提供動態信息。所以,沒法使用動態頁面靜態化技術,因此數據庫的併發負載很是高,通常會達到10000次/s以上的讀寫請求。關係型數據庫對於上萬次的查詢請求仍是能夠勉強支撐的。當出現上萬次的寫數據請求時,硬盤I/O就已經沒法承受了。對於普通的BBS網站,每每也會存在高併發的寫數據請求。好比:爆料明星等,就會有不少人評論。結果頗有可能由於流量過大而引發網站癱瘓。運維

2)對海量數據高效存儲於訪問需求

相似於大型的社交網站,好比:Facebook、Friendfeed等。天天都會產生大型的用戶動態信息。例如:Facebook一個月就會產生2.5億條用戶動態信息。對於關係型數據庫來講,在一個包含2.5億條記錄的表中執行SQL查詢。效率是很是低的。tcp

3)對數據庫高可擴展性與高可用需求

在Web架構中,數據庫是最難進行橫向擴展的。當應用系統的用戶量與訪問量與日俱增時,數據庫是沒辦法像Web服務器同樣,簡單得經過添加硬件和服務器節點來擴展其性能和負載能力的。尤爲對於一些須要24小時對外提供服務器的網站來講,數據庫的升級與擴展每每會伴隨着停機維護與數據遷移,其工做量是很是龐大的。

關係型數據庫和非關係型數據庫都有各自的特色與應用場景。二者的緊密結合將會給Web 2.0的數據庫發展帶來新的思路。讓關係型數據庫關注在關係上,非關係型數據庫關注在存儲上。

經過以上內容,大體能夠了解到非關係的一些基本概念,接下來進一步的瞭解——Redis數據庫

2、Redis數據庫基礎

1.Redis服務器簡介

Redis是一個開源的、使用C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、key-value(鍵值對)數據庫,是目前分佈式架構中不可或缺的一環。

Redis服務器程序是單進程模型,也就是在一臺服務器上能夠同時啓動多個Redis進程,而Redis的實際處理速度則徹底依靠於主進程的的執行效率。若在服務器上只運行一個Redis進程,當多個客戶端同時訪問時,服務器的處理能力會有必定程度的降低,若在同一臺服務器上開啓多個Redis進程,Redis在提升併發處理能力的同時會給服務器的CPU形成很大壓力。也就是說,在實際生產環境中,須要根據實際的需求來決定開啓多少個Redis進程。若對高併發要求更高一些,可能會考慮在同一臺服務器上開啓多個進程。若CPU資源比較緊張,採用單進程便可。

redis具備如下顯著的優勢:

  • 具備極高的讀寫速度,數據讀取的速度最高可達到110000次/s;數據寫入速度最高可達到81000次/s;
  • 支持豐富的數據類型,不只僅支持簡單的key-value數據類型,還支持Strings、Lists、Hashes、Sets及Ordered Sets等數據類型操做;
  • 支持數據的持久化,能夠將內存中的數據保存在硬盤中,重啓時能夠再次加載使用;
  • 原子性,Redis全部的操做都是原子性的;
  • 支持數據備份,及master-salve模式的數據備份;

Redis數據庫做爲內存運行的數據庫,緩存是其較常應用的場景之一,除此以外,Redis常見應用場景還包括獲取N個數據的操做、排行榜應用、計數器應用、存儲關係、實施分析系統、日誌記錄等。

2.Redis數據庫部署

Redis數據庫的安裝相對於其餘服務來講比較簡單,能夠經過官網下載相應的軟件包,也可使用本人發佈的網盤連接:https://pan.baidu.com/s/1bOhIr3yJmSVUpjTdv_x3Kw
提取碼:zp79
上傳到Linux服務器進行解壓、安裝便可!

一般狀況下在Linux系統中進行源碼編譯安裝,須要執行./configure進行環境檢查與配置。從而生成Makefile文件,再執行make && make install命令進行編譯安裝,而Redis源碼包直接提供了Makefile文件,因此在解壓完軟件包後,可直接進入解壓後的軟件包目錄,執行make && make install命令進行編譯安裝便可!以下:

[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服務默認的安裝位置是/usr/src/redis-3.2.9/src

在安裝過程當中,若是想要安裝到指定目錄最好先進入相應的目錄,再執行相應的操做便可!也可使用如下命令:

[root@localhost redis-3.2.9]# make && make PREFIX=/usr/local/ install
//安裝到/usr/local目錄

make install 只是安裝了二進制文件到系統中,並無啓動腳本和配置文件。軟件包中默認提供了一個install_server.sh腳本文件。經過該腳本文件能夠設置Redis服務所須要的相關配置文件。當腳本執行完畢,Redis服務就已經啓動,默認偵聽端口爲6379。具體命令以下:

[root@localhost redis-3.2.9]# cd /usr/src/redis-3.2.9/utils/
[root@localhost utils]# ./install_server.sh 
//進入指定的目錄,運行腳本
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]                                             //設置端口號 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]                              //設置默認的配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]                             //設置日誌文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]                  //設置數據目錄
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]                   //執行命令存放位置
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.                               //確認信息,回車便可! 
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!
//以上這些信息選擇默認便可!
[root@localhost ~]# netstat -anpt | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      6396/redis-server 1 
//確認監聽端口爲6379

安裝完成以後(服務器默認已經啓動)可使用Redis的服務控制腳本對Redis服務進行控制,命令以下:

[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

3.配置參數

Redis主配置文件爲/etc/redis/6379.conf,配置文件默認就能夠知足需求,固然也可根據實際狀況對配置文件進行修改, 配置文件大體內容:

[root@localhost ~]# vim /etc/redis/6379.conf 
                  ………………                                                            //省略部份內容
bind 127.0.0.1 192.168.1.1                                                        //監聽的主機地址(最好加上本身的IP地址)
port 6379                                                                                   //監聽端口
daemonize yes                                                                          //啓動守護進程
pidfile /var/run/redis_6379.pid                                                   //指定PID文件
loglevel notice                                                                           //日誌級別
logfile /var/log/redis_6379.log                                                  //指定日誌文件

//redis服務的配置文件幾乎不須要修改任何內容就可直接工做!
//修改完配置文件重啓服務,這是常識,不要大意!!!
[root@localhost ~]# /etc/init.d/redis_6379 restart

關於優化Redis服務能夠參考的參數有:
非關係型數據庫(NoSQL)——Redis安裝及部署詳解

3、Redis服務命令工具

Redis軟件提供了多個命令工具,當Redis安裝時,所包含的軟件工具會同時被安裝到系統中,在系統中能夠直接使用。

Redis服務命令工具的做用:

  • redis-server:用於啓動Redis服務的工具;
  • redis-benchmark:用於檢測Redis在本機的運行效率;
  • redis-check-aof:修復AOF持久化文件;
  • redis-check-rdb:修復RDB持久化文件;
  • redis-cli:Redis命令工具;

這篇博文主要介紹redis-cli、redis-benchmark命令工具的使用。

1.redis-cli命令行工具

Redis數據庫系統也是一個典型的C/S(客戶端/服務器端)架構的應用,要訪問Redis數據庫須要使用專門的客戶端軟件。Redis服務的客戶端軟件就是自帶的redis-cli命令行非法操做。使用redis-cli鏈接到指定數據庫,鏈接成功後會進入提示符爲「遠程主機IP地址:端口號>」的數據庫操做環境。用戶就能夠輸入各類操做語句對數據庫進行管理。好比:

[root@localhost ~]# redis-cli        //鏈接到本機的Redis數據庫
127.0.0.1:6379> ping                  //檢測Redis服務是否爲啓動狀態
PONG

在進行數據庫鏈接操做時,客戶端(前提是支持redis命令工具)能夠經過選項來指定遠程主機上的Redis數據庫(Redis服務器配置文件中必須有真實的IP地址),實驗環境,我就把Redis服務器的防火牆強行關閉了,實際環境中,確定是要開啓相應端口。命令格式以下:

[root@localhost ~]# redis-cli -h 192.168.1.1 -p 6379
192.168.1.1:6379> info                        //登陸成功,使用「info」能夠查看Redis服務器的詳細信息
//「-h」指定遠程主機、「-p」指定Redis服務的端口號、「-a」指定redis數據庫的密碼(若是沒有密碼便可省略)

在數據庫操做環境中,使用help命令能夠獲取命令的相應幫助。

有三種獲取命令幫助的方式:

  • help @<group>:獲取<group>中的命令列表
  • help <command>:獲取某個命令的幫助
  • help <tab>:獲取可能幫助的主題列表

具體操做方法以下:

[root@localhost ~]# redis-cli 
127.0.0.1:6379> help @list                           //查看全部與list數據類型相關的命令
…………               //內容太多,這裏就省略了
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

2. redis-benchmark 測試工具

redis-benchmark 是官方自帶的Redis性能測試工具,能夠有效地測試Redis服務的性能。經常使用的選項如圖:
非關係型數據庫(NoSQL)——Redis安裝及部署詳解

根據以上 選項能夠針對某臺Redis服務器進行性能檢測,命令格式以下:

[root@localhost ~]# redis-benchmark -h 192.168.1.1 -p 6379 -c 100 -n 10000
                     ………………                 //省略部份內容
====== 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.一、端口號爲6379的Redis服務器發送100個併發鏈接與10000個請求測試性能
[root@localhost ~]# redis-benchmark -h 192.168.1.1 -p 6379 -q -d 100
//針對IP地址爲192.168.1.一、端口號爲6379的Redis服務器測試存取大小爲100B的數據包的性能
[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.一、端口號爲6379的Redis服務器在進行set與lpush操做時的性能
//實驗環境,性能較差,多多諒解!

4、Redis數據庫經常使用命令

經過博文前面的介紹,已經知道Redis數據庫採用key-value(鍵值對)的數據存儲形式。

使用的命令大體是:

  • set:存放數據,基本格式:set key value;
  • get:獲取數據,基本格式:get key;

好比:

127.0.0.1:6379> set k1 qq
OK
127.0.0.1:6379> get k1
"qq"

1.key相關命令

1)keys

使用keys命令能夠獲取符合規則的鍵值列表,一般能夠結合「*」、「?」等選項使用。例如:

127.0.0.1:6379> keys *               //查看當前數據庫的全部鍵
1) "mylist"
2) "k2"
3) "k11"
4) "counter:__rand_int__"
5) "key:__rand_int__"
6) "k1"
7) "k3"
//不光是本身設置的鍵,還有系統默認的鍵
127.0.0.1:6379> keys k*            //查看當前數據庫中以「k」開頭的鍵
1) "k2"
2) "k11"
3) "key:__rand_int__"
4) "k1"
5) "k3"
127.0.0.1:6379> keys k?            //查看當前數據庫中以「k」開頭後面包含任意一位的鍵
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> keys k??         //查看當前數據庫中以「k」開頭後面包含任意兩位的鍵
1) "k11"

2)exists

使用exists命令能夠判斷鍵值是否存在,例如:

127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> exists k0
(integer) 0
//返回值1表示存在;0表示不存在

3)del

使用del命令能夠刪除當前數據庫的指定key,例如:

127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> get k1
(nil)
//刪除以後,k1鍵對應的數據也就消失了

4)type

使用type命令能夠獲取key對應的value值類型,例如:

127.0.0.1:6379> type k2
string
//字符串類型

5)rename

rename命令是對已有key進行重命名,格式爲:「rename 源key 目標key」。使用rename命令進行重命名操做時,不管目標key是否存在都進行重命名,並且源key的值會覆蓋目標key的值。在實際使用過程當中,建議使用exists命令查看目標key是否存在,再決定是否執行rename命令,避免覆蓋重要數據。例如:

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"

6)renamenx

renamenx命令語法格式、做用與rename命令相同,不一樣點在於使用renamex命令進行重命名是,若是目標key存在則不進行重命名。例如:

127.0.0.1:6379> keys k??
1) "k11"
127.0.0.1:6379> renamenx k3 k11
(integer) 0
//返回值是0,表示失敗

7)dbsize

dbsize命令的做用是查看當前數據庫中key的數目,例如:

127.0.0.1:6379> dbsize 
(integer) 5

2.多數據庫經常使用命令

1)多數據庫間切換

Redis支持多數據庫,默認有16個數據庫,數據庫名稱是用數字0-15來表示的。切換數據庫的操做,以下:

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> 
//使用select命令進行切換,端口號後面什麼都沒有,則表示0號數據庫

2)多數據庫之間移動數據

Redis的多數據庫在必定程度上是相對獨立的。例如:

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數據庫提供了一個「move」命令,能夠進行多數據庫的數據移動。例如:

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號數據庫中「q1」的數據移動到1號數據庫

3)清除數據庫內數據

Redis數據庫的整庫數據刪除主要分爲兩個部分:

  • 清空當前數據庫的數據,使用「flushdb」命令能夠實現;
  • 清空全部數據庫的數據,使用「flushall」命令能夠實現。

可是,數據清空操做比較危險,生產環境下,通常不建議使用。

———————— 本文至此結束,感謝閱讀 ————————

相關文章
相關標籤/搜索