Redis7.0最新系列教程-基礎入門

7small7發表於2023-02-27

大家好,我是二條。一位從事服務端研發的程式猿。

從今天開始,我會不間斷的開始給大家分享Redis7.0版本的知識。

從2022年1月31開始,官方就釋出了 Redis7.0-rc1,至今已經發布到 7.0.5 版本。很多的開發者,還對Redis認識停留在5.x的版本或者6.x的版本,對Redis7.0還缺乏較少的認識。本系列教程,將帶領大家完整的學習Redis7.0相關的知識點。從環境的搭建、10大資料型別、事務、釋出訂閱、主從複製、哨兵、叢集等等知識。本教程最大的特點是,不會單純的總結一些枯燥乏味的理論知識,而是理論知識+基礎時間+場景面試題分析,同時也會分享一些Redis相關技術棧等等內容

今天給大家分享的是Redis相關的基礎認識,以及它適合在什麼場景下使用,如何快速搭建Redis環境。

Redis是什麼

Redis是一款基於記憶體,採用 key => vlaue 方式儲存的高效能記憶體型nosql資料庫。Redis 提供資料結構,例如字串、雜湊、列表、集、帶有範圍查詢的排序集、點陣圖、超日誌日誌、地理空間索引和流。 Redis 具有內建複製、Lua 指令碼、LRU 逐出、事務和不同級別的磁碟永續性,並透過 Redis Sentinel 和 Redis 叢集的自動分割槽提供高可用性。

為什麼會出現Redis這樣一款記憶體型資料庫呢。這就要從Redis的作者antirezs說起。

2008年的時候有一個義大利西西里島的小夥子,筆名antirez,建立了一個訪客資訊網站LLOOGG.COM。有的時候我們需要知道網站的訪問情況,比如訪客的IP、作業系統、瀏覽器、使用的搜尋關鍵詞、所在地區、訪問的網頁地址等等。在國內,有很多網站提供了這個功能,比如CNZZ,百度統計,國外也有谷歌的GoogleAnalytics。我們不用自己寫程式碼去實現這個功能,只需要在全域性的footer 裡面嵌入一段JS 程式碼就行了,當頁面被訪問的時候,就會自動把訪客的資訊傳送到這些網站統計的伺服器,然後我們登入後臺就可以檢視資料了。

LLOOGG.COM 提供的就是這種功能,它可以檢視最多10000 條的最新瀏覽記錄。這樣的話,它需要為每一個網站建立一個列表(List),不同網站的訪問記錄進入到不同的列表。如果列表的長度超過了使用者指定的長度,它需要把最早的記錄刪除(先進先出)。

當LLOOGG.COM 的使用者越來越多的時候,它需要維護的列表數量也越來越多,這種記錄最新的請求和刪除最早的請求的操作也越來越多。LLOOGG.COM 最初使用的資料庫是MySQL,可想而知,因為每一次記錄和刪除都要讀寫磁碟,因為資料量和併發量
太大,在這種情況下無論怎麼去最佳化資料庫都不管用了。

考慮到最終限制資料庫效能的瓶頸在於磁碟,所以antirez 打算放棄磁碟,自己去實現一個具有列表結構的資料庫的原型,把資料放在記憶體而不是磁碟,這樣可以大大地提升列表的push 和pop 的效率。antirez 發現這種思路確實能解決這個問題,所以用C 語言重寫了這個記憶體資料庫,並且加上了持久化的功能,09 年,Redis 橫空出世了。從最開始只支援列表的資料庫,到現在支援多種資料型別,並且提供了一系列的高階特性,Redis 已經成為一個在全世界被廣泛使用的開源專案。

