2861 words
14 minutes
Redis 使用教學入門

Redis 使用教學入門#

RedisRemote Dictionary Server 的簡寫,意思為遠端字典Server。 字典Dictionary 即是Key-Value對照表。

Redis存放資料的速度極快,是物理層面上的快,因為Redis對記憶體(Memory)進行操作。

用以下數量級打個比方, 假如磁碟(Disk、Storage) 的讀寫速度是1、容量10000。 那麼… 記憶體(Mem、RAM) 的讀寫速度會是100、容量是100, CPU快取(Cache)的讀寫速度是10000、容量是1。

Redis將資料存放於記憶體中的特點為:讀寫速度比存放於磁碟快、但容量較小,且資料在斷電就揮發(Volatile)不見了(若沒及時寫進磁碟中的話) 若有短時間內大量存取的需求,卻又不想如此頻繁的對硬碟讀寫,這種場合可以使用Redis資料庫暫時存放資料,等一段時間後再一齊寫入硬碟裡。

安裝Redis#

Redis與PostgreSQL同樣是資料庫,分成Server端與Client端,只是存放資料的形式不同。 這篇只教windows跟linux還有docker的安裝方式

Windows 安裝Redis#

Github下載 .msi安裝檔案, 接著下一步、勾選加入PATH環境變數 windows_addToPATH

redis會預設開在6379端口,你也可以改成其他端口 windows_port_Setting

預設會將Redis Server開啟成一項 Windows服務 windows_service

Server端有了,再來啟動一個 powershell 來執行 Client端

Terminal window
$ redis-cli

linux安裝redis#

一般在你的linux發行版所使用的套件管理器直接安裝就好了 安裝好後再用systemctl enable就可以了

  • Ubuntu / Debian
Terminal window
sudo apt update
sudo apt install -y redis-server
sudo systemctl enable --now redis-server
  • Arch Linux / Manjaro
Terminal window
sudo pacman -Syu --noconfirm redis
sudo systemctl enable --now redis
  • Fedora / CentOS / RHEL
Terminal window
sudo dnf install -y redis
sudo systemctl enable --now redis

安裝完用 systemctl status redis* 檢查服務是否「active (running)」

Docker 安裝Redis#

把container命名為redis_test

Terminal window
$ docker run --name redis_test -d -p 6379:6379 redis

執行Client端

Terminal window
$ docker exec -it redis_test /bin/bash
# redis-cli

(要結束Redis的話)

Terminal window
$ docker container rm -f redis_test

使用Redis#

Redis Server端預設使用 6379 port。 成功啟動Redis Server後的畫面。 start_redis

此時對Client端下指令:

Terminal window
PING

會輸出PONG (測試用) 由於redis是Key-Value型的database 所以設定資料的方式如下

Terminal window
> SET test 123 # 設定一個鍵為:test 值為:123
> GET test # 取得test的data

redis_test

Redis 基本指令:查詢#

【Keys 查詢指令】#

如果忘記自己下過哪些變數名稱了? 可利用KEYS指令,透過 pattern(正規表達式) 來查詢。

Terminal window
> KEYS *

Keys指令的時間複雜度為O(n),會佔用Redis單線程、卡到後面讀寫指令, 在程式開發、測試時可以使用,但在大型正式運行的伺服器中千萬別使用KEYS相關指令, 查詢時若大批的資料湧進會造成堵塞、炸裂。建議改用SCAN指令來查詢。

【Scan 查詢指令】#

在當前的Redis資料庫中進行迭代。 一開始先下SCAN 0,之後看他回傳的數值 接著繼續SCAN迭代下去。

Terminal window
> SCAN 0

此時若第一個回傳值為”15”

Terminal window
> SCAN 15

持續步驟直到第一個回傳值為”0”

【Type 查詢類型】#

忘記這個Key對應到的是甚麼物件類型了? 查詢test的類型

Terminal window
> TYPE test

Redis鍵值資料庫中也有分格式,常用到的格式有:

  1. 【字串 String】:可存放數字、字串。
  2. 【哈希 Hash、Hashmap】:可存放 Hashmap 或稱Dictionary(Key-Value對照表)。
  3. 【列表 List】:有順序的列表,可從列表左端或右端操作、新增刪除。
  4. 【集合 Set】:存放唯一且不重複的項目。
  5. 【有序集和 Sorted-Set】:存放唯一不重複項目,透過Score分數來排序,是個極度有趣的格式。

所有的指令在 Redis官網 都有詳細記載。 以下會快速導覽、稍微熟悉一下Redis指令用法。

