自己實(shí)現(xiàn)基于key-value的NoSQL數(shù)據(jù)庫(kù)(二)—— 改進(jìn)存儲(chǔ)方式和查詢修改函數(shù)

上一篇文章實(shí)現(xiàn)的數(shù)據(jù)庫(kù)很不方便
一方面基于不同的數(shù)據(jù),需要不同的函數(shù)用于存取
另一方面數(shù)據(jù)存儲(chǔ)基于數(shù)組,大小一開(kāi)始的固定的,顯然不行
這一章來(lái)嘗試改一改

我們希望這個(gè)數(shù)據(jù)庫(kù)是動(dòng)態(tài)大小的,能存多少都行
那么一提到這個(gè),第一個(gè)想到的應(yīng)該就是鏈表了
先來(lái)整體看看改動(dòng)后的smallsql.h

可以看到數(shù)據(jù)采用鏈表來(lái)存儲(chǔ)斩箫,接口也改為固定的一對(duì)get/set了,其余不變
依然來(lái)先看看open函數(shù)吧

bool smallsql::open(const std::string& sqlPath)  
{  
    FILE* fp = nullptr;  
    m_sqlPath = sqlPath;  
  
    fopen_s(&fp, sqlPath.c_str(), "r");  
    if (fp == nullptr)  
    {  
        return true;  
    }  
  
    SqlDataList* pHead = m_pDatas;  
    SqlDataList* pPre = nullptr;  
  
    while (!feof(fp))  
    {  
        int type = 0;  
        fread_s(&type, 1, 1, 1, fp);  
  
        int key_len = 0;  
        fread_s(&key_len, 1, 1, 1, fp);  
  
        if (key_len == 0)  
        {  
            continue;  
        }  
  
        m_pDatas = new SqlDataList;  
        m_pDatas->pNext = nullptr;  
        m_pDatas->type = type;  
  
        if (pPre != nullptr)  
        {  
            pPre->pNext = m_pDatas;  
        }  
  
        char* key = new char[key_len + 1];  
        fread_s(key, key_len, key_len, 1, fp);  
        key[key_len] = 0;  
        m_pDatas->key = std::string(key);  
  
        if (type == 0)  
        {  
            SqlData<int>* pItem = new SqlData<int>();  
            fread_s(&pItem->value, 4, 4, 1, fp);  
            m_pDatas->pValue = pItem;  
        }  
        else  
        {  
            SqlData<std::string>* pItem = new SqlData<std::string>();  
            int value_len = 0;  
            fread_s(&value_len, 1, 1, 1, fp);  
            char* value_str = new char[value_len + 1];  
            fread_s(value_str, value_len, value_len, 1, fp);  
            value_str[value_len] = 0;  
            pItem->value = std::string(value_str);  
            delete[] value_str;  
            m_pDatas->pValue = pItem;  
        }  
  
        delete[] key;  
  
        if (pHead == nullptr)  
        {  
            pHead = m_pDatas;  
        }  
  
        pPre = m_pDatas;  
    }  
  
    m_pDatas = pHead;  
  
    fclose(fp);  
  
    return true;  
}  

和上一章想比撵儿,就是改變了數(shù)據(jù)的讀取而已
這是改寫(xiě)后的get函數(shù)

template<typename T>  
T smallsql::get(const std::string& key)  
{  
    SqlDataList* pData = m_pDatas;  
  
    while (pData != nullptr)  
    {  
        if (pData->key == key)  
        {  
            int type = typeid(T) == typeid(int) ? 0 : 1;  
  
            if (type == pData->type)  
            {  
                SqlData<T>* pItem = static_cast<SqlData<T>*>(pData->pValue);  
                return pItem->value;  
            }  
            else  
            {  
                return T();  
            }  
        }  
  
        pData = pData->pNext;  
    }  
  
    return T();  
}  
template<typename T>  
void smallsql::set(const std::string& key, const T& value)  
{  
    SqlDataList* pHead = m_pDatas;  
    SqlDataList* pPre = nullptr;  
  
    while (m_pDatas != nullptr)  
    {  
        if (m_pDatas->key == key)  
        {  
            delete m_pDatas->pValue;  
            SqlData<T>* pItem = new SqlData<T>();  
            pItem->value = value;  
            m_pDatas->pValue = pItem;  
  
            if (pHead != nullptr)  
            {  
                m_pDatas = pHead;  
            }  
  
            return;  
        }  
        else  
        {  
            pPre = m_pDatas;  
            m_pDatas = m_pDatas->pNext;  
        }  
    }  
  
    SqlData<T>* pItem = new SqlData<T>();  
    pItem->value = value;  
  
    m_pDatas = new SqlDataList;  
    m_pDatas->key = key;  
    m_pDatas->pValue = pItem;  
  
    if (typeid(T) == typeid(int))  
    {  
        m_pDatas->type = 0;  
    }  
    else  
    {  
        m_pDatas->type = 1;  
    }  
  
    m_pDatas->pNext = nullptr;  
  
    if (pPre != nullptr)  
    {  
        pPre->pNext = m_pDatas;  
    }  
  
    if (pHead != nullptr)  
    {  
        m_pDatas = pHead;  
    }  
}  

