数据库缓存策略

阅读开源项目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 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;

你可能感兴趣的:(数据库缓存策略)