I's a cache (map) with various ttl of keys based on Redis expire algorithm and ConcurrentHashMap.
The implementation contains two maps:
- keys and values,
- keys and ttl.
And has two cleaning modes:
passive
via get(K),active
via BackgroundCleaner.
The BackgroundCleaner contains a thread pool, which is responsible for cleaning the map.
<dependency>
<groupId>com.github.mchernyakov</groupId>
<artifactId>various-ttl-map</artifactId>
<version>0.0.3</version>
</dependency>
compile group: 'com.github.mchernyakov', name: 'various-ttl-map', version: '0.0.3'
Builder properties:
defaultTtl
- default ttl (seconds),
cleaningPoolSize
- cleaning pool size (default = 1),
numCleaningAttemptsPerSession
- how many attempts cleaner can do in single session,
waterMarkPercent
- percent when the cleaner has to start another session
(basically, it means that we have a lot of expired keys,
see algo),
delayMillis
- interval between cleaning sessions (millis, default = 1000).
VariousTtlMap<String, String> map=VariousTtlMapImpl.Builder.newBuilder()
.setDefaultTtl(2)
.setCleaningPoolSize(2)
.setNumCleaningAttemptsPerSession(250)
.setWaterMarkPercent(10)
.setDelayMillis(100)
.build();
int attempts = 10_000;
Random random = new Random();
for (int i = 0; i < attempts; i++) {
map.put("key_" + random.nextInt(), "val", random.nextInt(5));
}
- size of the cache,
- options for primitive map for ttl (several engines),
- async API,
- jmh tests.