Redis CLI

Redis 命令列介面(CLI)常用指令參考。

基本操作

連線伺服器

redis-cli -h [host] -p [port]

服務管理

sudo service redis-server [status | start | stop]

版本查詢

redis-server -v

TTL(存活時間)

ttl [key]

資料管理

KEYS

  • 阻塞直到完成
  • 禁止在生產環境使用
  • 僅用於除錯

SCAN

  • 使用 cursor 迭代
  • 回傳 slot reference
  • 每次呼叫可能回傳 0 或多個 keys
  • 適合生產環境

FLUSHDB / FLUSHALL

刪除當前資料庫的所有 keys:

flushdb

刪除所有資料庫的所有 keys:

flushall

INCRBY

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 120

List

取得所有元素:

LRANGE media_server_list 0 -1

String

設定帶過期時間的值:

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 文件的儲存與操作。

基本操作

目標說明
插入 JSONJSON.SET
取得 JSONJSON.GET
修改 JSONJSON.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 10

Redis 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]'

相關主題