最近幾天在優化存儲的編碼規則,順帶把之前設計了但未實現的倒排序一併實現了。由於所有數據(元數據、實體、索引等)都映射至RocksDB的Key-Value存儲,所以必須擴展RocksDB的自定義比較器(Comparator)來實現自定義Key的排序規則。存儲層涉及到需要自定義排序的主要是分區元數據、實體數據以及索引,下面分別說明:
一、分區排序
在大表分區設置分區鍵及其規則時,可以根據需要設置每個分區鍵的排序,如下圖所示:
如果分區鍵規則是Hash,設置排序將被忽略
二、實體排序
在新建實體模型時可以根據需要指定主鍵排序,這裏需要注意的是不同於傳統數據庫可以指定任意字段作爲主鍵,實體的主鍵是128位的順序Guid,包括時間戳及集羣節點等編碼信息,所以這裏的實體排序指的是按時間戳正倒排。如果實體是如訂單等跟時間相關的數據類型,建議設置爲倒排以方便掃描最近的實體數據。具體參考下圖設置:
三、索引排序
在添加索引時可以根據需要設置每個索引鍵的排序,如下圖所示:
四、排序測試
我們來做個簡單的測試:
新建一個分區表VehicleState按時間降序,加入字段VID Int32, Speed Int32,設置分區鍵爲VID按降序;
- 新建一個服務填充3 * 3條數據,如下示例代碼:
public async Task<object> Insert()
{
return await SimplePerfTest.Run(3, 3, async (i, j) =>
{
var obj = new Entities.VehicleState(i + 1);
obj.Speed = 10 + j;
await EntityStore.SaveAsync(obj);
});
}
通過dbscan工具驗證分區元數據排列順序,如下圖所示紅框內爲3個分區的排列順序:
通過實體模型設計界面內的數據瀏覽驗證排列順序,如下圖所示3個紅框爲3個分區的排列順序:
五、本篇小結
經過這次編碼規則優化,存儲引擎的編碼格式已基本定型,下一步按計劃實現各項必須功能並加強存儲引擎的測試,GitHub上的運行時也更新爲新的編碼格式,大家可安裝測試。另碼文不易,一邊碼代碼一邊碼文更不易,作者需要您的支持請多多點贊推薦!