實習期間做的是存儲服務,存儲文件上傳到騰訊雲的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());
});