一、摘要
談起 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 破解補丁、啟用碼均收集於網路,請勿商用,僅供個人學習使用,如有侵權,請聯絡作者刪除。若條件允許,希望大家購買正版 !