【基礎篇】一文帶你掌握 Redis

程式設計師志哥發表於2022-12-26

一、摘要

談起 Redis,相信大家都不會陌生,做過雲平臺開發的程式設計師多多少少會接觸到它,Redis 英文全稱:Remote Dictionary Server,也被稱之為遠端字典服務。

從官方的定義看,Redis 是一款開源的,遵守 BSD 協議,使用 C 語言開發的 key-value 儲存系統。簡單的說,它是一款跨平臺的非關係型資料庫,支援優先記憶體儲存,並提供多種語言的 API 客戶端

Redis 由一個叫 Salvatore Sanfilippo 的人開發而聞名世界,此人來自義大利的西西里島,網名叫 antirez,如果你有興趣,可以去他的部落格逛逛,地址是 antirez.com

不過從 2010 年起,Redis 的開發工作由 VMware 主持,到了 2013 年後,Redis 的開發由 Pivotal 贊助。

Redis 是當下網際網路技術中使用最為廣泛的快取中介軟體之一,隨著它在新浪微博中的使用而逐漸風靡國內。

雖然開源軟體市場上也有很多優秀的快取服務中介軟體,比如 memcache,但是和 redis 對比起來,redis 還是顯得格外的突出,優勢如下:

  • 效能極高:Redis 能讀的速度是 110000 次/s,寫的速度是 81000次/s
  • 資料型別豐富:支援 String,Hash,List,Set,Sorted Set 等資料型別的操作
  • 支援原子性操作:Redis 的每條命令操作都是原子性的,Redis 的操作之所以是原子性的,是因為每條命令的執行都是單執行緒的,不存線上程競爭問題
  • 儲存方式多樣化:memecache 把資料全部存在記憶體之中,斷電後會掛掉;redis 支援資料的持久化,同時也支援資料的備份,即 master-slave 模式的資料備份
  • 功能豐富:Redis 還支援 publish/subscribe,通知,key 過期等等特性

在分散式的架構環境下,Redis 基本上是缺一不可的快取中介軟體,它能很好的解決服務與服務之間資料共享的問題,並且效能不受影響。

說了這麼多,如何使用呢?我們一起來看看!

二、服務安裝

2.1、Windows 環境

因為 redis 目前官方只支援 LINUX 系統,因此沒有 Windows 版本的軟體包,但是好在微軟團隊維護了開源的 windows 版本,雖然更新不算及時,但是對於普通測試使用足夠了。

2.1.1、伺服器安裝

如果當前作業系統是 Windows 系統,訪問如下的地址,獲取對應的下載連結。

https://github.com/tporadowski/redis/releases

根據系統平臺的實際情況選擇,這裡我們下載Redis-x64-xxx.zip壓縮包到 C 盤,解壓後,將資料夾重新命名為redis

開啟資料夾,內容如下:

然後,開啟一個 cmd 視窗,使用 cd 命令切換目錄到C:\redis,並且輸入如下命令:

redis-server.exe redis.windows.conf

出現以上介面,表示redis伺服器已經成功啟動了

2.1.2、客戶端測試

如果想用安裝包裡面的客戶端指令碼測試一下服務,可以這樣操作。

另啟一個 cmd 視窗,原來的視窗不要關閉,不然就無法訪問服務端了。

使用 cd 命令切換目錄到C:\redis,並且輸入如下命令:

redis-cli.exe -h 127.0.0.1 -p 6379

連線到伺服器之後,輸入寫命令和取命令,相關命令如下:

#寫資料測試
set myKey abc

#取資料測試
get myKey

2.2、Linux 環境

如果當前作業系統是 Linux 系統,訪問如下的官方地址,獲取最新的下載連結。

http://redis.io/download
2.2.1、伺服器安裝

本教程使用的最新文件版本為 6.2.6,下載並安裝:

# wget https://download.redis.io/releases/redis-6.2.6.tar.gz
# tar xzf redis-6.2.6.tar.gz
# cd redis-6.2.6
# make

執行完make命令後,redis-6.2.6目錄下會出現編譯後的 redis 服務程式 redis-server,還有用於測試的客戶端程式 redis-cli,兩個程式位於安裝目錄 src 目錄下。

