【问题标题】:Redis use sync/await keywords onRedis 使用 sync/await 关键字
【发布时间】:2020-04-20 18:09:13
【问题描述】:

我是 JS 世界的新手,我正在创建一个查询缓存,我决定使用 redis 来缓存信息,但我想知道是否有办法在 get 函数上使用 async/await 关键字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)
})

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

【问题讨论】:

    标签: javascript node.js redis


    【解决方案1】:

    可以使用util node包来promisify客户端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')
    

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

    【讨论】:

    • +1 因为这个概念是 100% 正确的。但这不是第一个client.get 应该低于const client 吗?
    • const redisGet = util.promisify(db_redis.SCAN).bind(db_redis);
    【解决方案2】:

    这是来自redis包npm官方文档

    Promises - 你也可以通过使用 bluebird 来承诺 node_redis 来使用 node_redis,如下所示:

    var redis = require('redis');
    bluebird.promisifyAll(redis.RedisClient.prototype);
    bluebird.promisifyAll(redis.Multi.prototype);
    

    它将为所有 node_redis 函数添加一个异步(例如 return 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'
    });
    

    此示例使用 bluebird promisify 阅读更多 here

    因此,在您将 get 承诺为“getAsync”后,您可以在异步等待中使用它 所以在你的情况下

    const value = await client.getAsync('colors');
    

    【讨论】:

      【解决方案3】:

      对于 TypeScript 用户,util.promisifybluebird.promisifyAll 由于缺乏类型支持而不理想。

      TypeScript 中最优雅的似乎是handy-redis,它带有 Promise 支持和一流的 TypeScript 绑定。这些类型是直接从 Redis 官方文档生成的,即应该非常准确。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-26
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        • 2018-06-18
        • 1970-01-01
        • 2015-05-04
        相关资源
        最近更新 更多