儲存系統實現-如何刪除資料
阿新 • • 發佈:2019-01-08
前一篇中簡單的寫了下關於索引的刪除,這一篇中完整的介紹整個資料刪除步驟。
1.根據ID查詢索引資料(主要是獲取具體資料地址,有點像資料庫中的根據索引進行回表)
2.根據索引的資料偏移查詢具體的空間ID(在第二篇中介紹了整個系統的儲存結構,儲存空間是分塊的,一個數據物件可能儲存在一個“邏輯空間”中,也有可能儲存在多個儲存空間中,取決於物件的大小)。
3.根據ID去管理檔案中查詢具體的空間儲存,採用跳躍表的方式進行查詢
4.回收資料空間,這裡其實就是把空間的使用狀態設為“NEW”,也就是未使用狀態,下次分配的時候可以根據狀態進行判斷當前空間是使用狀態還是未使用狀態而進行重新分配。
5.回收索引,可重複使用,也是設定索引的狀態
入口程式碼的實現,這裡只貼入口程式碼,每一步都會有比較具體的實現,比如說如何根據ID查詢索引,如何檢索資料地址,以後會講到:
public void run() { long startTime = System.currentTimeMillis(); //從索引檔案中查詢索引,主要是可以獲取資料空間的偏移量 DataOffset offset = indexReader.read(id); if (offset != null) { List<Integer> storageIdList = new ArrayList<Integer>(); //查詢儲存空間的ID,是一個List dataReader.readStorage(storageIdList, offset); //根據id列表取儲存檔案中查詢具體的空間ID。 List<DataObject> storageList = dataFileManager.read(storageIdList); //回收資料空間,這裡其實就是把空間的使用狀態設為“NEW”,也就是未使用 dataFileManager.gc(storageList); IndexStruct indexStruct = new IndexStruct(); indexStruct.setKey(offset.getIndexId()); indexStruct.setDataStartPos(offset.getStartPos()); //回收索引,可重複使用,也是設定索引的狀態 indexWriter.gc(offset.getIndexPos(), indexStruct); } System.out.println("[DataRemovePerThread.run]timeDiff="+(System.currentTimeMillis()-startTime)); }
這是整個刪除的操作的序列圖,其實是上面一段程式碼用圖的方式表現出來:
再用一張流程圖會更加清楚的看到具體的刪除流程:
總結:這裡並未考慮事務性,在這幾步中都可能有異常情況而導致資料操作失敗,這樣的情況下理論上是需要進行回滾。當然在我的實現中並未把事務納入其中,所以也並未做這方面的現實。這裡兩個地方檢索是用到了跳躍表,索引的檢索不言自明,前面有博文已經講到過。空間地址的搜尋也是用跳躍表進行實現,這樣可以加快檢索速度而提高效能。