2017-07-19 2 views
3

Ich möchte die TTL aller Datensätze ändern, die versehentlich mit einer TTL "Nie ablaufen" (-1 im Client) festgelegt wurden. Wie würde ich das tun?Wie ändere ich die TTL aller Datensätze, die mit einem TTL von -1 in Aerospike gesetzt wurden?

+0

Diese https://stackoverflow.com/questions/45138351/how-to-fetch-records- in Frage zusammenhängt Ich habe geantwortet, dann hat der OP seine Frage geändert. Ich wollte die Information nicht verlieren, da ich die ursprüngliche Antwort jetzt erheblich bearbeiten muss. –

Antwort

3

Nur um zu klären, eine TTL of -1 in der Client-Einstellung bedeutet, nie (entspricht einem default-ttl von 0 in der aerospike.conf-Datei des Servers), ablaufen, während ein TTL von 0 in der Client-Einstellung bedeutet für die default-ttl erben Dieser Namespace.

Mit Prädikat Filter:

Wenn Sie den Java verwenden, C, C# und Go Kunden die einfachste Möglichkeit, die Datensätze mit einem void time von 0 zu identifizieren wären ein predicate filter zu verwenden. Sie würden eine einfache Datensatz-UDF auf alle Datensätze anwenden, die vom Prädikatfilter abgeglichen wurden.

ttl.lua

function set_ttl(rec, to_ttl) 
    record.set_ttl(rec, to_ttl) 
    -- for the TTL update to happen a bin must be 'dirty' 
    -- set the first bin back with the value of the first bin 
    -- no changes will occur other than the TTL change, but the 
    -- aerospike:update(rec) will actually execute 
    local bin_names = record.bin_names(rec) 
    local do_nothing = rec[bin_names[1]] 
    rec[bin_names[1]] = do_nothing 
    aerospike:update(rec) 
end 

das Modul Lua Registrieren AQL mit:

$ 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. 

dann in der Java-App:

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(); 

Nur UDF mit:

Mit anderen Clients, die noch keine Prädikatfilterung (Python, PHP usw.) haben, würden Sie alles über eine Datensatz-UDF tun, die auf einen Scan angewendet wird. Die Filterlogik müsste innerhalb der UDF leben.

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) 
    -- for the TTL update to happen a bin must be 'dirty' 
    -- set the first bin back with the value of the first bin 
    -- no changes will occur other than the TTL change, but the 
    -- aerospike:update(rec) will actually execute 
    local bin_names = record.bin_names(rec) 
    local do_nothing = rec[bin_names[1]] 
    rec[bin_names[1]] = do_nothing 
    aerospike:update(rec) 
    end 
end 

In 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