redis节点侦听set事件并为每个请求设置ttl

tquggr8v  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(510)

在我的nodejs应用程序中,我使用一个库来设置redis数据库中的键。所以,我需要监听每个创建/更新密钥并添加 ttl 在每个键上(不管它是否已经存在)。
我有我的主redis客户端(向redis数据库添加密钥):

const redisClient = createClient({
    url: redisUrl,
    tls: {
        ca: Buffer.from(redisCertBase64, 'base64').toString('utf-8'),
    },
})

我又增加了一个客户 set 活动:

const subscriberRedis = redisClient.duplicate()

function done(err) {
    logger.error('Notifications not active')
    if (err) {
        logger.error(err.stack || err.message || err)
    }
}

const eventType = 'notify-keyspace-events'

subscriberRedis.config('get', eventType, (err, conf) => {
    if (err) {
        logger.debug('subscriberRedis:get =>', err.message)
        return done(err)
    }
    logger.debug('conf =>', conf)
    if (conf[1].indexOf('EKx') < 0) {
        subscriberRedis.config('set', eventType, conf[1] + 'EKx', function (err) {
            if (err) {
                logger.debug('subscriberRedis:set =>', err.message)
                return done(err)
            }
        })
    }
})

const EVENT_SET = '__keyevent@0__:set'

subscriberRedis.on('message', function (channel, key) {
    switch (channel) {
        case EVENT_SET:
            logger.info('Key "' + key + '" set!')
            break
    }
})

subscriberRedis.subscribe(EVENT_SET)

当我运行这个代码时,我会在日志中 subscriberRedis:set => ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this contextsubscriberRedis.config('set',...) 我不知道我错过了什么。
编辑
我把代码改成了这个,现在可以用了。然而,你认为“竞争条件”的问题仍然存在,当我转移到生产?

const redisClient = createClient({
    url: redisUrl,
    tls: {
        ca: Buffer.from(redisCertBase64, 'base64').toString('utf-8'),
    },
})

/**
 * Subscriber listening to `set` events

**/

const subscriber = redisClient.duplicate()
const EVENT_SET = '__keyevent@0__:set'

subscriber.on('message', function (channel, key) {
    switch (channel) {
        case EVENT_SET:
            redisClient.expire(key, 300)
            logger.debug('Key "'.red + key + '" set!'.yellow)
            break
    }
})
subscriber.subscribe(EVENT_SET)
8zzbczxx

8zzbczxx1#

问题是当你打电话的时候 subscriberRedis.config('set' 您的subscriberredis已订阅 subscriberRedis.subscribe(EVENT_SET) .
而且,你不能用这个连接 subscriberRedis.config('set' 当你订阅的时候。

相关问题