內存級別的nosql

jopen 10年前發布 | 12K 次閱讀 NoSQL數據庫 NOSQL

《外存》本質上是一個內存級別的nosql。 外存提出了“面向變量”的數據訪問思想,讓用戶只見變量,不見接口,省去了繁瑣的接口調用。 以此實現了邏輯與數據分離的效果,一份單結點代碼自動達到分布式效果。 外存擁有卓越的性能,單1client時,對于非持久化數據達到3萬/秒吞吐,對于持久化數據達到2萬/秒吞吐 client并發越多性能也就越高。 目前提供了int8、uint8、uint64、float、double等基礎類型變量的操作,后續將實現map vector類型變量操作。

來看看面向變量的接口方式比傳統數據接口方式要方便多少

場景1:假設服務上有3個邏輯:用戶登錄時,用戶發表文章,用戶發表評論時,要提升用戶等級 。

傳統數據庫接口方式

申明數據庫連接 db;

db.connect();

OnLogin()

{

申明變量 level

get(表名,"level", level);

level++;

set(表名,"level", level);

}

OnSend()

{

申明變量 level

get(表名,"level", level);

level++

set(表名,"level", level);

}

OnReply()

{

申明變量 level

get(表名,"level", level);

level++

set(表名,"level", level);

}

面向變量的訪問方式

Exist::int32 m_var("level");//申明變量

OnLogin()

{

var++;//數據已經在外存服務器上修改,下次訪問將在新值基礎上

}

OnSend()

{

var++;//數據已經在外存服務器上修改,下次訪問將在新值基礎上

}

OnReply()

{

var++;//數據已經在外存服務器上修改,下次訪問將在新值基礎上

}

就這么簡單,用戶直接看到一個個的變量,就像操作內存上的變量一樣操作數據,根本不需要任何接口,外存由此得名

場景2:100萬用戶同時在線:用戶A要查詢用戶B的資料

傳統接口方式

m_otherNode;//其它結點/中轉定位服務

std::map<...> m_userList;//已經登錄當前結點的用戶的列表

OnFindUser( char *username )

{

    map::iterater it = m_userList.find(username);

    if ( it == m_userList.end() )//用戶未必再當前結點登錄,

    {

            m_otherNode.Send("查詢用戶數據");//到其它結點,或其它定位服務中專查詢

            m_otherNode.Recv();

            if (回應用戶不存在) 

            {

                    回應用戶不存在;

                    return;

            }

    }

    回應用戶信息

    return;

};

復制代碼

面向變量接口方式

Exist::map<...> m_userList;//已經登錄的用戶的列表,用戶信息在外存上

OnFindUser( char *username )

{

    map::iterater it = m_userList.find(username);

    if ( it == m_userList.end() )//用戶要么在外存中,要么不存在

    {

            回應,用戶不存在;

            return;

    }

    回應用戶信息;

    return;

};

省去了到其它結點查詢的代碼,省去了記錄相關服務的連接對象,一套代碼同時滿足單結點與分布式需求,從此沒有分布式一說。

項目主頁:http://www.baiduhome.net/lib/view/home/1417950914464

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!