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

一、摘要

談起 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章