儲存系統實現-資料刪除之索引的刪除

iteye_21202發表於2013-05-31
在前幾篇中一直沒有提到儲存刪除功能。在這一篇中著重講一下儲存的刪除。
可以分為兩塊:1. 索引的刪除;2.資料的刪除。
這一節主要講一講索引刪除,因為資料的刪除會相對複雜一些。
索引的刪除,這裡有邏輯刪除物理刪除兩種實現方案。物理刪除必然會導致整個位移發生移動(這裡可以思考ArrayList刪除一個元素而導致整個陣列下標都需要改變)。所以在這裡主要考慮用邏輯刪除。邏輯刪除的思想很簡單,理論上其實是刪除索引與資料之間的關聯,這樣索引就可以進行復用。
先看一下整個狀態的列舉類:
/**
 * 索引使用狀態
 *
 */
public enum IndexStatus {
    
    //最新狀態:可以使用
    NEW(0),

    //使用中狀態
    IN_USE(1),
    
    //等待GC狀態
    WAIT_FOR_GC(2);
    
    private int id;
    
    IndexStatus(int id){
        this.id = id;
    }

    public int getId() {
        return id;
    }
}
下面看一下這三種狀態的狀態流轉圖:

從這個圖中可以看出整個狀態是一個閉環,在新建索引或者重新分配索引的時候索引的狀態是"IN_USE",如果出現
remove事件索引狀態是“WAIT_FOR_USE”狀態,然後是GC的時候索引狀態才回到“NEW”狀態。有些人可能要問為什
需要“WAIT_FOR_USE”狀態,其實這裡GC牽涉到資料空間的刪除,而資料空間的刪除相比索引刪除會相對耗時一
些,所以這裡先擬一箇中間狀態做一箇中轉。保證索引刪除資料空間刪除可以獨立進行。
這裡的刪除是一個邏輯刪除,迴歸到“NEW”狀態的索引可以重複使用,這樣主要保證整個索引空間的大小以及空間的
利用率。因為如果空間不進行重複使用,大量的刪除會導致很多無效空間而影響整個索引檢索效能。而回歸到最上面
所說的如果使用物理刪除又是一個極耗時的過程。所以採用這種刪除將是一種比較好的方式。



相關文章