執行下面的指令碼,啟動 redis 伺服器。

# cd src
# ./redis-server

需要注意的地方是,這種方式啟動 redis 使用的是預設配置,也可以透過引數告訴 redis 使用指定配置檔案來啟動服務,其中redis.conf是一個預設的配置檔案,我們可以根據需要使用自己的自定義配置檔案。

# cd src
# ./redis-server ../redis.conf

當出現Ready to accept connections時,表示服務已經啟動成功。

2.2.2、客戶端測試

同樣的,如果想用安裝包裡面的客戶端指令碼測試一下服務,新建立一個命令視窗,這樣操作。

# cd src
# ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

2.2.3、引數配置

可能有的同學會發出一個疑問,如何將 Redis 改成後臺服務

也就是將窗體關閉也能正常提供服務,答案就藏在redis.conf這個配置檔案裡。

開啟redis.conf檔案,常用配置如下:

#繫結ip
bind 0.0.0.0

#啟動埠
port 6379

# 是否執行遠端訪問
protected-mode yes

# 是否允許後臺執行,預設no,將其改成yes
daemonize yes

# redis訪問密碼,根據需要設定,如果要開啟,將#去掉
# requirepass foobared

# 資料庫的數量
databases 16

修改配置,然後重啟服務即可生效,操作如下:

# 尋找redis相關程式
ps -ef|grep redis

# 殺掉程式
kill -9 <pid>

# 重新啟動redis
./redis-server ../redis.conf
2.2.3、配置詳解

redis.conf詳細配置項說明如下:

