阅读开源项目java-design的个人理解
相关对象:
DbManager:数据库操作 负责磁盘缓存
Cache:LruCache 负责内存缓存
一、write-through 同时写入
将数据同时写入磁盘和内存缓存起来
操作简单,写入速度慢
public static void writeThrough(UserAccount userAccount) {
if (cache.contains(userAccount.getUserId())) {
DbManager.updateDb(userAccount);
} else {
DbManager.writeToDb(userAccount);
}
cache.set(userAccount.getUserId(), userAccount);
}
二、内存优先的回写模式
优先使用内存缓存,内存缓存已满再使用磁盘缓存
写入速度快,但是一但设备发生问题数据没有及时更新到硬盘时,数据会丢失
if (cache.isFull() && !cache.contains(userAccount.getUserId())) {
LOGGER.info("# Cache is FULL! Writing LRU data to DB...");
List<UserAccount> listOfUserAccounts = cache.getCacheDataInListForm();
for (UserAccount userAccount : listOfUserAccounts) {
DbManager.upsertDb(userAccount);
}
cache.clear();
}
cache.set(userAccount.getUserId(), userAccount);
三、磁盘优先写入模式
如果缓存中有改数据,更新磁盘中的数据,移除缓存中的数据,否则直接插入到数据库
直写数据库更加安全,效率低
if (cache.contains(userAccount.getUserId())) {
DbManager.updateDb(userAccount);
cache.invalidate(userAccount.getUserId()); // Cache data has been updated -- remove older
// version from cache.
} else {
DbManager.writeToDb(userAccount);
}
四、read-throught
先从内存中读取,内存没有再读取磁盘
if (cache.contains(userId)) {
LOGGER.info("# Cache Hit!");
return cache.get(userId);
}
LOGGER.info("# Cache Miss!");
UserAccount userAccount = DbManager.readFromDb(userId);
cache.set(userId, userAccount);
return userAccount;