內存級別的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;
};
省去了到其它結點查詢的代碼,省去了記錄相關服務的連接對象,一套代碼同時滿足單結點與分布式需求,從此沒有分布式一說。