配置引數 說明
bind 127.0.0.1 如果是內網可以直接繫結 127.0.0.1, 或者忽略, 0.0.0.0是外網
port 6379 指定 Redis 監聽埠,預設埠為 6379
protected-mode yes 是否執行遠端訪問,預設是yes
daemonize no Redis 預設不是以守護程式的方式執行,可以透過該配置項修改,使用 yes 啟用守護程式
databases 16 設定資料庫的數量,預設資料庫為0,可以使用SELECT 命令在連線上指定資料庫id
requirepass foobared 設定 Redis 連線密碼,如果配置了連線密碼,客戶端在連線 Redis 時需要透過 AUTH password 命令提供密碼,預設關閉
timeout 300 當客戶端閒置多長秒後關閉連線,如果指定為 0 ,表示關閉該功能
maxclients 128 設定同一時間最大客戶端連線數,預設無限制,Redis 可以同時開啟的客戶端連線數為 Redis 程式可以開啟的最大檔案描述符數,如果設定 maxclients 0,表示不作限制。當客戶端連線數到達限制時,Redis 會關閉新的連線並向客戶端返回 max number of clients reached 錯誤資訊
maxmemory <bytes> 指定 Redis 最大記憶體限制,Redis 在啟動時會把資料載入到記憶體中,達到最大記憶體後,Redis 會先嚐試清除已到期或即將到期的 Key,當此方法處理 後,仍然到達最大記憶體設定,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis 新的 vm 機制,會把 Key 存放記憶體,Value 會存放在 swap 區
pidfile /var/run/redis.pid 當 Redis 以守護程式方式執行時,Redis 預設會把 pid 寫入 /var/run/redis.pid 檔案,可以透過 pidfile 指定
loglevel notice 指定日誌記錄級別,Redis 總共支援四個級別:debug、verbose、notice、warning,預設為 notice
logfile stdout 日誌記錄方式,預設為標準輸出,如果配置 Redis 為守護程式方式執行,而這裡又配置為日誌記錄方式為標準輸出,則日誌將會傳送給 /dev/null
save <seconds> <changes> 指定在多長時間內,有多少次更新操作,就將資料同步到資料檔案,可以多個條件配合,比如save 900 1,表示 900 秒內有 1 個更改
rdbcompression yes 指定儲存至本地資料庫時是否壓縮資料,預設為 yes,Redis 採用 LZF 壓縮,如果為了節省 CPU 時間,可以關閉該選項,但會導致資料庫檔案變的巨大
dbfilename dump.rdb 指定本地資料庫檔名,預設值為 dump.rdb
dir ./ 指定本地資料庫存放目錄
slaveof <masterip> <masterport> 設定當本機為 slave 服務時,設定 master 服務的 IP 地址及埠,在 Redis 啟動時,它會自動從 master 進行資料同步
masterauth <master-password> 當 master 服務設定了密碼保護時,slave 服務連線 master 的密碼
appendonly no 指定是否在每次更新操作後進行日誌記錄,Redis 在預設情況下是非同步的把資料寫入磁碟,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為 redis 本身同步資料檔案是按上面 save 條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設為 no
appendfilename appendonly.aof 指定更新日誌檔名,預設為 appendonly.aof
appendfsync everysec 指定更新日誌條件,共有 3 個可選值:no:表示等作業系統進行資料快取同步到磁碟(快);always:表示每次更新操作後手動呼叫 fsync() 將資料寫到磁碟(慢,安全);everysec:表示每秒同步一次(折中,預設值)
vm-enabled no 指定是否啟用虛擬記憶體機制,預設值為 no,簡單的介紹一下,VM 機制將資料分頁存放,由 Redis 將訪問量較少的頁即冷資料 swap 到磁碟上,訪問多的頁面由磁碟自動換出到記憶體中
vm-swap-file /tmp/redis.swap 虛擬記憶體檔案路徑,預設值為 /tmp/redis.swap,不可多個 Redis 例項共享
vm-max-memory 0 將所有大於 vm-max-memory 的資料存入虛擬記憶體,無論 vm-max-memory 設定多小,所有索引資料都是記憶體儲存的(Redis 的索引資料 就是 keys),也就是說,當 vm-max-memory 設定為 0 的時候,其實是所有 value 都存在於磁碟。預設值為 0
vm-page-size 32 Redis swap 檔案分成了很多的 page,一個物件可以儲存在多個 page 上面,但一個 page 上不能被多個物件共享,vm-page-size 是要根據儲存的 資料大小來設定的,作者建議如果儲存很多小物件,page 大小最好設定為 32 或者 64bytes;如果儲存很大大物件,則可以使用更大的 page,如果不確定,就使用預設值
vm-pages 134217728 設定 swap 檔案中的 page 數量,由於頁表(一種表示頁面空閒或使用的 bitmap)是在放在記憶體中的,,在磁碟上每 8 個 pages 將消耗 1byte 的記憶體
vm-max-threads 4 設定訪問swap檔案的執行緒數,最好不要超過機器的核數,如果設定為0,那麼所有對swap檔案的操作都是序列的,可能會造成比較長時間的延遲。預設值為4
glueoutputbuf yes 設定在向客戶端應答時,是否把較小的包合併為一個包傳送,預設為開啟
activerehashing yes 指定是否啟用重置雜湊,預設為開啟(後面在介紹 Redis 的雜湊演算法時具體介紹)
include /path/to/local.conf 指定包含其它的配置檔案,可以在同一主機上多個Redis例項之間使用同一份配置檔案,而同時各個例項又擁有自己的特定配置檔案

2.3、Mac 環境

如果當前作業系統是 Mac 系統,同樣的訪問官方地址http://redis.io/download,下載最新的安裝包。

然後本地解壓,後續的操作跟linux一樣,在此就不過多的介紹了!

三、命令列客戶端

如果想要在 redis 服務上執行命令,需要一個 redis 客戶端,而 Redis 客戶端在我們下載的的 redis 的安裝包裡面,其實已經有了。

3.1、連線 redis

Redis 客戶端的基本語法為

$ ./redis-cli

比如,連線本地的 redis 伺服器(前提是已經啟動成功)。

$ ./redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING

PONG

如果 redis 設定了密碼,透過AUTH命令輸入密碼即可進入,方式如下:

$ ./redis-cli
redis 127.0.0.1:6379> AUTH "password"
redis 127.0.0.1:6379> PING

PONG

如果我們想連線遠端 redis 伺服器,可以透過如下語法方式實現。

$ ./redis-cli -h host -p port -a password

比如連線192.168.121.1,命令如下:

