触发器和函数示例
如何使用触发器和函数
Redis Stack 的触发器和函数功能能够检测到数据发生变化,并保证业务逻辑在数据源处无缝执行。这确保了可以实现操作数据的全新选项,并且可以同时向所有客户端提供这些选项,同时简化部署和维护。让我们探索一些这些功能在特定行业中发挥优势的用例。
- 零售:在零售行业,可以开发一个函数,在收到订单时立即更新库存。这使企业能够准确预测任何一天特定仓库的库存需求。
- 旅行:对于旅游行业,可以使用一个触发器来检测新的航班预订,并将相关信息有效地加载到不同消费者的队列中。然后,服务可以利用这些数据为酒店、餐厅、租车服务等提供推荐。利用 Redis 几何图形,强大的推荐系统可以提供本地化和个性化的建议。
- 订阅服务:在订阅服务领域,使用键空间触发器可以自动识别订阅已续订的用户,无缝地将其状态更改为活动状态。可以对这些用户执行进一步的操作,例如将它们添加到用于发送通知的队列中或执行其他操作。
这些示例突出了触发器和函数在不同行业的实际应用,展示了它们在简化流程和提供高效解决方案方面的价值。
使用键空间和 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.'});