低配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 = 101,
    GetKeyValue,
    SetValue,
    ReplaceValue,
    DeleteKeyValue,
    AppendValue,
    PreappendValue,
    InvalidCommand
};

enum TokenVecIndex{
    commandIndex = 0,
    keyIndex,
    valueIndex,
    invalidIndex
};

std::unordered_map<std::string,Command> CommandString =
{
    {"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;
}

  

时间: 2024-08-01 00:36:53

低配NOSQL的相关文章

OPPO已摆脱“低配高价”的帽子,就看这次能否有突破了

立秋刚悄然过去,线上的营销似乎并无水花溅起.不像上半年一样,各种黑科技接踵而至,炸的我等吃瓜群众,头晕目眩.可以预知的是下半年的战况也应该是非常激烈的. 各大厂商也是摩拳擦掌准备大干一番,纷纷准备发布自家新品旗舰,作为国产手机巨头之一的OPPO自然也是不甘落后,根据多方消息披露,OPPOOPPO手机回收将于8月下旬发布自家新品旗舰R17系列. 而随着发布会的临近,目前关于OPPO R17系列的消息也是越来越清晰,无论是外观.配置.价格均有所披露.根据网上曝光的真机图,外观方面OPPO R17系列

[评测]低配环境下,PostgresQL和Mysql读写性能简单对比

[评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲高终和寡 *******************如果你看到这一行,说明爬虫在本人还没有发布完成的时候就抓走了我的文章,导致内容不完整,请去上述的原文链接查看原文**************** 由于最近经过朋友启发,又有了一个写个人项目的小想法,在这次个人项目中准备学习并使用一些之前自己没有掌握的新

【Node/JavaScript】论一个低配版Web实时通信库是如何实现的1( WebSocket篇)

引论 simple-socket是我写的一个"低配版"的Web实时通信工具(相对于Socket.io),在参考了相关源码和资料的基础上,实现了前后端实时互通的基本功能 选用了WebSocket ->server-sent-event -> AJAX轮询这三种方式做降级兼容,分为simple-socket-client和simple-socket-server两套代码, 并实现了最简化的API: 前后端各自通过connect事件触发,获取各自的socket对象 前端通过soc

Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&amp;CD

随着项目的不断增多,最开始单体项目手动执行 docker build 命令,手动发布项目就不再适用了.一两个项目可能还吃得消,10 多个项目每天让你构建一次还是够呛.即便你的项目少,每次花费在发布上面的时间累计起来都够你改几个 BUG 了. 所以我们需要自动化这个流程,让项目的发布和测试不再这么繁琐.在这里我使用了 Jenkins 作为基础的 CI/CD Pipeline 工具,关于 Jenkins 的具体介绍这里就不再赘述.在版本管理.构建项目.单元测试.集成测试.环境部署我分别使用到了 Go

大家都懂的 JSON 解析器原理(一)简介 & 低配版入门

没学过编译原理,做一个 JSON 解析器难吗?--难!是不是就不能"迎难而上"呢?--不是!越是难的越是一个挑战!--笔者这里尝试通过通俗易懂的行文为大家介绍一下 JSON 解析器,--那一串串长长的 JSON 文本到底是如何被解析成为 Java 里面"可以理解的"对象的.前面的铺垫可能比较长,但请尽量不要跳过,因为那都是基础,尤其对于我们非科班来说,应要恶补.当然,为照顾大家的理解程度(包括我自己,我也会以后回看自己的代码,以此反复理解.反复消化),我会把代码写多

[原]分享一个低配VPS下运行的mysql配置文件

在各种内存CPU核心只有1/2核,内存只有512M/1G的vps下,内存.CPU.硬盘都不是太充裕.因此主要思路是,禁止吃内存大户innodb引擎,默认使用MyISAM.禁止吃硬盘大户log-bin,再调节一些参数到合适的数值. [mysql] # CLIENT # port = 3306 socket = /var/run/mysqld/mysqld.sock [mysqld] # GENERAL # user = mysql default-storage-engine = MyISAM d

微软:2017年Win10重大更新Holographic全息将支持低配电脑

微软Holographic全息技术将成为2017年Win10重大更新中重要的一部分,允许主流配置电脑可以运行2D和3D应用,就像微软HoloLens头戴式设备一样. 微软Windows和设备主管Terry Myerson在今天的Intel LGF大会上表示,微软Holographic全息技术将支持更小型.更低端功耗的娱乐城,Win10将推出重大更新予以支持.Terry Myerson后来称,小型的英特尔NUC PC,搭载Skylake处理器和虹膜集成显卡均支持.支持运行Holographic的W

低配ecs安装Mysql5.6出现问题

2015-06-14 05:26:14 14272 [Note] Plugin 'FEDERATED' is disabled. 2015-06-14 05:26:14 14272 [Note] InnoDB: Using atomics to ref count buffer pool pages 2015-06-14 05:26:14 14272 [Note] InnoDB: The InnoDB memory heap is disabled 2015-06-14 05:26:14 142

java线程学习第一天__低配版的卖面包机

package Thread; import javax.xml.bind.ValidationEvent; class snacks{    private int  SaledSnacks=0;    private int  TotalSnacksNum=10; //初始化小吃店开始有10个面包    private int  TOTALtimeOFSALE=0;    public synchronized boolean salesnacks() {        if (TotalS