库配置
如何在 JavaScript 函数中使用配置
编写库时,你可能希望提供一个加载配置,以便不同的用户可以在不更改基础代码的情况下以略有不同的行为使用同一个库。例如,假设你编写了一个库,该库向哈希中添加了一个 __last_updated__
字段(你可以了解如何使用 键空间触发器 来完成此操作),代码如下所示
#!js api_version=1.0 name=lib
redis.registerFunction("hset", function(client, key, field, val){
// get the current time in ms
var curr_time = client.call("time")[0];
return client.call('hset', key, field, val, "__last_update__", curr_time);
});
运行示例
127.0.0.1:6379> TFCALL lib.hset k a b 0
(integer) 2
127.0.0.1:6379> hgetall k
1) "foo"
2) "bar"
3) "__last_update__"
4) "1658653125"
上述代码的问题在于 __last_update__
字段是硬编码的。如果我们希望允许用户在运行时对其进行配置,该怎么办?触发器和函数允许使用传递给 TFUNCTION LOAD
命令的 CONFIG
参数在加载时指定库配置。配置参数接受 JSON 对象的字符串表示形式。JSON 将作为 JS 对象在 redis.config
变量下提供给库。我们可以更改上述示例以接受 __last_update__
字段名称作为库配置。代码如下所示
#!js api_version=1.0 name=lib
var last_update_field_name = "__last_update__"
if (redis.config.last_update_field_name !== undefined) {
if (typeof redis.config.last_update_field_name != 'string') {
throw "last_update_field_name must be a string";
}
last_update_field_name = redis.config.last_update_field_name
}
redis.registerFunction("hset", function(client, key, field, val){
// get the current time in ms
var curr_time = client.call("time")[0];
return client.call('hset', key, field, val, last_update_field_name, curr_time);
});
请注意,在上述示例中,我们首先将 last_update_field_name
设置为 __last_update__
,这是在配置未提供值时的默认值。然后,我们检查配置中是否有 last_update_field_name
,如果有,则使用它。我们现在可以使用 CONFIG
参数加载我们的函数
> redis-cli -x TFUNCTION LOAD REPLACE CONFIG '{"last_update_field_name":"last_update"}' < <path to code file>
OK
我们可以看到最后更新字段名称是 last_update
127.0.0.1:6379> TFCALL lib.hset h a b 0
(integer) 2
127.0.0.1:6379> hgetall h
1) "a"
2) "b"
3) "last_update"
4) "1658654047"
请注意,触发器和函数仅向库提供 JSON 配置。验证给定配置的正确性是库的责任。