Redis的全稱是 REmote DIctionary Server。其預設的服務埠是 6379。關於Redis的埠號選擇 6379,有這麼一種說法。6379在是手機按鍵上MERZ對應的號碼,而MERZ取自義大利歌女Alessia Merz的名字。Alessia Merz 是一位義大利舞女、女演員。 Redis 作者 Antirez(義大利人) 早年看電視節目,覺得 Merz 在節目中的一些話愚蠢可笑,Antirez 喜歡造“梗”用於平時和朋友們交流,於是造了一個詞 "MERZ",形容愚蠢,與 "stupid" 含義相同。後來 Antirez 重新定義了 "MERZ" ,形容”具有很高的技術價值,包含技藝、耐心和勞動,但仍然保持簡單本質“。到了給 Redis 選擇一個數字作為預設埠號時,Antirez 沒有多想,把 "MERZ" 在手機鍵盤上對應的數字 6379 拿來用了。

如果你想關注更多Redis相關的內容,除了官網地址,還可以透過Redis作者的部落格,GitHub地址。

1、官方地址:https://redis.io/

2、GitHub地址:https://github.com/antirez

3、部落格地址:http://antirez.com/latest/0

Redis使用場景

Redis是基於記憶體操作,具備高可用、高效能等特點,同時也提供了豐富的資料型別。一般可用於如下場景:

1、資料快取。專案早期一般都是將資料儲存到MySQL、oracle等關係型資料庫中,所有的資料讀寫都是基於磁碟操作。隨著業務的不斷擴大,透過傳統的方式進行資料的讀取,系統在讀寫方面都會遇到瓶頸。針對這一情況,將資料存放在記憶體中,所有的讀操作都透過記憶體進行查詢,提高了系統的資料查詢能力。對於資料的讀,在高併發的業務場景下,也可以將資料先寫入記憶體中,在透過非同步的方式持久化到磁碟中,提高了系統的併發能力。

2、儲存使用者登入token。針對使用者登入鑑權,一般可以基於cookie、jwt來實現。cookie是基於檔案儲存,並且cookie會涉及到跨域、分散式架構問題,jwt由於是基於客戶端斷儲存方案,服務端無法直接控制登入token的狀態。由於Redis是具備分散式部署架構,很好的解決了分散式架構token鑑權、使用者登入狀態等問題的控制。同時將登入token存放在Redis中,每次讀取都採用記憶體讀取,也提高了整個系統的效能。

3、秒殺場景。對於秒殺業務場景,對於系統的併發能力都是非常高的。在該場景下,將商品資料儲存到Redis中,提高了系統的查詢能力,減少了MySQL的壓力。將商品庫存都儲存到Redis中,因Redis採用的是單執行緒架構,也可以實現商品超賣問題。

4、使用者簽到。可以使用 bitmap 資料型別,將使用者簽到儲存在Redis中,然後透過非同步執行緒將資料儲存到MySQL中。既節約了記憶體,也提供了系統的讀寫能力。

5、訊息佇列。Redis提供 list 資料型別,技能用來做訊息佇列,也能用來做棧等場景。在 Redis5.0 開始,也提供了一種 stream 資料型別,提高了訊息佇列的可靠性。

6、社交場景。Redis提供了兩種集合資料型別(set sortset),可以用在積分排行、好友推薦等場景。

7、 就近推薦。Redis中是提供了一種 GEO 的資料型別來進行位運算。可以根據使用者當前的經緯度,來計算附近的酒店、商場等場所的搜尋與推薦功能。

8、分散式鎖。當分散式架構中,需要對共享資料的讀寫操作(例如商品秒殺)。為了保證資料的一致性,一般是採用分散式鎖實現,Redis能夠非常簡單的實現分散式鎖功能。可以直接使用 setnx key value + expire time 操作,為了實現原子性操作,也可以直接使用 lua 實現。

Redis有什麼優勢

Redis作為一種記憶體型資料庫,其讀寫效能都是非常高的。這裡將Redis與memcached進行對比。

1、執行緒模型。memcached採用的多執行緒模式,Redis採用的是單執行緒模式,雖然Redis6.0版本之後是支援多執行緒,但這裡的多執行緒也只是對網路IO的處理是多執行緒,實際的資料操作還是單執行緒模式。單執行緒執行(減少上下文切換、鎖競爭等問題)。

