[Redis] Getting Started
TL;DR
# 進入 Redis,預設會是 localhost:6379
$ redis-cli # local redis
# 基本操作
> SET framework react
> GET framework # react
> KEYS * # 取得 redis 中所有的 key
> DEL framework
# 其他操作
> TYPE <key> # 檢視型別
# EXPIRE key seconds # 設定 key 過期的時間(自動刪除)
# TTL key # 檢視 key 剩多久會過期
> SET notification "some people fall down"
> EXPIRE notification 30 # 30 秒後會過期
> TTL notification # 檢視剩餘時間(秒);-1 表示該 key 沒有設定過期時間;-2 表示該 key 曾經存在但已過期或被刪除
# 根據 pattern 刪除多筆資料
> redis-cli --scan --pattern "cache:user:*" | xargs redis-cli unlink
安裝 Redis
brew install redis
# 在 background 中啟動 redis 服務
brew services start redis
# 如果只想在 foreground 使用
redis-server
# 檢查 redis 執行情況
brew services info redis
如果需要 GUI 的話,官方也有提供 Redis Insight 可以下載。
連接到 Redis
- Connect to Redis:連結到 redis 的各種方式 (包括 localhost、remote、Redis Cloud、Docker container 等等)
# 進入 Redis,預設會是 localhost:6379
$ redis-cli # local redis
$ redis-cli -h 192.168.0.10 -p 7000 # remote redis
測試連線:
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
Key
- Redis 當中的 Key 就是 binary safe 的 string,可以是
"foo"
,42
,3.1415
,0xff
- 由於 Key 本身是 binary 的序列,因此大小寫是有區別的(case sensitive),下面這 三組分別都是不同的 Key
registeredusers:1000:followers
registeredUsers:1000:followers
RegisteredUsers:1000:followers
- 太長的 key 是不建議的,必須在「容易閱讀的 Key」和「使用的記憶體容量」間做取捨
- 命名慣例上會用冒號(
:
)做為區隔,例如user:1000:followers
- user: object name
- 1000: user ID
- followers: composed object
Logical Databases
- Logical Database 中並沒有 name space 的概念,也就是所有的 key 都是在水平的同一層內,而沒有以 documents 或 collections 的概念
- Logical Database 會用 zero-based 的 index 來辨別(也就是以 0 開始)。
- 同一 database 中的 key 不能重複;但不同 database 中的 key 可以重複
搜尋 Keys:KEYS and SCAN
如果要取得一系列的 Key 可以使用 KEYS
或 SCAN
這兩個指令:
KEYS
:可以在本地開發時除錯(Debug)用,但千萬不要用在 Production 上。直到全部完成前會阻塞。SCAN
:用在 production 中,雖然它也阻塞,但一次只會迭代(iterate)一定數量的 keys。
使用 KEYS
# 使用 * 表示萬用字元(wild card)
> keys customer:10*
使用 SCAN
COUNT
越大則會一次會搜尋越多的量,但因為是阻塞操作的緣故,對效能影響越大- 當沒有更多的 KEY 要 iterate 時,
cursor
會回傳 0
# SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
> SCAN 0 MATCH customer:10*
1) "15" # cursor 是 15
2) 1) "customer:1000"
2) "customer:1001"
> SCAN 15 MATCH customer:10*
1) "0"
2) (empty array)
移除 Keys:DEL and UNLINK
DEL
會移除掉 KEY 及其相關的記憶體,處理的方式是阻塞的UNLINK
會把 KEY 給移除,而和該 KEY 有關記憶體的清理則是以非同步的方式處理(non-blocking)
> UNLINK customer:1000
(integer) 1
確認 Key 是否存在:EXISTS
> EXISTS customer:1001
(integer) 1
Data Types
Data types @ redis
- Binary-safe Strings:可以儲存任何的字串,不論是 PNG 或序列化過的物件
- Lists:本質上是 linked-list,根據被建立的順序可以進行排序。由於是 linked-list 的緣故,它在新增和刪除元素的速度是快的,但搜尋速度是相對慢的。
- Sets:一系列未排序(unsorted)且唯一(unique)的字串
- Sorted Sets:一系列唯一的字串,但每一個字串都和 float number 連結在一起(稱作
score
),因此可以透過 score 進行排序 - Hashes:類似 map,其 key 和 value 都是字串
- Bit arrays:又稱作 bitmaps,它讓開發者可以把字串作為 array of bits 處理。
- HyperLogLogs:用來測量 set 中 element 的數量
String
keywords: SET
, GET
, SETNX
, SETEX
, INCR
, DECR
, INCRBY
, DECRBY
- Binary-safe String 的意思是可以儲存任何形式的字串,例如 JPEG 檔或序列化過的物件
- String 最大可以到 512MB
# SET key value [EX seconds|PX milliseconds|KEEPTTL] [NX|XX]
> SET phone Note10 EX 10 # 10 秒過期
> SET price 23900
# SETNX key value # SET if Not Exist,如果該 key 不存在才儲存
> SETNX frameworks "react vue angular" # 回傳 1 表示成功,0 表示失敗(該 key 已經存在)
# SETEX key seconds value # 設定過期時間
# 增加或減少數值
> INCR price # 23901,一次增加 1
> DECR price # 23900,一次減少 1
> INCRBY price 1000 # 24900,一次增加 1000
> DECRBY price 1000 # 23900,一次減少 1000