天天看點

【入門必讀】《TcaplusDB資料庫常見問題解決及診斷技巧集錦-資料庫使用類-1》

随着資訊技術的飛速發展,企業越來越依賴于資訊化管理。盡管目前各種新的技術層出不窮,但大多數企業的業務資料依然主要存儲在資料庫中, 資料庫是應用系統的基石,資料庫中存儲着大量的資料資訊,資料庫的穩定性、性能、擴充性,對業務的營運起着至關重要的作用。TcaplusDB作為騰訊自研的分布式NoSQL資料庫,緻力于幫助客戶解決資料存儲問題,為業務保駕護航。

以下為TcaplusDB常見入門問題(資料庫使用類-1)

如何擷取某個響應包錯誤碼的含義?

推薦您在代碼裡采用在 gameserver 裡調用函數​

​TcapErrCode::TcapErrCodeInit​

​和​

​TcapErrCode::GetErrStr​

​函數來擷取錯誤碼,也可以本地搜尋 TcaplusDB API 的頭檔案。

TcaplusDB 的樂觀鎖原理和使用方法?

舉個搶火車票例子:

  1. 100個人去搶同一張火車票,此時火車票的記錄版本号是10,100個人 get 時,都是記錄版本号為10。然後這100個人拿着記錄版本号為10來搶火車票。
  2. 100個人來對這張火車票進行寫操作,因為寫操作後記錄版本号++,對于單個 key 的操作,tcapsvr 工作線程是排隊的,第一個人搶到了火車票,此時火車票的記錄版本号為11了,而剩餘的99個人來搶時,拿着的記錄版本号還是10。
  3. 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種可能:

  1. A、B、C、D、E,按照 offset = 正數,limit = 2 拉取就是A、B,C、D,E。
  2. A、B、C、D、E,按照 offset = 負數,limit = 2 拉取就是D、E,B、C,A。
  3. E、D、C、B、A,按照 offset = 正數,limit = 2 拉取就是E、D,C、B,A。
  4. 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)​