利用map的特性實現同步更新操作

實習期間做的是存儲服務,存儲文件上傳到騰訊雲的OSS上後,本地數據庫會記錄文件的相關信息。比如名稱、大小、下載路徑等等。時間久了,有時候會出現騰訊雲上存在這個文件,但是本地數據庫沒有它的信息。或者本地存在某文件的信息,但是雲上卻沒有,這就需要主動把本地多餘的文件信息刪除掉。這時候,就需要編寫一個同步更新存儲文件的接口了,實現雲上和數據庫的信息保持同步。

剛開始的時候,我用的是硬着來實現這個這個接口的。我是先把得到雲上文件的List,本地數據庫文件信息的List。先用兩個for循環,向本地數據庫添加雲上存在而數據庫不在的文件信息。接着再兩個for循環把本地數據庫冗餘文件信息刪除。用了四個for循環,現在想想都可怕。

最近需要優化的時候,纔想到利用map的key值唯一性的特點來解決這個問題。上傳的文件名uploadName(與原文件名不同)是唯一值的,所以可作爲map的key值。

方法是先獲取數據庫文件信息的map集合,再與騰訊雲上的文件List中的uploadName進行key值對比,對比爲空的情況下證明本地數據庫不存在該文件信息,需要進行插入數據庫操作;不爲空則證明存在該信息,map中remove掉改信息,最後map中剩下的則是雲上不存在的冗餘文件信息。map遍歷刪除即可。

//1.添加騰訊雲存儲上有,本地數據庫沒有的記錄進來
// 2.remove掉map(數據庫)和騰訊雲存儲均存在的記錄,最後map剩下的是本地數據庫的冗餘記錄
//獲取數據庫文件信息的map集合
Map<String, OssFileEntity> map = ossFileDao.selectByBucketName(XX, XX);
int count = map.size();
for (COSObjectSummary cos:cosObjectSummaries){
    if (count != 0 && map.get(cos.getKey()) == null){
        insertFile(XX,XX, XX……);//插入數據庫操作
    }else{
        map.remove(cos.getKey());
    }
}
 //3.下一步把冗餘數據從數據庫幹掉(刪掉冗餘數據)
 map.forEach((key, value) -> {
     OssFileEntity ossFileEntity = ossFileDao.selectByUploadFileName(XX, XX);
     ossFileDao.deleteById(ossFileEntity.getId());
 });

最後你會發現只用了一個for循環,還有map的一個遍歷就可以實現同步更新存儲文件信息了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章