2、持久化。對於記憶體型資料庫,所有的資料都是儲存在記憶體中。當服務出現異常,服務當機都會導致資料的丟失,Redis是支援講資料儲存到磁碟中,服務出現異常之後重啟會從磁碟中,將資料重新載入到記憶體中。Redis對於資料的持久化儲存,支援兩種方式。一種是快照方式(RDB),另外一種是日誌方式(ROF)。

3、分散式架構。Redis支援主從複製、哨兵、叢集等高可用、高可靠架構。同時具備學習成本低特點。

4、資料型別。Redis有基本的五大資料型別,還有其他的幾種資料型別;Memcached只有單純的字串型別。

環境安裝

上面對Redis的認識做了一個大致的介紹,下面就正式步入學習的第一步,搭建Redis環境。如果你不想搭建環境,也可以使用官方提供的web 介面的cli工具,不過在使用上也有一定的侷限性。

Redis是支援Linux、Mac和Windows環境,但官網也不推薦在Windows上使用Redis,這樣無法充分的發揮Redis的優勢。在本教程中,所有的操作都是使用Mac環境搭建,Linux環境和Mac環境幾乎都是一樣的,也不過多的去關注這兩者的區別。

在Mac作業系統上有 brew 包管理工具,在Linux上有 yum 或者 ap-get 這樣的包管理工具。由於這種方式非常的簡單,下面就單獨演示原始碼編譯安裝。

透過Redis官方的GitHub地址,下載Redis7.0.0版本。一般軟體的版本都有奇數和偶數之分,我們在選擇版本也會優選的選擇偶數版本,因為偶數版本會相對奇數版本穩定一些。

// 下載
cd ~ && wget https://github.com/redis/redis/archive/7.0.0.tar.gz
// 解壓
tar -zxvf 7.0.0.tar.gz

解壓之後,我們可以檢視一下原始碼中大致有哪些檔案。

[root@VM-16-3-centos redis-7.0.0]# ll
總用量 252
-rw-rw-r--  1 root root  27744 4月  27 2022 00-RELEASENOTES
-rw-rw-r--  1 root root     51 4月  27 2022 BUGS
-rw-rw-r--  1 root root   5026 4月  27 2022 CONDUCT
-rw-rw-r--  1 root root   2634 4月  27 2022 CONTRIBUTING
-rw-rw-r--  1 root root   1487 4月  27 2022 COPYING
drwxrwxr-x  7 root root   4096 4月  27 2022 deps
-rw-rw-r--  1 root root     11 4月  27 2022 INSTALL
-rw-rw-r--  1 root root    151 4月  27 2022 Makefile # 編譯檔案
-rw-rw-r--  1 root root   6888 4月  27 2022 MANIFESTO
-rw-rw-r--  1 root root  22435 4月  27 2022 README.md
-rw-rw-r--  1 root root 106547 4月  27 2022 redis.conf # 預設配置檔案
-rwxrwxr-x  1 root root    279 4月  27 2022 runtest
-rwxrwxr-x  1 root root    283 4月  27 2022 runtest-cluster # 叢集工具
-rwxrwxr-x  1 root root   1578 4月  27 2022 runtest-moduleapi
-rwxrwxr-x  1 root root    285 4月  27 2022 runtest-sentinel
-rw-rw-r--  1 root root   1695 4月  27 2022 SECURITY.md
-rw-rw-r--  1 root root  13924 4月  27 2022 sentinel.conf # 哨兵預設配置檔案
drwxrwxr-x  4 root root   4096 4月  27 2022 src #原始碼檔案
drwxrwxr-x 11 root root   4096 4月  27 2022 tests
-rw-rw-r--  1 root root   3055 4月  27 2022 TLS.md
drwxrwxr-x  8 root root   4096 4月  27 2022 utils

接下來,在原始碼路徑下執行安裝操作。

make && make install

在經過幾分鐘的等待,出現如下的介面,就表示Redis已經被成功的安裝。

Hint: It's a good idea to run 'make test' ;)

INSTALL redis-server
INSTALL redis-benchmark
INSTALL redis-cli

