共计 1996 个字符,预计需要花费 5 分钟才能阅读完成。
序
本文次要钻研一下 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
正文完