When handling TTL/expiration, decide “already expired?” (and validate expiry inputs) before performing DB mutations or expensive work, and then keep DB changes, stats/counters, and keyspace notifications consistent with the real outcome. For conditional variants (NX/XX, ENX/FNX/FXX), short-circuit behavior must match the condition.
Practical checklist:
Pattern:
// Pseudocode pattern
if (expire && checkAlreadyExpired(milliseconds)) {
if (found_existing_key) {
// delete with correct delete semantics (e.g., overwrite deletion vs expired deletion)
dbDeleteOrExpireSemantics(db, key);
emit_del_ksn_and_update_stats();
} else {
// for “missing key” cases: short-circuit without creating state
// but still update counters if spec requires it
emit_required_counters_only();
}
return;
}
// otherwise: proceed with normal insert/update and set TTL
apply_set_or_increment_and_set_expire();
Enter the URL of a public GitHub repository