預設情況下,Redis相關的客戶端工具、服務端工具都會被安裝在 /usr/local/bin 目錄下面。

[root@VM-16-3-centos bin]# cd /usr/local/bin
[root@VM-16-3-centos bin]# ll
總用量 27896
-rwxr-xr-x 1 root root      383 12月 10 2019 chardetect
-rwxr-xr-x 1 root root      389 12月 10 2019 cloud-init
-rwxr-xr-x 1 root root     1781 12月 10 2019 cloud-init-per
-rwxr-xr-x 1 root root      399 12月 10 2019 easy_install
-rwxr-xr-x 1 root root      407 12月 10 2019 easy_install-3.6
-rwxr-xr-x 1 root root     1005 12月 10 2019 jsondiff
-rwxr-xr-x 1 root root     3663 12月 10 2019 jsonpatch
-rwxr-xr-x 1 root root     1839 12月 10 2019 jsonpointer
-rwxr-xr-x 1 root root      392 12月 10 2019 jsonschema
-rwxr-xr-x 1 root root  6976488 2月  26 15:48 redis-benchmark
lrwxrwxrwx 1 root root       12 2月  26 15:48 redis-check-aof -> redis-server
lrwxrwxrwx 1 root root       12 2月  26 15:48 redis-check-rdb -> redis-server
-rwxr-xr-x 1 root root  7234616 2月  26 15:48 redis-cli
lrwxrwxrwx 1 root root       12 2月  26 15:48 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 14307984 2月  26 15:48 redis-server

1、redis-server:Redis服務端工具,啟動Redis服務時,需要使用該工具。

2、redis-cli:Redis客戶端工具,使用命令操作Redis時,需要使用該工具。

3、redis-check-rdb:持久化RDB檔案檢測,當RDB檔案存在問題時,可以使用該工具進行檢測與恢復。

4、redis-check-aof:持久化AOF檔案檢測,當AOF檔案存在問題時,可以使用該工具進行檢測與恢復。

5、redis-sentinel:Redis哨兵工具,在使用哨兵模式下,需要使用該工具啟動哨兵。

6、redis-benchmark:Redis壓縮工具,透過該工具可以模擬Redis效能。

安裝成功之後,我們也可以檢視當前的安裝Redis版本。

[root@VM-16-3-centos bin]# redis-server -v
Redis server v=7.0.0 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=34dee89a8e7e24d2

啟動服務

啟動服務時,我們可以指定配置檔案,也可以不指定配置檔案。如果不指定配置,使用 redis-server 時會使用預設的配置檔案。

1、不使用配置檔案啟動。直接使用 redis-server 命令即可,看到如下的介面表示Redis服務已經正常啟動。但這樣也存在一個問題,Redis服務時處於前臺執行的,當我們將該shell視窗關閉後,服務就會被停止。因此推薦使用指定配置檔案的方式。

[root@VM-16-3-centos bin]# redis-server 
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 7.0.0 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 615368
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

615368:M 26 Feb 2023 16:02:04.530 * Ready to accept connections

2、指定配置檔案啟動。在Redis的原始碼目錄中存在一個 redis.conf 檔案。可以直接在該檔案修改,也可以將檔案複製到指定目錄,在對其修改。找到檔案中的 daemonize 配置項,將其值改為 yes

daemonize yes

接下來,在執行 redis-server ./redis.conf ,執行完之後,可能介面沒有任何輸出資訊。我們可以使用 redis-cli 命令進行連線測試。

[root@VM-16-3-centos redis-7.0.0]# redis-cli 
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> 

透過上圖的演示,我們可以看到Redis已經能夠被正常連結,此致Redis的環境安裝、基礎測試和連線就全部完成了。

教程回顧

看完上面的內容,做幾個簡單的測試吧,以便回顧一下知識內容。

1、 Redis是什麼?

2、 專案當中,使用MySQL作為資料庫儲存,為什麼還要使用Redis?

3、 Redis有哪些使用場景?

4、 Redis預設的埠是什麼?

5、 Redis相對memcached而言,有什麼優勢?

相關文章