[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