初識Redis

  • 2019 年 10 月 7 日
  • 筆記

今天我們學習一種新的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特性
  1. 前面我們提到過Redis的執行速度非常快,下面我們從幾個方面來介紹一下為什麼Redis的速度這麼快。首先Redis中的所有數據都是存儲到記憶體中的,我們知道直接操作記憶體和直接操作磁碟是有很大的區別的,因為操作磁碟為會很大的IO開銷,所以,這也是Redis將數據保存到記憶體中,提高性能的原因之一。其二Redis是用C語言寫的,在這一點上,我們知道C語言是最接近彙編的語言,也就是最接近作業系統的語言了,所以,在執行速度上,也會比間接提高Redis的執行效率。還有一個原因,那就是Redis是採用單執行緒架構,這麼做的好處就是可以預防多執行緒可以產生的競爭問題。
  2. Redis雖然是鍵值對的資料庫,但Redis中的值不僅可以保存字元串,還可以保存多種數據類型。也就是前面提到過的字元串、哈希、列表、集合、有序集合等。
  3. 在Redis中除了提供了上述的5種數據結構外,還提供了多種額外的功能。如鍵過期(可以實現快取功能)、發布訂閱(可以實現消息系統)、流水線(可以通過此功能一次性執行一批命令,減少網路開銷)、Lua腳本(可以通過Lua語言創造新的Redis命令)等。
  4. Redis提供了簡單的TCP通訊協議,支援很多種語言,可以很方便的接入到Redis中。
  5. 持久化。就向前面提到的。在Redis中,可以通過快照和日誌功能,來將記憶體中的數據,持久化到硬碟中。
  6. 主從複製。Redis中提供了複製的功能。可以實現多個相同的數據的Redis副本,依次來實現Redis的分散式存儲。
  7. 分散式。Redis中提供了Redis Sentinel功能,通過它可以保證Redis節點在發生故障時,自動轉移。依次來保證Redis的安全性。除此之外,Redis還提供了Redis Cluster功能。正是通過此功能,才保證了Redis真正的分散式實現。
  • Redis可以做些什麼
  1. 快取。通過Redis中的鍵過期功能,我們可以為鍵設置一個過期時間,這樣當這個鍵超過了過期時間時,當前保存的鍵的資訊,也就是失效了。這也就是用Redis實現快取功能的使用方式。
  2. 排行榜系統。在Redis中提供了列表和有序列表,通過此功能,我們可以很方便的實現排行榜功能,
  3. 計數器。我們平時在購物時,會發現購物網站上有很多類似於瀏覽量之類的數據。當我們每訪問一次時,數據就會執行加1操作。如果我們採用傳統的資料庫方式實現,那麼就會因為並發量很大,而對資料庫性能產生相應影響。而如果採用Redis的方式計算,則會容易多了,因為Redis中會在記憶體中計算,這樣計數器的性能就會非常高了。當然除此之外還可以用Redis實現社交網路中的贊、踩、粉絲、共同好友、等功能。
  4. 消息隊列。Redis中提供了發布訂閱和阻塞隊列功能,雖然我們可以使用專業的消息隊列,但對於一般的隊列功能,Redis都可以支援。
  • Redis的注意事項
  1. 我們知道Redis是將數據存儲到記憶體中的,雖然存儲到記憶體中的會提到數據訪問的性能,但如果我們將所有的數據都保存到記憶體中,那麼就可能會造成相應的記憶體泄漏了,從而導致系統的癱瘓。
  2. 我們知道,將數據存儲到記憶體中的目的是為了提高數據訪問的性能。那麼我們怎麼在設計系統時,怎麼判斷哪些數據要保存到Redis中,而哪些數據而不需要保存到Redis中呢?通常來說數據分為熱數據(頻繁操作的數據)和冷數據(非頻繁操作的數據)。我們知道,提高數據訪問性能的主要原因是因為大量並發的操作,正是因為這樣,所以,如果我們不將大部分用戶都訪問的公用數據放到記憶體中,那麼勢必會造成程式的不穩定。所以我們應該將公用的數據,應該存儲到Redis中。那麼反之,不是公用的數據,也就不會產生大量的並發,所以,這一部分數據,我們是不需要存儲到Redis中的。
  • Redis的安裝
  1. 通過了上述的介紹使我們知道Redis在系統架構中有者不可替代的作用,而大部分企業的系統架構都採用了Linux系統部署,所以,在介紹安裝時我們將重點介紹Linux系統的安裝。因為本文將採用源碼的方式安裝,又因為Linux系統和Mac OS系統源碼安裝的方式相同,所以,本文將採用Mac OS系統的方式來演示安裝過程。
  2. 首先我們訪問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

啟動Redis

redis-cli

Redis命令行客戶端

redis-benchmark

Redis基準測試工具

redis-check-aof

Redis AOF持久化文件檢測和修復工具

redis-check-dump

Redis 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

日誌文件

dir

Redis工作目錄(存放持久化文件和日誌文件)

daemonize

是否以守護進程的方式啟動Redis下面我們修改redis.conf文件中的port屬性,然後啟動Redis服務,看一下Redis埠是否成功被修改。

下面我們用配置文件中的方式來啟動Redis服務。

redis-server /redis.conf
  • Redis命令行客戶端
  1. 既然我們已經成功的啟動了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