触发器和函数示例

如何使用触发器和函数

Redis Stack 的触发器和函数功能能够检测数据的变化,并确保在数据源处无缝执行业务逻辑。这确保了可以同时为所有客户端提供新的数据操作选项,同时简化了部署和维护。让我们探索一些这些功能在特定行业中的用例:

  • 零售: 在零售行业,可以开发一个函数,在收到订单时立即更新库存。这使得企业能够准确预测特定仓库在任何一天的库存需求。
  • 旅行: 对于旅行行业,可以利用触发器来检测新的航班预订,并有效地将相关信息加载到队列中供不同的消费者使用。服务可以利用这些数据提供酒店、餐厅、租车服务等的推荐。利用Redis的几何功能,强大的推荐系统可以提供本地化和个性化的建议。
  • 订阅服务: 在订阅服务领域,使用keyspace触发器可以自动识别已续订订阅的用户,无缝将其状态更改为活跃。可以对这些用户执行进一步操作,例如将他们添加到通知交付队列或执行其他操作。

这些示例突出了触发器和函数在不同行业中的实际应用,展示了它们在简化流程和提供高效解决方案方面的价值。

使用keyspace和Stream触发器来捕获事件并执行所需的JavaScript函数,只需几行代码即可为应用程序增添新行为。以下示例展示了如何使用JavaScript解决典型问题。

审计和日志记录

Redis 触发器可用于检测特定数据结构的变化,并在 Redis 日志中记录审计跟踪。最新更改的时间戳可以在同一函数中更新。

function alertUserChanged(client, data) {
    // detect the event and log an audit trail
    if (data.event == 'hset'){
        redis.log('User data changed: ' + data.key);
    }
    else if (data.event == 'del'){
        redis.log('User deleted: ' + data.key);
    }

    var curr_time = client.call("time")[0];

    // add the current timestamp to the Hash
    client.call('hset', data.key, 'last', curr_time);
}

redis.registerKeySpaceTrigger('alert_user_changed', 'user:', 
    alertUserChanged, {description: 'Report user data change.'});

丰富和转换数据

数据可以被提取、丰富或转换,然后再次加载。例如,在将文档插入到哈希数据结构时,触发器可以启动一个函数的执行,该函数计算文本中的单词数(在示例中,展示了一个简单的分词过程,但逻辑可以根据需要变得复杂)。计数器最终与原始文档一起存储在同一个哈希中。

function wordsCounter(client, data){
    text = client.call('hget', data.key, 'content');
    words = text.split(' ').length;
    client.call('hset', data.key, 'cnt', words.toString());
    redis.log('Number of words: ' + words.toString()); //This log is for demo purposes, be aware of spamming the log file in production
}

redis.registerKeySpaceTrigger('words_counter', 'doc:', 
    wordsCounter, {description: 'Count words in a document.'});

批量操作

JavaScript 函数可以在需要时执行,例如作为计划或定期维护例程的一部分。一个例子可能是删除由所需模式识别的数据。

#!js api_version=1.0 name=utils


redis.registerAsyncFunction('del_keys', async function(async_client, pattern){
    var count = 0;
    var cursor = '0';
    do {
        async_client.block((client)=>{
            var res = client.call('scan', cursor, 'match', pattern);
            cursor = res[0];
            var keys = res[1];
            keys.forEach((key) => {
                client.call('del', key);
            });
        });
    } while(cursor != '0');
    return count;
});

函数del_keys对数据库中与所需模式匹配的所有键执行异步批量扫描,并进入一个阻塞部分,在该部分中获取部分结果。此函数的异步设计允许非阻塞执行,因此在任意大小的键空间上执行迭代时,其他客户端不会饿死。该函数可以如下调用。

TFCALLASYNC utils.del_keys 0 "user:*"

自动过期

有时,对于本质上短暂的数据,强制执行过期时间是有用的。一个例子可能是会话数据或认证令牌。触发器适合这种用例,并且可以执行一个设置所需TTL的函数。

function automaticSessionExpiry(client, data){
    client.call('expire', data.key, '3600');
    redis.log('Session ' + data.key + ' has been automatically expired'); //This log is for demo purposes, be aware of spamming the log file in production
}

redis.registerKeySpaceTrigger('automaticSessionExpiry', 'session:', 
    automaticSessionExpiry, {description: 'Set the session TTL to one hour.'});
RATE THIS PAGE
Back to top ↑