點燈坊

失くすものさえない今が強くなるチャンスよ

使用 Node 存取 Redis

Sam Xiao's Avatar 2019-11-20

Node 只要安裝 Redis Client,就能存取 Redis,可使用傳統 Callback 或 Promise。

Version

macOS Catalina 10.15.1
Docker Desktop 2.1.0.5
WebStorm 2019.2.4
Node 13.1.0
Redis 5.0.6
Redis Client 2.8.0

Redis Client

$ yarn add redis

使用 Yarn 安裝 Redis Client。

Callback

src/index.js

import { createClient } from 'redis'

let client = createClient({
  host: 'localhost',
  port: 6379
})

client.set('hello', 'world', (_, data) => console.log(data))
client.get('hello', (_, data) => console.log(data))

第 1 行

import { createClient } from 'redis'

redis 引入 createClient()

第 3 行

let client = createClient({
  host: 'localhost',
  port: 6379
})

使用 createClient() 建立 Redis client,傳入 option object 指定 hostport

第 8 行

client.set('hello', 'world', (_, data) => console.log(data))
client.get('hello', (_, data) => console.log(data))

使用 Redis client 的 set() 建立 key / value,get() 讀取 key / value,最後一個 argument 為 callback。

Promise

src/index.js

import { createClient } from 'redis'
import { promisify } from 'util'

let client = createClient({
  host: 'localhost',
  port: 6379
})

let setAsync = promisify(client.set).bind(client)
let getAsync = promisify(client.get).bind(client)

setAsync('hello', 'world').then(console.log)
getAsync('hello').then(console.log)

第 9 行

let setAsync = promisify(client.set).bind(client)
let getAsync = promisify(client.get).bind(client)

若要使用 promise,也可使用 promisify() 將 Redis client 的 method 轉成 promise-based,但因為 promisify() 回傳為 standalon function,要使用 bind()clientthis 重新綁定回去。

12 行

setAsync('hello', 'world').then(console.log)
getAsync('hello').then(console.log)

最後一個 argument 的 callback 則改成 promise 的 then() 傳入 callback。

Bluebird Promise

$ yarn add bluebird

若你覺得要自己使用 promisify() 自己包 function 很麻煩,可使用 bluebird 自動將所有 function 加上 Async() 變成 promise-based function。

src/index.js

import redis, { createClient } from 'redis'
import { promisifyAll } from 'bluebird'

promisifyAll(redis)

let client = createClient({
  host: 'localhost',
  port: 6379
})

client.setAsync('hello', 'world').then(console.log)
client.getAsync('hello').then(console.log)

第 2 行

import { promisifyAll } from 'bluebird'

bluebird 引入 promisifyAll()

第 4 行

promisifyAll(redis)

使用 promisifyAll()redis 下所有 method 都加上 promise-based function。

11 行

client.setAsync('hello', 'world').then(console.log)
client.getAsync('hello').then(console.log)

set()get() 自動改成 setAsync()getAsync() 成為 promised-based function。

Conclusion

  • Redis client 原本的 method 為 callback-based,可自行使用 promisifybluebird 轉成 promised-based

Reference

Redis, Usage Example