首页 > 代码库 > 低配NOSQL
低配NOSQL
东西写的太简单了 都不好意思说是NOSQL
其实就是STL 的map容器记录了写入的信息
解析了下数据仅此。
分析的时候想了很多
比如学习redis的自写hash,动态调整hash表容量。
比如右值或者C语言直接操作内存 提升效率
比如多线程操作互斥 网络连接 记录操作时间等等
但是c++写起来,心智负担太多。
实在是太繁琐 一点激情都没了
还是简单一点 写个完整的获益更多。
最后就是这个简单完整的小代码
#include <iostream>#include <unordered_map>#include <string>#include <map>#include <vector>#include <assert.h>using namespace std;enum Command{ AddKeyValue = http://www.mamicode.com/101,"add",AddKeyValue}, {"get",GetKeyValue}, {"set",SetValue}, {"replace",ReplaceValue}, {"del",DeleteKeyValue}, {"append",AppendValue}, {"preapp",PreappendValue}};std::unordered_map<std::string,std::string> ItemHashStorage;void splitWithSTLFind(const string& str, const string& delim, vector<string>& ret){ size_t front = str.find_first_not_of(delim); size_t back = str.find_first_of(delim, front) ; while(back != std::string::npos && front != std::string::npos){ ret.emplace(ret.end(),str.substr(front, back - front)); front = str.find_first_not_of(delim, back +1); back = str.find_first_of(delim, front); } if(front != std::string::npos){ ret.emplace(ret.end(),str.substr(front, back - front)); }}bool CheckToken(std::vector<std::string>& tokenVec){ bool bRet = false; if( (tokenVec[commandIndex] == "get" || tokenVec[commandIndex] == "del") && tokenVec.size() != 2){ return bRet; } if(tokenVec.size() != 3) return bRet; bRet = true; return bRet;}bool GetCommand(const std::string& input,std::vector<std::string>& tokenVec){ std::string delim = " "; tokenVec.clear(); splitWithSTLFind(input,delim,tokenVec); return CheckToken(tokenVec);}bool SetValueFunc(const std::vector<std::string>& tokenVec){ ItemHashStorage[tokenVec[keyIndex]] = tokenVec[valueIndex]; return true;}bool AddKeyValueFunc(const std::vector<std::string>& tokenVec){ if( ItemHashStorage.find(tokenVec[keyIndex]) != ItemHashStorage.end()) return true; SetValueFunc(tokenVec); return true;}bool ReplaceValueFunc(const std::vector<std::string>& tokenVec){ if( ItemHashStorage.find(tokenVec[keyIndex]) == ItemHashStorage.end()) return false; SetValueFunc(tokenVec); return true;}bool GetKeyValueFunc(const std::vector<std::string>& tokenVec,string& retValueString){ auto it = ItemHashStorage.find(tokenVec[keyIndex]); if( it == ItemHashStorage.end()) return false; retValueString = it->second; return true;}bool PreappendValueFunc(const std::vector<std::string>& tokenVec){ auto it = ItemHashStorage.find(tokenVec[keyIndex]); if( it == ItemHashStorage.end()) return false; string s = tokenVec[valueIndex]; s.append(it->second); std::swap(s,it->second); return true;}bool DeleteKeyValueFunc(const std::vector<std::string>& tokenVec){ auto it = ItemHashStorage.find(tokenVec[keyIndex]); if( it == ItemHashStorage.end()) return true; ItemHashStorage.erase(it); return true;}bool AppendValueFunc(const std::vector<std::string>& tokenVec){ auto it = ItemHashStorage.find(tokenVec[keyIndex]); if( it == ItemHashStorage.end()) return false; (it->second).append(tokenVec[valueIndex]); return true;}bool Excute(const std::vector<std::string>& tokenVec,string& retValueString){ bool bRet = false; auto it = CommandString.find(tokenVec[commandIndex]); if( it == CommandString.end()) return bRet; switch(it->second){ case AddKeyValue: bRet = AddKeyValueFunc(tokenVec); break; case GetKeyValue: bRet = GetKeyValueFunc(tokenVec,retValueString); break; case SetValue: bRet = SetValueFunc(tokenVec); break; case ReplaceValue: bRet = ReplaceValueFunc(tokenVec); break; case DeleteKeyValue: bRet = DeleteKeyValueFunc(tokenVec); break; case AppendValue: bRet = AppendValueFunc(tokenVec); break; case PreappendValue: bRet = PreappendValueFunc(tokenVec); break; default: break; } return bRet;}std::vector<std::string> testStringVec1={ " add ", " add testkey1 testvalue1", " add testkey1 testvalue1", " add testkey1 testvalue1", " add"};std::vector<std::string> testStringVec2={ " add ", " add testkey2 testvalue1", " add testkey3 testvalue1", " add testkey4 testvalue1", " add"};int main(int argc, char *argv[]){ // test for(auto it:testStringVec1 ){ std::vector<std::string> tokenVec; if( GetCommand(it,tokenVec)){ std::string s; Excute(tokenVec,s); } } assert(ItemHashStorage.size()==1); for(auto it:testStringVec2 ){ std::vector<std::string> tokenVec; if( GetCommand(it,tokenVec)){ std::string s; Excute(tokenVec,s); } } assert(ItemHashStorage.size()==4); { std::vector<std::string> tokenVec; string commandStr= "get testkey4"; string s; GetCommand(commandStr,tokenVec); Excute(tokenVec,s); assert(s==string("testvalue1")); } { std::vector<std::string> tokenVec; string commandStr= "get testkey4 testkey4"; string s; GetCommand(commandStr,tokenVec); Excute(tokenVec,s); assert(s==string("testvalue1")); } { std::vector<std::string> tokenVec; string commandStr= "get nothing testkey4"; string s; GetCommand(commandStr,tokenVec); assert( false == Excute(tokenVec,s)); assert(s == string("")); } { std::vector<std::string> tokenVec; string commandStr= "set testkey2 testkey4"; string s; GetCommand(commandStr,tokenVec); Excute(tokenVec,s); GetCommand("get testkey2",tokenVec); Excute(tokenVec,s); assert(s == ("testkey4")); } { std::vector<std::string> tokenVec; string commandStr= "replace testkey3 testkey33"; string s; GetCommand(commandStr,tokenVec); Excute(tokenVec,s); GetCommand("get testkey3",tokenVec); Excute(tokenVec,s); assert(s == ("testkey33")); } { std::vector<std::string> tokenVec; string commandStr= "del testkey3 testkey33"; string s; GetCommand(commandStr,tokenVec); assert(Excute(tokenVec,s)); GetCommand("get testkey3",tokenVec); assert(false == Excute(tokenVec,s)); assert(s== ("")); } { std::vector<std::string> tokenVec; string commandStr= "append testkey1 -appendValue"; string s; GetCommand(commandStr,tokenVec); assert(Excute(tokenVec,s)); GetCommand("get testkey1",tokenVec); assert(Excute(tokenVec,s)); assert(s== "testvalue1-appendValue"); } { std::vector<std::string> tokenVec; string commandStr= "preapp testkey1 Pre-"; string s; GetCommand(commandStr,tokenVec); assert(Excute(tokenVec,s)); GetCommand("get testkey1",tokenVec); assert(Excute(tokenVec,s)); assert(s== "Pre-testvalue1-appendValue"); } return 0;}
低配NOSQL
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。