我想要修改所有意外设置的记录的TTL,这些记录是“永不过期”的。 TTL(客户端为-1)。我该怎么做?
答案 0 :(得分:4)
只是澄清一点,在客户端设置TTL of -1意味着永不过期(相当于服务器default-ttl
中的aerospike.conf 0文件),在客户端设置TTL为0时意味着继承此命名空间的默认-ttl 。
使用谓词过滤:
如果您正在使用Java,C,C#和Go客户端,则最简单的方法是使用void time 0将使用predicate filter。您可以将简单记录UDF应用于谓词过滤器匹配的所有记录。
<强> ttl.lua 强>
function set_ttl(rec, to_ttl)
record.set_ttl(rec, to_ttl)
aerospike:update(rec)
end
使用AQL注册Lua模块:
$ aql
Aerospike Query Client
Version 3.12.0
C Client Version 4.1.4
Copyright 2012-2017 Aerospike. All rights reserved.
aql> register module './ttl.lua'
OK, 1 module added.
然后在Java应用程序中:
Statement stmt = new Statement();
stmt.setNamespace(params.namespace);
stmt.setSetName(params.set);
stmt.setPredExp(
PredExp.recVoidTime(),
PredExp.integerValue(0),
PredExp.integerEqual()
);
ExecuteTask task = client.execute(params.writePolicy, stmt, "ttl", "set_ttl", Value.IntegerValue(604800));
task.waitTillComplete();
仅使用UDF :
对于尚未进行谓词过滤的其他客户端(Python,PHP等),您可以通过应用于扫描的记录UDF完成所有操作。过滤逻辑必须存在于UDF内部。
<强> ttl.lua 强>
function modify_zero_ttl(rec, to_ttl)
local rec_ttl = record.ttl(rec)
if rec_ttl == 0 then
record.set_ttl(rec, to_ttl)
aerospike:update(rec)
end
end
在AQL中:
$ aql
Aerospike Query Client
Version 3.12.0
C Client Version 4.1.4
Copyright 2012-2017 Aerospike. All rights reserved.
aql> register module './ttl.lua'
OK, 1 module added.
aql> execute ttl.modify_zero_ttl(604800) on test.foo