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:
passivevia get(K),activevia 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.