序
本文次要钻研一下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