今天我們學習一種新的NoSQL數據庫,叫做redis。Redis是一種基于鍵值對(key-value)的NoSQL數據庫。Redis與其它數據庫相比,不同的是Redis的值可以存儲多種數據類型。它們具體包括:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位圖)、GEO(地理信息定位)等。除此之外Redis還會將數據保存到內存中,所以Redis數據庫地讀寫性能非常高。這時可能有人會說,那Redis豈不是很不安全,因為保存在內存中的數據是不安全的,如果碰到突然斷電或者系統故障的話,那保存到Redis中的數據豈不是就要丟失了。在這一點上,我們恰恰不用擔心,因為Redis為我們提供了快照和日志等方式,來允許我們將內存中的數據保存到硬盤上,這樣當遇到上述故障重Redis時,Redis就會重新從硬盤加載已經保存好的數據,重新加載到內存中。除了上述功能外,Redis還提供了很多附加的高級的功能。如鍵過期、發布訂閱、事物、流水線、Lua腳本等功能。下面我們看一下Redis中的特性。
- Redis特性
- 前面我們提到過Redis的執行速度非???,下面我們從幾個方面來介紹一下為什么Redis的速度這么快。首先Redis中的所有數據都是存儲到內存中的,我們知道直接操作內存和直接操作磁盤是有很大的區別的,因為操作磁盤為會很大的IO開銷,所以,這也是Redis將數據保存到內存中,提高性能的原因之一。其二Redis是用C語言寫的,在這一點上,我們知道C語言是最接近匯編的語言,也就是最接近操作系統的語言了,所以,在執行速度上,也會比間接提高Redis的執行效率。還有一個原因,那就是Redis是采用單線程架構,這么做的好處就是可以預防多線程可以產生的競爭問題。
- Redis雖然是鍵值對的數據庫,但Redis中的值不僅可以保存字符串,還可以保存多種數據類型。也就是前面提到過的字符串、哈希、列表、集合、有序集合等。
- 在Redis中除了提供了上述的5種數據結構外,還提供了多種額外的功能。如鍵過期(可以實現緩存功能)、發布訂閱(可以實現消息系統)、流水線(可以通過此功能一次性執行一批命令,減少網絡開銷)、Lua腳本(可以通過Lua語言創造新的Redis命令)等。
- Redis提供了簡單的TCP通信協議,支持很多種語言,可以很方便的接入到Redis中。
- 持久化。就向前面提到的。在Redis中,可以通過快照和日志功能,來將內存中的數據,持久化到硬盤中。
- 主從復制。Redis中提供了復制的功能??梢詫崿F多個相同的數據的Redis副本,依次來實現Redis的分布式存儲。
- 分布式。Redis中提供了Redis Sentinel功能,通過它可以保證Redis節點在發生故障時,自動轉移。依次來保證Redis的安全性。除此之外,Redis還提供了Redis Cluster功能。正是通過此功能,才保證了Redis真正的分布式實現。
- Redis可以做些什么
- 緩存。通過Redis中的鍵過期功能,我們可以為鍵設置一個過期時間,這樣當這個鍵超過了過期時間時,當前保存的鍵的信息,也就是失效了。這也就是用Redis實現緩存功能的使用方式。
- 排行榜系統。在Redis中提供了列表和有序列表,通過此功能,我們可以很方便的實現排行榜功能,
- 計數器。我們平時在購物時,會發現購物網站上有很多類似于瀏覽量之類的數據。當我們每訪問一次時,數據就會執行加1操作。如果我們采用傳統的數據庫方式實現,那么就會因為并發量很大,而對數據庫性能產生相應影響。而如果采用Redis的方式計算,則會容易多了,因為Redis中會在內存中計算,這樣計數器的性能就會非常高了。當然除此之外還可以用Redis實現社交網絡中的贊、踩、粉絲、共同好友、等功能。
- 消息隊列。Redis中提供了發布訂閱和阻塞隊列功能,雖然我們可以使用專業的消息隊列,但對于一般的隊列功能,Redis都可以支持。
- Redis的注意事項
- 我們知道Redis是將數據存儲到內存中的,雖然存儲到內存中的會提到數據訪問的性能,但如果我們將所有的數據都保存到內存中,那么就可能會造成相應的內存泄漏了,從而導致系統的癱瘓。
- 我們知道,將數據存儲到內存中的目的是為了提高數據訪問的性能。那么我們怎么在設計系統時,怎么判斷哪些數據要保存到Redis中,而哪些數據而不需要保存到Redis中呢?通常來說數據分為熱數據(頻繁操作的數據)和冷數據(非頻繁操作的數據)。我們知道,提高數據訪問性能的主要原因是因為大量并發的操作,正是因為這樣,所以,如果我們不將大部分用戶都訪問的公用數據放到內存中,那么勢必會造成程序的不穩定。所以我們應該將公用的數據,應該存儲到Redis中。那么反之,不是公用的數據,也就不會產生大量的并發,所以,這一部分數據,我們是不需要存儲到Redis中的。
- Redis的安裝
- 通過了上述的介紹使我們知道Redis在系統架構中有者不可替代的作用,而大部分企業的系統架構都采用了linux系統部署,所以,在介紹安裝時我們將重點介紹Linux系統的安裝。因為本文將采用源碼的方式安裝,又因為Linux系統和mac OS系統源碼安裝的方式相同,所以,本文將采用Mac OS系統的方式來演示安裝過程。
- 首先我們訪問Redis官網。來選擇Redis的源碼包。具體操作如圖示:
當我們下載完成后,我們只需執行下面的命令就可以采用源碼的方式,安裝Redis。
tar xzvf redis.tar.gz // 解壓當前壓縮包 ln -s redis redis // 創建一個redis目錄軟鏈接 cd redis // 進入redis目錄 make // 編譯 make install // 安裝
當我們安裝完成后可以直接執行下面命令查看redis的版本,如果沒有顯示版本則表示可能redis安裝失敗,或者,當前目錄不至此此命令
redis-cli -v
在Redis安裝成功后的bin目錄下會有很多以redis開頭的可執行文件。掌握這些文件的使用,可以幫助我們更好的理解redis的使用。下在我們來簡單介紹一下bin目錄下的相關redis命令。
可執行文件作用redis-server啟動Redisredis-cliRedis命令行客戶端 redis-benchmarkRedis基準測試工具 redis-check-aofRedis AOF持久化文件檢測和修復工具 redis-check-dumpRedis RDB持久化文件檢測和修復工具 redis-sentinel啟動Redis Sentinel
下面我們用上面提到的命令來啟動Redis,也就是redis-server命令。
通過上面的啟動信息,可以使我們知道當前Redis的版本是4.0.9,端口是6379(Redis的默認端口)。那如果我們要修改Redis的端口,應該怎么做呢?在Redis中我們可以很方便的實現,也就是在redis-server命令后直接添加端口即可。具體命令如下:
redis-server --port 6380
在Redis中我們除了上述的方式外,還可以通過修改配置文件的方式來修改端口(不只是端口,還有其它的相關配置),并且這種方式,是Redis官方推薦的方式。Redis中的配置文件在redis.conf文件中,下面我們看一下redis.conf文件中相關參數的說明。
配置名配置說明port端口logfile日志文件dirRedis工作目錄(存放持久化文件和日志文件)daemonize是否以守護進程的方式啟動Redis
下面我們修改redis.conf文件中的port屬性,然后啟動Redis服務,看一下Redis端口是否成功被修改。
下面我們用配置文件中的方式來啟動Redis服務。
redis-server /redis.conf
- Redis命令行客戶端
- 既然我們已經成功的啟動了Redis服務,下面我們用下面的命令來訪問我們的Redis服務。
redis-cli - h {host} -p {port}
我們看上面的信息,已經成功將hello world信息存儲到了Redis中的。除了上述的操作外,我們還可以直接獲取Redis中的值。具體操作如下:
如果我們沒有修改Redis默認的端口,并且訪問的是本地Redis服務的話,那么我們在用redis-cli命令連接Redis服務時,就可以不用指定 -h參數和-p參數了。
- 停止Redis服務
在我們不需要連接Redis服務時,我們可以使用下面的命令來優雅的方式停止Redis服務,既然有優雅的方式,當然也有相對暴力的方式停止服務,也就是直接殺掉進程的方式。但Redis不推薦使用這個方式停止Redis服務,因為這種方式可能會導致Redis相關數據的丟失。下面我們看優雅的停止Redis服務的命令。
redis-cli shutdown
采用這種方式停止Redis服務時,Redis會自動的生成持久化文件,從而保證Redis中的數據的不會丟失。當然我們也可以添加相關參數則讓Redis服務在執行上述命令時不生成持久化文件。具體的命令如下:
redis-cli shutdown nosave|save