$redis-cli -h 192.168.121.1 -p 6379 -a "mypass"
redis 192.168.121.1:6379>
redis 192.168.121.1:6379> PING

PONG

預設連線的資料庫是0,如果我們想切換資料庫,可以透過如下方式實現切換!

# 使用 1 號資料庫
redis 192.168.121.1:6379>SELECT 1

如果想要關閉當前連線,透過如下方式即可實現!

redis 192.168.121.1:6379>QUIT

3.2、常用的 crud 操作

以字串為例,增刪改查操作如下!

1、設定指定 key 的值, SET 在設定操作成功完成時,返回 OK。

redis 127.0.0.1:6379>SET mykey redis
OK

2、查詢指定 key 的值,操作完成時,如果 key 不存在時,返回 (nil)

redis 127.0.0.1:6379>GET mykey
"redis"

3、檢查指定 key 的值是否存在,操作完成時,若 key 存在返回 1 ,否則返回 0

redis 127.0.0.1:6379>EXISTS  mykey
(integer) 1

4、刪除指定 key 的值,操作完成時,返回被刪除 key 的數量。

redis 127.0.0.1:6379>DEL mykey
(integer) 1

5、設定 key 的過期時間,以為單位,操作完成時,若成功返回 1 ,否則返回 0。

# 設定 mykey,60秒過期
redis 127.0.0.1:6379>EXPIRE mykey 60
(integer) 1

6、獲取 key 的剩餘過期時間,以為單位,操作完成時,當 key 不存在時,返回 -2;當 key 存在但沒有設定剩餘生存時間時,返回 -1;否則,以秒為單位,返回 key 的剩餘生存時間。

redis 127.0.0.1:6379>TTL mykey
(integer) 60

7、透過 Incr 命令,實現指定的 key 原子性自增操作,每執行一次 Incr 命令,key 中儲存的數字值增一,操作完成時,如果 key 不存在,那麼 key 的值會先被初始化為 0,然後加 1,返回最後的結果。

redis 127.0.0.1:6379>INCR mykey
(integer) 1

當然,也可以在設定階段,指定某個初始值數字,比如將mykey的自增初始值設定為10

redis 127.0.0.1:6379>INCR mykey 10
(integer) 11

3.3、事務操作

Redis 也支援事務操作,Redis 事務可以一次執行多個命令, 並且帶有以下三個重要的保證:

  • 1.批次操作在傳送 EXEC 命令前被放入佇列快取
  • 2.收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行
  • 3.在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中

一個事務從開始到執行會經歷以下三個階段:

  • 1.開始事務
  • 2.命令入隊
  • 3.執行事務

以某個事務操作為例, 我們先以 MULTI 開始一個事務, 然後將多個命令入隊到事務中, 最後由 EXEC 命令觸發事務, 一併執行事務中的所有命令,過程如下:

redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set a aaa
QUEUED
redis 127.0.0.1:6379> set b bbb
QUEUED
redis 127.0.0.1:6379> set c ccc
QUEUED
redis 127.0.0.1:6379> exec
1) OK
2) OK
3) OK

特別注意的地方是:單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增加任何維持原子性的機制,所以 Redis 事務的執行並不是原子性的。

事務可以理解為一個打包的批次執行指令碼,但批次指令並非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成後續的指令不做。

也就是說,如果在set b bbb處失敗,set a aaa已成功不會回滾,set c ccc還會繼續執行,當set b bbb處執行失敗,這個事務是不會回滾的。

但是如果執行過程中,命令不存在或者是命令引數不對,這個時候 redis 的事務執行會失敗,並返回錯誤資訊給客戶端;如果是命令邏輯上的執行失敗,redis 的事務無法感知,會繼續執行下去。

3.4、Lua 指令碼操作

在上面我們也介紹到了,Redis 事務的執行並不能完全保證原子性,那麼如何將一批命令操作做到原子性操作呢

Redis 支援透過 Lua 指令碼來實現一批命令原子性操作,執行指令碼的常用命令為 EVAL。

Eval 命令的基本語法如下:

redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]

比如簡單的賦值操作如下:

redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

1) "key1"
2) "key2"
3) "first"
4) "second"