新的get和set用模板來(lái)當(dāng)做數(shù)據(jù)項(xiàng)保存內(nèi)容乘客,實(shí)現(xiàn)一個(gè)接口存儲(chǔ),比上一章要好了不少了另外這里的typeid其余可以考慮用模板特化來(lái)消除掉

總體來(lái)說(shuō)淀歇,這一版改動(dòng)了數(shù)據(jù)的存儲(chǔ)格式和查詢修改的接口
這是1W個(gè)數(shù)據(jù)的時(shí)間易核,相比上一章沒(méi)什么大的變化因?yàn)椴](méi)有優(yōu)化過(guò),10W個(gè)數(shù)據(jù)的時(shí)間任然慘不忍睹 哈哈


看來(lái)當(dāng)務(wù)之急的解決效率問(wèn)題了浪默,10W個(gè)數(shù)據(jù)的操作80多秒是不能忍受的
下一章就嘗試解決這個(gè)問(wèn)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牡直,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纳决,更是在濱河造成了極大的恐慌碰逸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阔加,死亡現(xiàn)場(chǎng)離奇詭異饵史,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)胜榔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門胳喷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人夭织,你說(shuō)我怎么就攤上這事吭露。” “怎么了尊惰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵讲竿,是天一觀的道長(zhǎng)泥兰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)题禀,這世上最難降的妖魔是什么鞋诗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮投剥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘担孔。我一直安慰自己江锨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布糕篇。 她就那樣靜靜地躺著啄育,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拌消。 梳的紋絲不亂的頭發(fā)上挑豌,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音墩崩,去河邊找鬼氓英。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鹦筹,可吹牛的內(nèi)容都是我干的铝阐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼铐拐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼徘键!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起遍蟋,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吹害,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后虚青,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體它呀,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年棒厘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钟些。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绊谭,死狀恐怖政恍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情达传,我是刑警寧澤篙耗,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布迫筑,位于F島的核電站,受9級(jí)特大地震影響宗弯,放射性物質(zhì)發(fā)生泄漏脯燃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一蒙保、第九天 我趴在偏房一處隱蔽的房頂上張望辕棚。 院中可真熱鬧,春花似錦邓厕、人聲如沸逝嚎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)补君。三九已至,卻和暖如春昧互,著一層夾襖步出監(jiān)牢的瞬間挽铁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工敞掘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叽掘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓玖雁,卻偏偏與公主長(zhǎng)得像够掠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茄菊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法疯潭,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法面殖,繼承相關(guān)的語(yǔ)法竖哩,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,627評(píng)論 18 399
  • 今天是十月九號(hào)脊僚,進(jìn)入高三已經(jīng)一個(gè)多月了相叁。很累,真的是累辽幌。因?yàn)椴簧瞄L(zhǎng)物理和化學(xué)增淹,所以選擇了文科。選文科也是抱著只要背...
    24bd2bf5c457閱讀 155評(píng)論 0 0
  • 周末不想寫(xiě)太長(zhǎng)的文章乌企,不寫(xiě)長(zhǎng)不是因?yàn)闊o(wú)話可寫(xiě)虑润,而是因?yàn)槟硞€(gè)人因?yàn)橐l(fā)生大事情而壓縮篇幅,不是因?yàn)榇巳藷o(wú)足輕重加酵,所以...
    思想聚焦的原創(chuàng)閱讀 266評(píng)論 0 6
  • 我需要一個(gè)男人 我們一起頹廢墮落 墜落到最低點(diǎn) 然后上升 不會(huì)太高 哪怕只需上升一點(diǎn) 足矣 于是 我和他享受最低級(jí)...
    Amoxicilline閱讀 616評(píng)論 0 0
  • 水~鹽~~混合到一起就是鹽水拳喻,在禪師的眼中這就是無(wú)上的禪機(jī)哭当,傅大士曾經(jīng)寫(xiě)了一首簡(jiǎn)單的歌,他說(shuō)水中鹽味冗澈,色里...
    無(wú)閑虛空閱讀 1,042評(píng)論 0 2