本文次要钻研一下claudb的DatabaseCleaner

DatabaseCleaner

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

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

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

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

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