比如我們給指定的key設定指定值value,並且設定過期時間60秒,實現原子性操作,如果操作成功就返回 1,否則返回 0,內容如下:

redis 127.0.0.1:6379>EVAL "if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then return redis.call('expire', KEYS[1], ARGV[2]) else return 0 end" 1 key1 hello 60

(integer) 1

獲取指定key的值,如果存在就刪除key,實現原子性操作,如果操作成功就返回 1,否則返回 0,內容如下:

redis 127.0.0.1:6379>EVAL "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end" 1 key1 hello

(integer) 1

以上就是實現常用的分散式加鎖、解鎖原子性操作的 lua 指令碼。

四、視覺化客戶端

對於開發者來說,使用客戶端命令來操作 redis 非常不便捷,因此誕生了很多的基於 redis 的視覺化客戶端,今天我們就一起來看看有哪些免費又好用的客戶端工具。

4.1、Redis Desktop Manager

Redis Desktop Manager 應該是現在使用率最廣的視覺化工具了,存在時間很久,經過了數次迭代,基於 Qt 5 開發,支援跨平臺支援。

以前是免費的,不過現在改成收費工具,試用期可以有半個月的時間,最新版的訪問地址如下!

https://github.com/uglide/RedisDesktopManager/releases

測評:介面看著比較簡潔,該有的功能都有,功能很全,key 的顯示可以支援按冒號分割的鍵名空間。

免費版本的下載地址如下

百度網盤:https://pan.baidu.com/s/1rMWR-OQnfsxJ3_HSqEE8xw

提取碼:tebu

4.2、medis2

medis2 是 mac 系統中使用率最高的 redis 視覺化工具,佈局簡潔,介面美觀,關鍵還免費,最新版的訪問地址如下!

https://getmedis.com/

測評:軟體顏值挺高,功能符合日常使用要求,對 key 有顏色鮮明的圖示標識,在key的搜尋上挺方便的,可以模糊搜尋出匹配的 key,漸進式的 scan,無明顯示卡頓,在搜尋的體驗上還是比較出色的,不過對作業系統要求很高,要求 MacOS 11.0 以上才能安裝,如果當前你的作業系統低於以上,只有升級或者換別的軟體!

4.3、AnotherRedisDesktopManager

AnotherRedisDesktopManager 是一款比較穩定簡潔的 redis UI工具,國人開發,支援跨平臺,完全免費,最新版的訪問地址如下!

https://github.com/qishibo/AnotherRedisDesktopManager

測評:基本的功能都有,有監控統計,支援暗黑主題,還支援叢集的新增,是一款非常不錯的視覺化客戶端。

4.4、Redis Insight

Redis Insight 是目前官方推薦的一款 redis 視覺化工具,功能非常豐富,支援跨平臺,完全免費,最新版的訪問地址如下!

https://redis.com/redis-enterprise/redis-insight/

測評:相比於其他視覺化工具,RedisInsight 實現的功能更強大、執行效率更改,通用性更好,出了 CRUD 基本功能的支援,還支援記憶體分析、指標監控、釋出/訂閱、慢命令日誌查詢等等。

五、小結

本文主要圍繞redis的一些基本知識,做了一次簡單的總結,包括軟體安裝、基本命令操作、視覺化客戶端介紹。

內容難免有些遺漏和不足,歡迎網友留言指出!

六、文末福利

最近 IntelliJ IDEA 又推出了新款版本,出於好奇,小編提前嚐鮮了一把,相比舊款,新款效能確實非常硬核,增加許多新功能,以下是小編啟用的截圖。

為了防止被和諧,需要的小夥伴,可以掃描下方公眾號二維碼,或者關注公眾號:Java極客技術,回覆關鍵字:cccc啟用碼,即可獲取最新破解教程~

申明:本教程 IntelliJ IDEA 破解補丁、啟用碼均收集於網路,請勿商用,僅供個人學習使用,如有侵權,請聯絡作者刪除。若條件允許,希望大家購買正版 !

七、參考

1、菜鳥教程 - redis教程

2、redis - 中午手冊

3、在Linux上安裝redis6.2

相關文章