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 指定 host
與 port
。
第 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()
將 client
的 this
重新綁定回去。
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,可自行使用
promisify
或bluebird
轉成 promised-based