随着資訊技術的飛速發展,企業越來越依賴于資訊化管理。盡管目前各種新的技術層出不窮,但大多數企業的業務資料依然主要存儲在資料庫中, 資料庫是應用系統的基石,資料庫中存儲着大量的資料資訊,資料庫的穩定性、性能、擴充性,對業務的營運起着至關重要的作用。TcaplusDB作為騰訊自研的分布式NoSQL資料庫,緻力于幫助客戶解決資料存儲問題,為業務保駕護航。
以下為TcaplusDB常見入門問題(資料庫使用類-1)
如何擷取某個響應包錯誤碼的含義?
推薦您在代碼裡采用在 gameserver 裡調用函數
TcapErrCode::TcapErrCodeInit
和
TcapErrCode::GetErrStr
函數來擷取錯誤碼,也可以本地搜尋 TcaplusDB API 的頭檔案。
TcaplusDB 的樂觀鎖原理和使用方法?
舉個搶火車票例子:
- 100個人去搶同一張火車票,此時火車票的記錄版本号是10,100個人 get 時,都是記錄版本号為10。然後這100個人拿着記錄版本号為10來搶火車票。
- 100個人來對這張火車票進行寫操作,因為寫操作後記錄版本号++,對于單個 key 的操作,tcapsvr 工作線程是排隊的,第一個人搶到了火車票,此時火車票的記錄版本号為11了,而剩餘的99個人來搶時,拿着的記錄版本号還是10。
- tcapsvr 在處理這99個人的寫請求時,全部報錯了,因為 tcapsvr 端的記錄的版本号和請求裡的版本号不一緻導緻的,并發時的原則:
- N個請求,隻是需要第一個請求成功,剩餘的N - 1個請求失敗,則采用版本保護規則。
- N個請求,需要N個請求全部執行完畢,則不需要版本保護規則,TcaplusDB 這邊對同一個 key 的操作。
排隊執行調用函數
SetCheckDataVersionPolicy
,其值包括:
-
:檢測記錄版本号,隻有當該版本号與伺服器端的版本号相同時,該版本号才會自增 。CHECKDATAVERSION_AUTOINCREASE
-
:不檢測記錄版本号,強制把用戶端的記錄版本号寫入到伺服器中。NOCHECKDATAVERSION_OVERWRITE
-
:不檢測記錄版本号,将伺服器端的版本号自增。NOCHECKDATAVERSION_AUTOINCREASE
- 預設類型為
,推薦您使用。CHECKDATAVERSION_AUTOINCREASE
list 表的使用場景及注意事項?
凡是存在1:N的使用場景,N < 1024時,優先考慮 list 表,例如存儲玩家最近的100封郵件、最近的100場戰鬥記錄等,list 表支援按照隊頭插入、隊尾淘汰,隊尾插入、隊頭淘汰,支援按照插入時間排序的 Top N 操作,單個 key 下的單元個數可以通過表變更修改大,因為需要相容舊資料不能修改小。采用 listgetall 可以擷取單個 key 下總的記錄數目,推薦按照 offset 自己維護,limit 等于一定門檻值的方式擷取資料,listreplace、listdelete、listdeletebatch 時需要指定正确的 index。listaddafter 時需要指定單個 key 下的元素單元個數滿時淘汰的規則,調用 SetListShiftFlag 函數設定是以 list 表有2個增加方向,2個擷取方向,就是4種可能:
- A、B、C、D、E,按照 offset = 正數,limit = 2 拉取就是A、B,C、D,E。
- A、B、C、D、E,按照 offset = 負數,limit = 2 拉取就是D、E,B、C,A。
- E、D、C、B、A,按照 offset = 正數,limit = 2 拉取就是E、D,C、B,A。
- E、D、C、B、A,按照 offset = 負數,limit = 2 拉取就是B、A,D、C,E。
另外,調用
GetRecordMatchCount
可以擷取記錄的總數。
insert、update、replace 有什麼差別?
insert 操作,當 key 不存在時會進行插入,當 key 存在時,會傳回錯誤碼:
TcapErrCode::SVR_ERR_FAIL_RECORD_EXIST
。 replace 操作,當 key 不存在會進行插入,當 key 存在時,如果采用了樂觀鎖,則根據樂觀鎖的結果執行不同的操作,成功則進行替換,失敗則傳回錯誤碼:
TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION;
如果沒有采用樂觀鎖,直接替換。 update 操作,當 key 存在,如果采用了樂觀鎖,則根據樂觀鎖的結果執行不同的操作,成功則進行更新,失敗則傳回錯誤碼:
TcapErrCode::SVR_ERR_FAIL_INVALID_VERSION
,如果沒有采用樂觀鎖,直接更新;如果key不存在時,則傳回錯誤碼:
TcapErrCode::TXHDB_ERR_RECORD_NOT_EXIST
。
如何擷取某個表的記錄數目?
TcaplusDB API 接口裡有 count 指令字,如果采用 tcaplus_client 可以采用 count 表名指令擷取表的記錄數目。
TcaplusDB 支援周遊操作嗎?
TcaplusDB 支援周遊操作,包括 generic 表、list 表的周遊操作,周遊時注意設定從 tcapsvr slave 上周遊資料(從 tcapsvr slave 上周遊資料,不會影響 tcapsvr master 對外提供服務),即接口:
SetOnlyReadFromSlave(bool flag)