Redis 基本指令:新增、取得、刪除#

【String 數值、字串】#

雖然是字串,但實際上可以放數字。

【SET 設置】#

設置 test1的值為123

Terminal window
> SET test1 123

設置 test1的值為字串

Terminal window
> SET test1 "Hello Redis"

設定此筆資料10秒後自動過期(Expired)、刪除。

Terminal window
> SET test1 "123" EX 10

【INCR、DECR 遞增減】#

test1加1、test1減1

Terminal window
> INCR test1
> DECR test1

【INCRBY、DECRBY 加減法】#

test1加50、test1減50

Terminal window
> INCRBY test1 50
> DECRBY test1 50

【StrLen 字串長度】#

返回test1字串的長度

Terminal window
> STRLEN test1

【Append】#

透過append在字尾新增字串hello,接著返回字串總長度

Terminal window
> APPEND test "hello"

【GET 取得】#

Terminal window
> GET test1

【List 列表】#

將a塞入list1之中

Terminal window
> LPUSH list1 hello

LPUSH: 往左側(頭)塞入元素a,若無list1則自動建立一個新的 RPUSH: 往右側(尾)塞入元素a,若無list1則自動建立一個新的 LPUSHX:若無list1則塞入失敗,不會自動建立

一次塞多個值進list1

Terminal window
> LPUSH list1 b c d a a a

將list1最左側(頭)的元素POP彈出

Terminal window
> LPOP list1

看 list1 之中 第0到100的元素(含0含100)

Terminal window
> LRANGE list1 0 100

若要查看所有元素可使用:LRANGE list1 0 -1。 Index -1 代表最後一個項目

【Hash、HashMap 哈希表】#

Hash即為 一組Key對應到一組Value HSET 設 hash1表裡面的 h1鍵 值為123

Terminal window
> HSET hash1 h1 123

HMSET 設置hashmap(一次設多個HSET)

Terminal window
> HMSET hash1 h2 234 h3 345 h4 456

取得hash1表中的 h1 的值

Terminal window
> HGET hash1 h1

取得hash1表中全部的鍵值

Terminal window
> HGETALL hash1

在Redis中 不支援巢狀Hash(hash中不能再設hash), 可以用Serialize 或 將兩個Hash Table當成 key:value 對應來達成 或者使用ReJSON(Redis JSON),可方便儲存Json格式

【Set 集合】#

Set 集合裡面的內容,是唯一且不重複的。 譬如學生的 學號

Terminal window
> SADD set1 "S00001"
> SADD set1 "S00002" "S00003" "S00004" "S00005" ...
> SCARD set1
返回集合總數量
> SDIFF set1
返回、列出不同的Set

【Sorted-Set 有序集合】#

Score 分數的集合。 可以想像成:考完期中考的學生,各自都會對應到一個分數。 分數可重複,學生不能重複

S00001 拿到了99分 S00002 拿到了3分 S00003 也拿到了3分

Terminal window
> ZADD exam 99 "S00001"
> ZADD exam 3 "S00002"
> ZADD exam 3 "S00003"

若加上XX的話,只會更新已存在的值,若無鍵 則不會新增。

Terminal window
> ZADD exam XX 100 "Teacher"

改成NX則相反:只新增鍵、不會更新已存在的 查看來考試的學生數量

Terminal window
> ZCARD exam

查看S00001的分數

Terminal window
> ZSCORE exam S00001

有幾個人分數落在0~10分的

Terminal window
> ZCOUNT exam 0 20

印出所有人的 排名(從低分印到高分)

Terminal window
> ZRANGE exam 0 -1

印所有人的 排名與分數(從低分印到高分)

Terminal window
> ZRANGE exam 0 -1 WITHSCORES

S00001的分數+3分

Terminal window
> ZINCRBY exam 3 S00001

總結一些常用指令的表格#

連線、資料庫、一般操作#

指令作用常用參數/選項範例
PING健康檢查PINGPONG
AUTH驗證密碼/ACL 使用者AUTH <pass>AUTH <user> <pass>AUTH default s3cr3t
HELLO切換協定/回傳伺服器資訊HELLO 3HELLO 3
ECHO回顯字串ECHO "hi"
SELECT切換 DB0..15(預設 16 個)SELECT 1
FLUSHDB / FLUSHALL清空單一 DB / 全部 DBASYNCFLUSHDB ASYNC
DBSIZE目前 DB key 數DBSIZE
QUIT關閉連線QUIT

Key 與到期(TTL)#

