前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊claudb的DatabaseCleaner

聊聊claudb的DatabaseCleaner

作者头像
code4it
发布2020-08-24 09:49:27
2590
发布2020-08-24 09:49:27
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下claudb的DatabaseCleaner

DatabaseCleaner

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/data/DatabaseCleaner.java

代码语言:javascript
复制
public class DatabaseCleaner {

  private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseCleaner.class);

  private final DBServerContext server;
  private final DBConfig config;

  private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

  public DatabaseCleaner(DBServerContext server, DBConfig config) {
    this.server = server;
    this.config = config;
  }

  public void start() {
    executor.scheduleWithFixedDelay(this::clean,
        config.getCleanPeriod(), config.getCleanPeriod(), TimeUnit.SECONDS);
  }

  public void stop() {
    executor.shutdown();
  }

  private void clean() {
    LOGGER.debug("cleaning database: running");
    server.clean(Instant.now());
    LOGGER.debug("cleaning database: done");
  }
}
  • DatabaseCleaner的start方法每隔config.getCleanPeriod()(默认30)秒调度执行clean方法;clear方法执行server.clean(Instant.now())

clean

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/ClauDB.java

代码语言:javascript
复制
public class ClauDB extends RespServerContext implements DBServerContext {

    //......

  public void clean(Instant now) {
    executeOn(Observable.create(observable -> {
      getState().evictExpired(now);
      observable.onComplete();
    })).blockingSubscribe();
  }

    //......

}
  • ClauDB的clean方法执行getState().evictExpired(now)

evictExpired

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/DBServerState.java

代码语言:javascript
复制
public class DBServerState {

    //......

  public void evictExpired(Instant now) {
    for (Database database : databases) {
      database.evictableKeys(now).forEach(database::remove);
    }
  }

    //......

}
  • evictExpired方法执行database.evictableKeys(now).forEach(database::remove)

evictableKeys

claudb-1.7.1/src/main/java/com/github/tonivade/claudb/data/Database.java

代码语言:javascript
复制
public interface Database {

  //......

  default ImmutableSet<DatabaseKey> evictableKeys(Instant now) {
    return entrySet()
        .filter(entry -> entry.get2().isExpired(now))
        .map(Tuple2::get1);
  }

  //......

}
  • evictableKeys方法遍历entrySet,找出DatabaseValue的isExpired为true的ImmutableSet

小结

DatabaseCleaner的start方法每隔config.getCleanPeriod()(默认30)秒调度执行clean方法;clear方法执行server.clean(Instant.now())

doc

  • DatabaseCleaner
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • DatabaseCleaner
  • clean
  • evictExpired
  • evictableKeys
  • 小结
  • doc
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档