Redis CLI
Redis 命令列介面(CLI)常用指令參考。
基本操作
連線伺服器
redis-cli -h [host] -p [port]服務管理
sudo service redis-server [status | start | stop]版本查詢
redis-server -vTTL(存活時間)
ttl [key]資料管理
KEYS
- 阻塞直到完成
- 禁止在生產環境使用
- 僅用於除錯
SCAN
- 使用 cursor 迭代
- 回傳 slot reference
- 每次呼叫可能回傳 0 或多個 keys
- 適合生產環境
FLUSHDB / FLUSHALL
刪除當前資料庫的所有 keys:
flushdb刪除所有資料庫的所有 keys:
flushallINCRBY
SET mykey "10"
INCRBY mykey 5
GET mykey
# 15資料結構
Hash
時間複雜度:
- O(1):
HGET,HSET,HINCRBY,HDEL - O(n):
HGETALL
HSET user:123 username martina firstName Martina lastName Elisa country GB
HGET user:123 username
HGETALL user:123遊戲角色範例:
HSET player:42 name Artexious race Elf level 4 hp 20 gold 20
HGETALL player:42
HSET player:42 status dazed
HDEL player:42 status
HINCRBY player:42 gold 120List
取得所有元素:
LRANGE media_server_list 0 -1String
設定帶過期時間的值:
SET ticket:27 "{'username': 'priya', 'ticket_id': 321}" EX 100模組管理
列出已載入模組:
MODULE LIST查看模組資訊:
INFO MODULES交易(Transactions)
關於資料庫交易的理論基礎,請參考 Transaction Issues
| 指令 | 說明 |
|---|---|
MULTI | 開始交易 |
EXEC | 執行所有已排隊的指令 |
DISCARD | 取消交易 |
WATCH | 監視 key,若被修改則交易失敗 |
RedisJSON
RedisJSON 模組讓 Redis 原生支援 JSON 文件的儲存與操作。
基本操作
| 目標 | 說明 |
|---|---|
| 插入 JSON | JSON.SET |
| 取得 JSON | JSON.GET |
| 修改 JSON | JSON.SET(指定路徑) |
範例:Food Truck 資料
JSON.SET vendor:96 $ '{"name": "Tacos Mi Ranchos", "phone": 557891234, "accepts_online_orders": false, "currently_open": true, "menu": [{"name": "burrito", "price": 11.5}, {"name": "taco", "price": 3.5}, {"name": "quesadilla", "price": 6.0}]}'更新巢狀屬性
JSON.SET vendor:96 $.location '{"address": "1434 1st Ave, Oakland, CA 94606", "coordinates": [37.7989708, -122.2565053]}'取得資料
# 取得完整文件
JSON.GET vendor:96
# 取得 menu 陣列
JSON.GET vendor:96 $.menu
# 取得第一個品項的價格
JSON.GET vendor:96 $.menu[0].price陣列操作
新增元素到陣列:
JSON.ARRAPPEND vendor:96 $.menu '{"name": "Torta", "price": 4.5}'移除陣列元素:
JSON.ARRPOP vendor:96 $.menu 0數值操作
JSON.NUMINCRBY vendor:96 $.wait-time 10Redis Stack Server
使用 RedisJSON 建立關聯資料模型:
classDiagram
direction LR
class vendor{
-name
-cuisines
-primary_cuisine
-address
}
class event{
-assigned_vendors
-start_time
-end_time
-location_id
}
class location{
- address
}
class address{
-coordinates
}
class coordinates{
-longitude
-latitude
}
vendor <--> event
vendor <--> location
資料結構範例
{
"banner_url": "https://media-cdn.truckfinder.com/.../photo0jpg.jpg",
"cuisines": ["Mexican"],
"events": [],
"id": "0013i00001w89pHAZQ",
"logo_url": "https://s3-media0.f1.truckfinder.com/.../o.jpg",
"name": "Tacos Mi Rancho",
"primary_cuisine": "",
"vendor_info": {
"address": "1434 1st Ave",
"city": "Oakland",
"state": "CA"
}
}{
"id": "0016e00002o8jJGAAY",
"about": "Food trucks that provides a variety of cuisines...",
"image_url": "https://truckfinder.s3.amazonaws.com/locations/...",
"info": {
"address": "SFO Terminal 1",
"city": "San Francisco",
"coordinates": "-122.3943, 37.6227",
"region": "San Francisco",
"state": "CA",
"zipcode": "94128"
},
"location_type": "Public Market",
"name": "Off The Grid: SFO Food Spot"
}{
"assigned_vendors": 8,
"id": "a1M6e000006oioXEAQ",
"location_id": "",
"location_name": "Off The Grid: SFO Food Spot",
"name": "SFO",
"start_time": "2022-07-14T20:30:00-07:00",
"end_time": "2022-07-14T14:00:00-07:00"
}JSON.SET 範例
Vendor:
JSON.SET truck:42 $ '{"banner_url": "https://...", "cuisines": ["Mexican"], "events": [], "id": "0013i00001w89pHAZQ", "logo_url": "https://...", "name": "Tacos Mi Rancho", "primary_cuisine": "", "vendor_info": {"address": "1434 1st Ave", "city": "Oakland", "state": "CA"}}'Location:
JSON.SET location:23 $ '{"id": "0016e00002o8jJGAAY", "about": "Food trucks...", "image_url": "https://...", "info": {"address": "SFO Terminal 1", "city": "San Francisco", "coordinates": "-122.3943, 37.6227", "region": "San Francisco", "state": "CA", "zipcode": "94128"}, "location_type": "Public Market", "name": "Off The Grid: SFO Food Spot"}'Event:
JSON.SET event:11 $ '{"assigned_vendors": 8, "id": "a1M6e000006oioXEAQ", "location_id": "", "location_name": "Off The Grid: SFO Food Spot", "name": "SFO", "start_time": "2022-07-14T20:30:00-07:00", "end_time": "2022-07-14T14:00:00-07:00"}'關聯資料
將 event 加入 vendor 的 events 陣列:
JSON.ARRAPPEND truck:42 $.events '"a1M6e000006oioXEAQ"'設定 event 的 location_id:
JSON.SET event:11 $.location_id '"0016e00002o8jJGAAY"'RedisSearch
RedisSearch 模組提供全文搜尋與二級索引功能。
建立索引
FT.CREATE idx:truck
ON JSON
PREFIX 1 "truck:"
SCHEMA
$.name AS name TEXT SORTABLE
$.cuisines[*] AS cuisines TAG搜尋
依名稱搜尋:
FT.SEARCH idx:truck @name:Tacos
FT.SEARCH idx:truck '@name:Tacos Mi'依 Tag 搜尋:
FT.SEARCH idx:truck '@cuisines:{Mexican}'Event 索引範例
建立索引:
FT.CREATE idx:event
ON JSON
PREFIX 1 "event:"
SCHEMA
$.assigned_vendors AS assigned_vendors NUMERIC SORTABLE
$.name AS name TEXT SORTABLE
$.location_name AS location TEXT數值範圍搜尋:
FT.SEARCH idx:event '@assigned_vendors:[5 inf]'