指令作用常用參數/選項範例
EXISTS key [key ...]key 是否存在EXISTS a b
DEL / UNLINK刪 key(UNLINK 非阻塞)UNLINK big:set
TYPEkey 類型TYPE user:1
EXPIRE / PEXPIRE設 TTL(秒/毫秒)EXPIRE key secEXPIRE a 60
EXPIREAT / PEXPIREAT設到期絕對時間Unix(sec/ms)EXPIREAT a 1755730000
TTL / PTTL剩餘 TTLTTL a
PERSIST取消 TTLPERSIST a
RENAME / RENAMENX改名(避免覆蓋用 RENAMENXRENAMENX a a:old
SCAN遍歷鍵(非阻塞)MATCH <pat>COUNT nSCAN 0 MATCH "user:*" COUNT 100
COPY複製 keyDB nREPLACECOPY a b REPLACE
DUMP / RESTORE序列化 / 還原REPLACETTL msDUMP aRESTORE a2 0 "<blob>"

String(字串/數值)#

指令作用常用參數/選項範例
SET設值EX/PXEXAT/PXATNX/XXKEEPTTLGETSET k v EX 10 NXSET k v GET
GET取值GET k
GETSET / GETDEL取舊值並設新/刪除GETSET k v2GETDEL k
MSET / MGET多鍵設/取MSET a 1 b 2MGET a b
INCR / DECR整數 +1/-1INCR counter
INCRBY / DECRBY整數加減INCRBY score 50
INCRBYFLOAT浮點加法INCRBYFLOAT price 0.5
APPEND追加字尾APPEND note " world"
STRLEN長度STRLEN note
SETRANGE / GETRANGE局部覆寫/讀片段SETRANGE k 5 "abc"GETRANGE k 0 4
GETEX取值同時改 TTLEX/PX/PERSISTGETEX k EX 60

List(列表)#

指令作用常用參數/選項範例
LPUSH / RPUSH左/右推入可多值LPUSH list a b c
LPUSHX / RPUSHX只有存在才推LPUSHX list x
LPOP / RPOP左/右彈出COUNT n(新)LPOP listRPOP list COUNT 2
BLPOP / BRPOP阻塞彈出timeoutBLPOP q 5
LLEN長度LLEN list
LINDEX取索引LINDEX list 0
LSET設索引值LSET list 1 x
LRANGE範圍取出0 -1 取全LRANGE list 0 -1
LREM刪除匹配項countLREM list 0 "a"(全刪)
LMOVE左/右移到另一 ListLMOVE src dst LEFT RIGHTLMOVE q work LEFT RIGHT
LPOS找到第一個匹配索引RANKMAXLENLPOS list "x"

Hash(哈希表)#

指令作用常用參數/選項範例
HSET設欄位可多對HSET user:1 name neko age 18
HGET取欄位HGET user:1 name
HMGET取多欄位HMGET user:1 name age
HGETALL取全部欄位HGETALL user:1
HDEL刪欄位可多欄位HDEL user:1 age
HEXISTS欄位是否存在HEXISTS user:1 name
HINCRBY / HINCRBYFLOAT欄位加法HINCRBY user:1 coins 5
HKEYS / HVALS列鍵/值HKEYS user:1
HLEN欄位數HLEN user:1
HRANDFIELD隨機欄位(可回值)WITHVALUESCOUNTHRANDFIELD user:1 2 WITHVALUES

Set(集合)#

指令作用常用參數/選項範例
SADD / SREM加/刪成員可多值SADD s a b c
SMEMBERS列全部成員(大集合請用 SSCANSMEMBERS s
SISMEMBER / SMISMEMBER是否為成員 / 多查SISMEMBER s aSMISMEMBER s a b
SCARD集合大小SCARD s
SPOP隨機彈出COUNTSPOP s 2
SRANDMEMBER隨機取COUNTSRANDMEMBER s 3
SINTER/SUNION/SDIFF交並差…STORE destSINTER s1 s2SINTERSTORE d s1 s2
SSCAN遍歷集合MATCHCOUNTSSCAN s 0 MATCH "u:*"

Sorted Set(有序集合,ZSet)#

指令作用常用參數/選項範例
ZADD新增/更新分數NX/XXCHINCRZADD exam 99 "S00001"ZADD exam INCR 3 "S00001"
ZREM刪成員可多值ZREM exam S00002
ZSCORE / ZMSCORE取分數 / 多取ZSCORE exam S00001
ZCARD / ZCOUNT數量 / 分數區間數ZCOUNT exam 0 60
ZRANK / ZREVRANK排名(低→高 / 反向)ZRANK exam S00001
ZRANGE / ZREVRANGE取名次區間WITHSCORESBYSCOREBYLEXREVLIMITZRANGE exam 0 -1 WITHSCORESZRANGE exam 0 100 BYSCORE
ZRANGEBYSCORE依分數區間WITHSCORESLIMITZRANGEBYSCORE exam 80 +inf WITHSCORES
ZPOPMIN / ZPOPMAX彈出最小/最大COUNTZPOPMAX exam 3
ZINTER / ZUNION / ZDIFF交並差…STORE destWEIGHTSAGGREGATEZUNIONSTORE board 2 a b WEIGHTS 1 0.5
ZRANGESTORE把 range 結果存到新 ZSetZRANGESTORE top exam 0 9

Pub/Sub(訂閱發布)#

指令作用常用參數/選項範例
SUBSCRIBE / PSUBSCRIBE訂閱頻道 / PatternSUBSCRIBE newsPSUBSCRIBE news.*
PUBLISH發布訊息PUBLISH news "hello"
PUBSUB查詢統計CHANNELSNUMSUBPUBSUB CHANNELS "news*"

Stream(事件流,類 Kafka 小型替代)#

指令作用常用參數/選項範例
XADD加入事件* 自動 ID、MAXLEN ~ nXADD mystream * user neko msg hi
XRANGE / XREVRANGE讀取區間- + 全部XRANGE mystream - +
XREAD從 ID 之後讀BLOCK msXREAD BLOCK 0 STREAMS mystream $
XGROUP CREATE建消費群組MKSTREAMXGROUP CREATE mystream g1 $ MKSTREAM
XREADGROUP群組讀取GROUP g1 c1COUNTBLOCKXREADGROUP GROUP g1 c1 STREAMS mystream >
XACK確認已處理XACK mystream g1 1690-0
XPENDING查看掛起RANGECOUNTXPENDING mystream g1
XDEL / XTRIM刪事件 / 修剪流長MAXLEN/MINID~XTRIM mystream MAXLEN ~ 10000

Bitmap / HyperLogLog / Geo#

類型指令作用範例
BitmapSETBIT/GETBITBITCOUNTBITOPBITFIELD位圖標記與統計SETBIT uv 123 1BITCOUNT uv
HyperLogLogPFADDPFCOUNTPFMERGE近似去重計數PFADD hll a b cPFCOUNT hll
GeoGEOADDGEOPOSGEODISTGEOHASHGEOSEARCH/GEOSEARCHSTORE地理座標與範圍查詢GEOADD geo:shop 121.5 25.0 "store:1"GEOSEARCH geo:shop FROMLONLAT 121.5 25.0 BYRADIUS 5 km

交易 / 標記監控 / Lua#

指令作用常用參數/選項範例
MULTI → … → EXEC交易MULTIINCR aINCR bEXEC
DISCARD放棄交易DISCARD
WATCH / UNWATCH標記 key,樂觀鎖WATCH order:1MULTI … EXEC
EVAL / EVALSHA執行 Lua 腳本numkeys ... argsEVAL "return redis.call('INCR', KEYS[1])" 1 k

監控、設定、持久化、複寫與叢集#

指令作用常用參數/選項範例
INFO伺服器狀態INFO memory 等章節INFO memory
MONITOR即時監控指令流MONITOR
SLOWLOG慢查詢GETLENRESETSLOWLOG GET 10
CONFIG GET/SET讀改設定CONFIG GET maxmemory
CONFIG REWRITE將動態修改寫回檔CONFIG REWRITE
SAVE / BGSAVE立刻/背景快照BGSAVE
BGREWRITEAOF重寫 AOFBGREWRITEAOF
MEMORY USAGE/STATS記憶體觀測MEMORY USAGE key
CLIENT LIST/PAUSE/ID/KILL連線管理CLIENT LIST
ACL 系列權限控制SETUSER/DELUSER/WHOAMIACL WHOAMI
REPLICAOF(舊 SLAVEOF設為從屬/主庫REPLICAOF host portREPLICAOF NO ONEREPLICAOF 10.0.0.2 6379
ROLE角色資訊ROLE
CLUSTER叢集管理NODES/MEET/ADDSLOTSCLUSTER NODES
Redis 使用教學入門
https://blog.nekocat.cc/posts/redis/
Author
Nekocat
Published at
2025-08-21
License
CC BY-NC-SA 4.0