diff --git a/memdb/Makefile b/memdb/Makefile index e69de29..141e76d 100644 --- a/memdb/Makefile +++ b/memdb/Makefile @@ -0,0 +1,2 @@ +test: src/main.cpp src/main/memdb.cpp include/memdb.hpp + g++ src/main.cpp -o test.bin -I include/ -std=c++20 -O3 -g \ No newline at end of file diff --git a/memdb/include/memdb.hpp b/memdb/include/memdb.hpp index e5528cc..6fc4964 100644 --- a/memdb/include/memdb.hpp +++ b/memdb/include/memdb.hpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include @@ -35,11 +37,15 @@ private: std::list db; std::unordered_map keys; std::priority_queue time_touch; + std::multiset time_touch_; size_t __size = 0; int MAX_TIME = 60 * 10; // 10分钟 void flush(); void update_queue(); + // 内测版 + void flush_(); + public: using key_t = T; @@ -61,4 +67,11 @@ public: bool remove(key_t to_be_del_k); bool update(key_t to_be_udt_k, value_t udt_v, bool need_to_udt_timetouch=false); std::optional search(key_t to_be_sch_k); + + // 内测版 + const std::multiset & get_time_touch_() const; + bool insert_(key_t to_be_ins_k, value_t ins_v); + bool remove_(key_t to_be_del_k); + bool update_(key_t to_be_udt_k, value_t udt_v, bool need_to_udt_timetouch=false); + std::optional search_(key_t to_be_sch_k); }; \ No newline at end of file diff --git a/memdb/src/main.cpp b/memdb/src/main.cpp index e69de29..23e8a44 100644 --- a/memdb/src/main.cpp +++ b/memdb/src/main.cpp @@ -0,0 +1,13 @@ +#include +#include "main/memdb.cpp" +using namespace std; +Memdb testdb(10); +int main(){ + testdb.insert_("key1","value1"); + auto pack=testdb.search_("key1"); + cout<<(pack==nullopt?"未找到":pack.value())< bool Memdb ::index_timestamp::operator<(const index_timestamp& a) const { - return this -> item -> timestamp < a.item -> timestamp; + return this -> item -> timestamp > a.item -> timestamp; } @@ -20,10 +20,9 @@ void Memdb ::flush() { while (now_time > it -> timestamp || it -> be_del == true) { if (it -> be_del != true) this -> __size--; - key_t to_be_del_k = it -> key; - this -> db.erase(it); - this -> keys.erase(to_be_del_k); + this -> keys.erase(it -> key); this -> time_touch.pop(); + this -> db.erase(it); if (this -> time_touch.empty() == true) { return; @@ -94,6 +93,7 @@ const std::priority_queue ::index_timestamp>& Memdb } + template bool Memdb ::insert(key_t to_be_ins_k, value_t ins_v) { @@ -173,3 +173,120 @@ std::optional Memdb ::search(key_t to_be_sch_k){ typename std::list ::iterator it = this -> keys[to_be_sch_k].item; return it -> value; } + + +/* +内测版 +*/ + + +template + +void Memdb ::flush_() { + if (this -> time_touch_.empty() == true) { + return; + } + std::chrono::system_clock::time_point now_time = std::chrono::system_clock::now(); + typename std::list ::iterator it = this -> time_touch_.begin() -> item; + + while (now_time > it -> timestamp || it -> be_del == true) { + if (it -> be_del != true) this -> __size--; + key_t to_be_del_k = it -> key; + this -> db.erase(it); + this -> keys.erase(to_be_del_k); + this -> time_touch_.erase(this -> time_touch_.begin()); + + if (this -> time_touch_.empty() == true) { + return; + } + it = this -> time_touch_.begin() -> item; + now_time = std::chrono::system_clock::now(); + } +} + + +template + +const std::multiset ::index_timestamp>& Memdb ::get_time_touch_() const { + return this -> time_touch_; +} + + +template + +bool Memdb ::insert_(key_t to_be_ins_k, value_t ins_v) { + this -> flush_(); + if (this -> keys.find(to_be_ins_k) != this -> keys.end()) { + return this -> fail; + } + + std::chrono::system_clock::time_point now_time = std::chrono::system_clock::now(); + + Memdb::memdb_column new_column; + new_column.key = to_be_ins_k; + new_column.value = ins_v; + new_column.timestamp = now_time + std::chrono::seconds(MAX_TIME); + this -> db.push_back(new_column); + + Memdb::index_keys new_key; + new_key.key = to_be_ins_k; + new_key.item = std::prev(this -> db.end()); + this -> keys[to_be_ins_k] = new_key; + + Memdb::index_timestamp new_time_touch; + new_time_touch.item = std::prev(this -> db.end()); + this -> time_touch_.insert(new_time_touch); + + this -> __size++; + + return this -> succ; +} + + +template + +bool Memdb ::remove_(key_t to_be_del_k) { + this -> flush_(); + if (this -> keys.find(to_be_del_k) == this -> keys.end()) { + return this -> fail; + } + + typename std::list ::iterator it = this -> keys[to_be_del_k].item; + it -> be_del = true; + this -> keys.erase(it -> key); + this -> __size--; + + return this -> succ; +} + + +template + +bool Memdb ::update_(key_t to_be_udt_k, value_t udt_v, bool need_to_udt_timetouch) { + this -> flush_(); + if (this -> keys.find(to_be_udt_k) == this -> keys.end()) { + return this -> fail; + } + + typename std::list ::iterator it = this -> keys[to_be_udt_k].item; + it -> value = udt_v; + if (need_to_udt_timetouch == true) { + std::chrono::system_clock::time_point now_time = std::chrono::system_clock::now(); + it -> timestamp = now_time + std::chrono::seconds(MAX_TIME); + } + + return this -> succ; +} + + +template + +std::optional Memdb ::search_(key_t to_be_sch_k){ + this -> flush_(); + if (this -> keys.find(to_be_sch_k) == this -> keys.end()) { + return std::nullopt; + } + + typename std::list ::iterator it = this -> keys[to_be_sch_k].item; + return it -> value; +} \ No newline at end of file