Redis 使用 sync/await 关键字

eli*_*n25 8 javascript redis node.js

我是 JS 世界的新手,我正在创建一个查询缓存,我决定使用它redis来缓存信息,但我想知道是否有办法在redis.

const redis = require('redis');
const redisUrl = 'redis://127.0.0.1:6379';
const client = redis.createClient(redisUrl);
client.set('colors',JSON.stringify({red: 'rojo'}))
client.get('colors', (err, value) => {
    this.values = JSON.parse(value)
})
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以在 get 函数中使用 await 关键字而不是回调函数。

Lui*_*uis 10

您可以使用 util node 包来保证客户端 redis 的 get 功能。

const util = require('util');
client.get = util.promisify(client.get);
const redis = require('redis');
const redisUrl = 'redis://127.0.0.1:6379';
const client = redis.createClient(redisUrl);
client.set('colors',JSON.stringify({red: 'rojo'}))
const value = await client.get('colors')
Run Code Online (Sandbox Code Playgroud)

使用 util 包,我修改了 get 函数以返回一个承诺。

  • +1,因为这个概念 100% 正确。但是第一个 `client.get` 不是应该低于 `const client` 吗? (6认同)

Ram*_*man 6

这是来自redis包 npm 官方文档

Promises - 您还可以通过使用 bluebird 对 node_redis 进行 promisifying 来使用 node_redis 和 promises,如下所示:

var redis = require('redis');
bluebird.promisifyAll(redis.RedisClient.prototype);
bluebird.promisifyAll(redis.Multi.prototype);
Run Code Online (Sandbox Code Playgroud)

它将向所有 node_redis 函数添加一个 Async(例如返回 client.getAsync().then())

// We expect a value 'foo': 'bar' to be present
// So instead of writing client.get('foo', cb); you have to write:
return client.getAsync('foo').then(function(res) {
    console.log(res); // => 'bar'
});
 
// Using multi with promises looks like:
 
return client.multi().get('foo').execAsync().then(function(res) {
    console.log(res); // => 'bar'
});
Run Code Online (Sandbox Code Playgroud)

这个例子使用 bluebird promisify在这里阅读更多

因此,在您get向“getAsync”承诺 a 之后,您可以在 async await 中使用它,因此在您的情况下

const value = await client.getAsync('colors');
Run Code Online (Sandbox Code Playgroud)