diff --git a/include/pika_kv.h b/include/pika_kv.h index 277a27422f..204fdb1ff2 100644 --- a/include/pika_kv.h +++ b/include/pika_kv.h @@ -792,6 +792,8 @@ class PKSetexAtCmd : public Cmd { return res; } void Do() override; + void DoThroughDB() override; + void DoUpdateCache() override; void Split(const HintKeys& hint_keys) override {}; void Merge() override {}; Cmd* Clone() override { return new PKSetexAtCmd(*this); } diff --git a/src/pika_command.cc b/src/pika_command.cc index 81c23c2533..a40cb77f35 100644 --- a/src/pika_command.cc +++ b/src/pika_command.cc @@ -370,7 +370,7 @@ void InitCmdTable(CmdTable* cmd_table) { cmd_table->insert(std::pair>(kCmdNameScanx, std::move(scanxptr))); ////PKSetexAtCmd std::unique_ptr pksetexatptr = std::make_unique( - kCmdNamePKSetexAt, 4, kCmdFlagsWrite | kCmdFlagsKv | kCmdFlagsSlow); + kCmdNamePKSetexAt, 4, kCmdFlagsWrite | kCmdFlagsKv | kCmdFlagsDoThroughDB | kCmdFlagsUpdateCache | kCmdFlagsSlow); cmd_table->insert(std::pair>(kCmdNamePKSetexAt, std::move(pksetexatptr))); ////PKScanRange std::unique_ptr pkscanrangeptr = std::make_unique( diff --git a/src/pika_kv.cc b/src/pika_kv.cc index bba495a967..51a56b5f61 100644 --- a/src/pika_kv.cc +++ b/src/pika_kv.cc @@ -1704,6 +1704,21 @@ void PKSetexAtCmd::Do() { } } +void PKSetexAtCmd::DoThroughDB() { + Do(); +} + +void PKSetexAtCmd::DoUpdateCache() { + if (s_.ok()) { + auto expire = time_stamp_ - static_cast(std::time(nullptr)); + if (expire <= 0) [[unlikely]] { + db_->cache()->Del({key_}); + return; + } + db_->cache()->Setxx(key_, value_, expire); + } +} + void PKScanRangeCmd::DoInitial() { if (!CheckArg(argv_.size())) { res_.SetRes(CmdRes::kWrongNum, kCmdNamePKScanRange);