博文目錄
1、關係型數據庫與非關係型數據庫
2、Redis數據庫簡介
3、Redis安裝部署
4、Redis命令工具前端
Redis數據庫是一個非關係型數據庫,在討論Redis以前,咱們先了解關係型數據庫與非關係型數據庫的概念。git
數據庫按照其結構能夠分爲關係型數據庫與其餘數據庫,而這些其餘數據庫咱們將其統稱爲非關係型數據庫。redis
關係型數據庫是一個結構化的數據庫,建立在關係模型基礎上,通常面向記錄。它藉助於集合代數等數學概念和方法來處理數據庫中的數據。關係模型指二維表格模型,於是一個關係型數據庫就由二維表及其之間的聯繫組成的一個數據組織。實際中,各類實體與實體之間的各類聯繫均可以用關係模型來表示。SQL語句就是一種基於關係型數據庫的語言,用於執行對關係型數據庫中數據中數據的檢索和操做。數據庫
主流的關係型數據庫包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等。vim
NoSQL(NoSQL = Not Only SQL),意思是「不只僅是SQL」,是非關係型數據庫的總稱。主流的NoSQL數據庫有Redis、MongBD、CouhDB等。以上這些數據庫,它們的存儲方式、存儲結構以及使用的場景都是徹底不一樣的。全部咱們認爲它是一個非關係型數據庫的集合,而不是像關係型數據庫同樣,是一個統稱。換言之,主流的關係型數據庫之外的數據庫,都是非關係型的。NoSQL數據庫憑藉着其非關係型、分佈式、開源和橫向擴展等優點,被認爲是下一代數據庫產品。centos
High performance——對數據庫高併發讀寫需求;緩存
Huge Storage——對海量數據高效存儲與訪問需求;服務器
關係型數據庫和非關係型數據庫都有各自的特色與應用場景,二者精密結合將會給Web 2.0的數據庫發展帶來新的思路。讓關係型數據庫關注在關係上,非關係型數據庫關注在存儲上。網絡
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個數據的操做、排行榜類應用、計數器應用、存儲關係、實時分析系統、日誌記錄等。
Redis官網:https://www.redis.io 或者:https://pan.baidu.com/s/1xdDZzTGdOOWFwpJtZtwRaw
提取碼:xuqg 下載相應的源碼軟件包,而後上傳至Linux系統的服務器中進行解壓、安裝。
一般狀況下在Linux系統中進行源碼編譯安裝,須要先執行./configure進行環境檢查與配置,從而生成Makefile文件,再執行make &&make install命令進行編譯安裝。而Redis源碼包中直接提供了Makefile文件,因此再解壓完軟件包後,可直接進入解壓縮後的軟件包目錄,執行make與make install命令進行安裝便可。
[root@centos01 ~]# tar zxvf redis-3.2.9.tar.gz -C /usr/src/<!--解包--> [root@centos01 ~]# mv /usr/src/redis-3.2.9/ /usr/src/redis/ <!--將redis全部配置文件剪切到/usr/src/redis/目錄--> [root@centos01 ~]# cd /usr/src/redis/ <!--進入redis目錄--> [root@centos01 redis]# ls 00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests BUGS deps MANIFESTO runtest sentinel.conf utils CONTRIBUTING INSTALL README.md runtest-cluster src [root@centos01 redis]# make && make install <!--編輯及安裝redis--> <!--(若想更改安裝路徑,可使用make PREFIX=安裝路徑 install命令格式來進行安裝)-->
make install只是安裝了二進制文件到系統中,並無啓動腳本和配置文件。軟件包中默認提供了一個install_server.sh腳本文件,經過該腳本文件能夠設置Redis服務所須要的相關配置文件。當腳本運行完畢,Redis服務就已經啓動,默認偵聽端口爲6379。
[root@centos01 ~]# cd /usr/src/redis/utils/ <!--進入utils目錄--> [root@centos01 utils]# ./install_server.sh <!--初始化redis--> 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 <!--端口號,默認容許6379--> Config file : /etc/redis/6379.conf <!--redis主配置文件--> Log file : /var/log/redis_6379.log <!--redis日誌文件--> 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@centos01 ~]# netstat -anptu | grep redis<!--監聽redis是否啓動--> tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 5141/redis-server 1
安裝完成後,可經過Redis的服務控制腳本/etc/init.d/redis_6379來對Redis服務進行控制,如中止Redis服務、啓動Redis服務、重啓Redis服務、查看Redis運行狀態。
[root@centos01 ~]# /etc/init.d/redis_6379 start <!--啓動Refis服務--> [root@centos01 ~]# /etc/init.d/redis_6379 stop <!--中止Redis服務--> [root@centos01 ~]# /etc/init.d/redis_6379 restart <!--重啓Redis服務--> [root@centos01 ~]# /etc/init.d/redis_6379 status <!--查看Redis運行狀態-->
Redis主配置文件爲/etc/redis/6379.conf,由註釋行與設置行兩部分組成。與大多數Linux配置文件同樣,註釋性的文字以「#」開始,包含了對相關配置內容進行的說明和解釋。註釋行與空行之外的內容即爲設置行。可根據生產環境的需求調整相關參數。如:
[root@centos01 ~]# vim /etc/redis/6379.conf <!--修改redis主配置文件啓動羣集功能--> 62 bind 192.168.100.10 <!--監聽的主機地址--> 85 port 6379 <!--監聽端口號--> 129 daemonize yes <!--啓動守護進程--> pidfile /var/run/redis_6379.pid <!--指定PID文件--> loglevel notice <!--日誌級別--> logfile "/var/log/redis_6379.log" <!--指定日誌文件--> [root@centos01 ~]# /etc/init.d/redis_6379 restart <!--重啓redis服務-->
除了上述配置參數外,Redis主配置文件中還包含不少其餘的配置參數,具體內以下:
Redis軟件提供了多個命令工具,當Redis安裝時,所包含的軟件工具會同時被安裝到系統中,在系統中能夠直接使用。這些命令工具的做用分別以下所示:
redis-server:用於啓動Redis的工具;
redis-benchmark:用於檢測Redis在本機的運行效率;
redis-check-aof:修復AOF持久化文件;
redis-check-rdb:修復RDB持久化文件;
redis-cli:Redis命令行工具;
- redis-setinel:redis-server文件的軟鏈接;
Redis數據庫系統也是一個典型的C/S(客戶端/服務器端)架構的應用,要訪問Redis數據庫須要使用專門的客戶端軟件。Redis服務的客戶端軟件就是其自帶的redis-cli命令行工具。使用redis-cli鏈接指定數據庫,鏈接成功後會進入提示符爲「遠程主機IP地址:端口號>」 的數據庫操做環境。
用戶能夠輸入各類操做語句對數據庫進行管理,如執行ping命令能夠檢測redis服務是否啓動。
[root@centos01 ~]# redis-cli <!-- 登陸本地redis數據庫--> 192.168.100.10:6379> ping <!--檢測redis服務是否啓動--> PONG 192.168.100.10:6379> exit <!--退出數據庫-->
在進行數據庫鏈接操做時,能夠經過選項來指定遠程主機上的Redis數據庫,命令語法爲redis-cli -h host -p port -a password。其中,「-h」指定遠程主機;「-p指定服務的端口號」,若設置了密碼,能夠用「-a」指定密碼,若沒設置鏈接密碼,則能夠省略「-a」選項。
[root@centos01 ~]# redis-cli -h 192.168.100.10 -p 6379 <!--登陸遠程主機100.10的6379端口redis實例--> 192.168.100.10:6379> info # Server redis_version:3.2.9 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:2cc10a3065b1ebc2 ............ <!--此處省略部份內容--> db0:keys=1,expires=0,avg_ttl=0 192.168.100.10:6379> exit <!--退出數數據庫-->
在數據庫操做環境中,使用help命令能夠獲取命令類型的幫助。其中,有三種獲取命令幫助的方式:
help @<group>:獲取<group>中的命令列表;
help <command>:獲取某個命令的幫助;
- help <tab>:獲取可能幫助的主題列表;
具體操做方式以下所示:
[root@centos01 ~]# redis-cli 192.168.100.10:6379> help @list <!--查看全部與List數據類型有關的命令--> BLPOP key [key ...] timeout summary: Remove and get the first element in a list, or block until one is available since: 2.0.0 BRPOP key [key ...] timeout summary: Remove and get the last element in a list, or block until one is available since: 2.0.0 BRPOPLPUSH source destination timeout summary: Pop a value from a list, push it to another list and return it; or block until one is available since: 2.2.0 LINDEX key index summary: Get an element from a list by its index since: 1.0.0 LINSERT key BEFORE|AFTER pivot value summary: Insert an element before or after another element in a list since: 2.2.0 LLEN key summary: Get the length of a list since: 1.0.0 LPOP key summary: Remove and get the first element in a list since: 1.0.0 LPUSH key value [value ...] summary: Prepend one or multiple values to a list since: 1.0.0 LPUSHX key value summary: Prepend a value to a list, only if the list exists since: 2.2.0 LRANGE key start stop summary: Get a range of elements from a list since: 1.0.0 LREM key count value summary: Remove elements from a list since: 1.0.0 LSET key index value summary: Set the value of an element in a list by its index since: 1.0.0 LTRIM key start stop summary: Trim a list to the specified range since: 1.0.0 RPOP key summary: Remove and get the last element in a list since: 1.0.0 RPOPLPUSH source destination summary: Remove the last element in a list, prepend it to another list and return it since: 1.2.0 RPUSH key value [value ...] summary: Append one or multiple values to a list since: 1.0.0 RPUSHX key value summary: Append a value to a list, only if the list exists since: 2.2.0 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 127.0.0.1:6379> help get <!--查看get命令的命令幫助--> GET key summary: Get the value of a key since: 1.0.0 group: string
redis-benchmark是官方自帶的Redis性能測試工具,能夠有效地測試Redis服務的性能。基本的測試語法爲redis-benchmark [option] [option value]。經常使用選項以下所示:
-h:指定服務器主機名;
-p:指定服務器端口;
-s:指定服務器socket;
-c:指定併發鏈接數;
-n:指定請求數;
-d:以字節(B)的形式指定SET/GET值的數據大小;
-k:1=keep alive 0=reconnect;
-r:SET/GET/INCR 使用隨機key,SADD使用隨機值;
-p:經過管道傳輸<numreq>請求;
-q:強制退出redis。僅顯示query/sec值;
--csv:以CSV格式輸出;
-l:生成循環,永久執行測試;
-t:僅運行以逗號分隔的測試命令列表;
- -i:idle模式。僅打開N個idle鏈接並等待;
結合上述選項,能夠針對某臺Redis服務器進行性能檢測,如執行redis-benchmark -h 192.168.100.10 -p 6379 -c 100 -n 10000命令便可向IP地址192.168.100.十、端口爲6379的Redis服務器發送100個併發鏈接與10000個請求測試性能:
[root@centos01 ~]# redis-benchmark -h 192.168.100.10 -p 6379 -c 100 -n 10000 ………… <!--此處省略部份內容--> 5165.29 requests per second ====== MSET (10 keys) ====== 10000 requests completed in 0.18 seconds 100 parallel clients 3 bytes payload keep alive: 1 0.01% <= 1 milliseconds 98.93% <= 2 milliseconds 100.00% <= 2 milliseconds 55555.55 requests per second
執行redis-benchmark -h 192.168.100.10 -p 6379 -q -d 100命令的做用是測試存取大小爲100B的數據包性能:
[root@centos01 ~]# redis-benchmark -h 192.168.100.10 -p 6379 -q -d 100 PING_INLINE: 100603.62 requests per second PING_BULK: 98231.83 requests per second SET: 87412.59 requests per second GET: 90991.81 requests per second INCR: 94786.73 requests per second LPUSH: 86206.90 requests per second RPUSH: 82987.55 requests per second LPOP: 84245.99 requests per second RPOP: 87108.02 requests per second SADD: 90744.10 requests per second SPOP: 90661.83 requests per second LPUSH (needed to benchmark LRANGE): 85251.49 requests per second LRANGE_100 (first 100 elements): 23912.00 requests per second LRANGE_300 (first 300 elements): 6502.37 requests per second LRANGE_500 (first 450 elements): 3816.07 requests per second LRANGE_600 (first 600 elements): 2778.09 requests per second MSET (10 keys): 54141.85 requests per second
還能夠測試某些操做的性能,例如,執行redis-benchmark -t set,lpush -n 100000 -q命令的做用是測試本機上Redis服務在運行set與lpush操做時的性能:
[root@centos01 ~]# redis-benchmark -t set,lpush -n 100000 -q SET: 81037.28 requests per second LPUSH: 88652.48 requests per second
Redis數據庫採用key-value(鍵值對)的數據存儲形式,所使用的命令是set和get。
set:存放數據,命令格式爲set key value;
- get:獲取數據,命令格式爲get key;
例如,在Redis的命令行模式下執行「set xingming liyanxin」,表示在當前數據庫下存放一個key爲xingming,value爲liyanxin的數據,而執行「get xingming」命令便可查看存放的數據。
[root@centos01 ~]# redis-cli 192.168.100.10:6379> set xingming liyanxin OK 192.168.100.10:6379> set xingbie nan OK 192.168.100.10:6379> get xingming "liyanxin" 192.168.100.10:6379> get xingbie "nan"
*使用keys命令能夠獲取符合規則的鍵值列表,一般狀況能夠結合、?等選項來使用。**
192.168.100.10:6379> set k1 1 OK 192.168.100.10:6379> set k2 2 OK 192.168.100.10:6379> set v1 3 OK 192.168.100.10:6379> set v2 4 OK 192.168.100.10:6379> set v33 6 OK 192.168.100.10:6379> KEYS * <!--查看當前數據庫中全部鍵--> 1) "xingming" 2) "xingbie" 3) "k1" 4) "k2" 5) "v1" 6) "v2" 7) "v33" 192.168.100.10:6379> KEYS v* <!--查看當前數據庫中以v開頭的全部數據--> 1) "v1" 2) "v2" 3) "v33" 192.168.100.10:6379> KEYS v? <!--查看當前數據庫中以v開頭後面包含任意一位的數據--> 1) "v1" 2) "v2" 192.168.100.10:6379> KEYS v?? <!--查看當前數據庫中以v開頭後面包含任意兩位的數據--> 1) "v33" 192.168.100.10:6379> KEYS k* <!--查看當前數據庫中以k開頭的全部數據--> 1) "k2" 2) "k1" 192.168.100.10:6379> KEYS k? <!--查看當前數據庫中以k開頭後面包含任意一位的數據--> 1) "k2" 2) "k1"
使用exists命令能夠判斷鍵值是否存在。
192.168.100.10:6379> EXISTS xingming (integer) 1 192.168.100.10:6379> EXISTS xingbie (integer) 1 192.168.100.10:6379> EXISTS danwei (integer) 0 192.168.100.10:6379> EXISTS nianling (integer) 0
使用del命令能夠刪除當前數據庫的指定key。
192.168.100.10:6379> KEYS * <!--查看當前數據庫中全部鍵--> 1) "xingming" 2) "xingbie" 3) "k1" 4) "k2" 5) "v1" 6) "v2" 7) "v33" 192.168.100.10:6379> del k2 <!--刪除當前數據庫中的k2鍵--> (integer) 1 192.168.100.10:6379> del v2 <!--刪除當前數據庫中的v2鍵--> (integer) 1
使用type命令能夠獲取key對應的value值類型。
192.168.100.10:6379>> type v33 string 192.168.100.10:6379> type xingbie string
使用rename命令對已有key進行重命名。(使用rename命令進行重命名時,不管目標key是否存在都進行重命名,且源key的值會覆蓋目標key的值;在實際工做當中,建議先使用exists命令查看目標key是否存在,再決定是否執行rename命令,以免覆蓋重要數據)。
192.168.100.10:6379> KEYS * <!--查看當前數據庫中全部鍵--> 1) "xingming" 2) "xingbie" 3) "k1" 4) "k2" 5) "v1" 6) "v2" 7) "v33" 192.168.100.10:6379> rename v33 v3 OK 192.168.100.10:6379> keys v* 1) "v1" 2) "v3" 192.168.100.10:6379> get v1 "3" 192.168.100.10:6379> get v3 "6" 192.168.100.10:6379> rename v1 v3 OK 192.168.100.10:6379> get v1 (nil) 192.168.100.10:6379> get v3 "3"
使用renamenx命令對已有key進行重命名,並檢測新名是否存在。(使用renamenx命令進行重命名時,若是目標key存在則不進行重命名)。
192.168.100.10:6379> KEYS * <!--查看當前數據庫中全部鍵--> 1) "xingming" 2) "xingbie" 3) "k1" 4) "v3" 192.168.100.10:6379> get xingming "liyanxin" 192.168.100.10:6379> get k1 "1" 127.0.0.1:6379> renamenx k1 xingming (integer) 0 192.168.100.10:6379> KEYS * <!--查看當前數據庫中全部鍵--> 1) "xingming" 2) "xingbie" 3) "k1" 4) "v3" 192.168.100.10:6379> get k1 "1"
使用dbsize命令查看當前數據庫中key的數目。
192.168.100.10:6379> dbsize (integer) 6
Redis支持多數據庫,Redis在沒有任何改動的狀況下默認包含16個數據庫,數據庫名使用數字0--15來依次命名。使用select命令能夠進行Redis的多數據庫之間的切換,命令格式爲「select index」。其中,index表示數據庫的序號。而使用redis-cli鏈接redis數據庫後,默認使用的是序列號爲0的數據庫
以下所示,使用select命令切換數據庫後,會在前端的提示符中顯示當前所在的數據庫序號,如「192.168.100.10:6379 [5]>」表示當前使用的是序列號爲5的數據庫;若當前使用的數據庫是序列號爲0的數據庫,提示符中則不顯示序號,如「192.168.100.10:6379>」表示當前使用的是序號爲0的數據庫。
192.168.100.10:6379> select 5 <!--切換至序列號爲5的數據庫--> OK 192.168.100.10:6379 [5]> keys * <!--查看全部鍵--> (empty list or set) 192.168.100.10:6379 [5]> select 10 <!--切換至序列號爲10的數據庫--> OK 192.168.100.10:6379 [10]> keys * (empty list or set) 192.168.100.10:6379 [10]> select 0 <!--切換至序列號爲0的數據庫--> OK 192.168.100.10:6379> keys * <!--查看全部鍵--> 1) "k1" 2) "xingming" 3) "v3" 4) "key:__rand_int__" 5) "xingbie" 6) "mylist"
Redis的多數據庫在必定程度上是至關獨立的。例如,在數據庫0上面存放的w1的數據,在其它的1~15的數據庫上是沒法看到的。
192.168.100.10:6379> set w1 100 <!--在數據庫0上面存放w1的數據--> OK 192.168.100.10:6379> get w1 <!--在當前數據庫能夠看到--> "100" 192.168.100.10:6379> select 1 <!--切換到數據庫1--> OK 192.168.100.10:6379 [1]> get w1 <!--查看w1數據,顯然是看不到的--> (nil) 192.168.100.10:6379 [1]> select 0 <!--切換回數據庫0--> OK 192.168.100.10:6379> get w1 <!--查看w1數據,能夠看到 --> "100" 192.168.100.10:6379> move w1 1 <!--將數據庫0中的w1移動到數據庫1中--> (integer) 1 192.168.100.10:6379> select 1 <!--切換到數據庫1--> OK 192.168.100.10:6379 [1]> get w1 <!--查看被移動的數據 --> "100" 192.168.100.10:637979[1]> select 0 <!--切換回數據庫0--> OK 192.168.100.10:6379> get w1 <!--在數據庫0中沒法查看到w1的值-->
Redis數據庫的整庫數據刪除主要分爲兩個部分:清空當前數據庫中的數據,使用flushdb命令實現;清空全部庫中的數據,使用flushall命令。數據庫清空操做比較危險,生產環境下通常不建議使用!
192.168.100.10:6379> FLUSHALL OK
—————— 本文至此結束,感謝閱讀 ——————