Quarkus cache
Quarkus Cache¶
Eviction, local cache and data partitioning¶
Redisson provides various Quarkus Cache implementations with features below:
local cache - so called near cache
used to speed up read operations and avoid network roundtrips. It caches Map entries on Redisson side and executes read operations up to 45x faster in comparison with common implementation. Local cache instances with the same name connected to the same pub/sub channel. This channel is used for exchanging of update/invalidate events between all instances. Local cache store doesn't use hashCode()
/equals()
methods of key object, instead it uses hash of serialized state.
data partitioning - although Map object is cluster compatible its content isn't scaled/partitioned across multiple Redis or Valkey master nodes in cluster. Data partitioning allows to scale available memory, read/write operations and entry eviction process for individual Map instance in cluster.
1. Scripted eviction
Allows to define time to live
or max idle time
parameters per map entry. Eviction is done on Redisson side through a custom scheduled task which removes expired entries using Lua script. Eviction task is started once per unique object name at the moment of getting Map instance. If instance isn't used and has expired entries it should be get again to start the eviction process. This leads to extra Redis or Valkey calls and eviction task per unique map object name.
Entries are cleaned time to time by org.redisson.eviction.EvictionScheduler
. By default, it removes 100 expired entries at a time. This can be changed through cleanUpKeysAmount setting. Task launch time tuned automatically and depends on expired entries amount deleted in previous time and varies between 5 second to 30 minutes by default. This time interval can be changed through minCleanUpDelay and maxCleanUpDelay. For example, if clean task deletes 100 entries each time it will be executed every 5 seconds (minimum execution delay). But if current expired entries amount is lower than previous one then execution delay will be increased by 1.5 times and decreased otherwise.
Available implementations:
impementation setting value |
Local cache |
Data partitioning |
Ultra-fast read/write |
---|---|---|---|
standard open-source version |
❌ | ❌ | ❌ |
standard Redisson PRO version |
❌ | ❌ | ✔️ |
localcache available only in Redisson PRO |
✔️ | ❌ | ✔️ |
clustered available only in Redisson PRO |
❌ | ✔️ | ✔️ |
clustered_localcache available only in Redisson PRO |
✔️ | ✔️ | ✔️ |
2. Advanced eviction
Allows to define time to live
parameter per map entry. Doesn't use an entry eviction task, entries are cleaned on Redis or Valkey side.
Available implementations:
impementation setting value |
Local cache |
Data partitioning |
Ultra-fast read/write |
---|---|---|---|
v2 available only in Redisson PRO |
❌ | ✔️ | ✔️ |
localcache_v2 available only in Redisson PRO |
✔️ | ✔️ | ✔️ |
3. Native eviction
Allows to define time to live
parameter per map entry. Doesn't use an entry eviction task, entries are cleaned on Redis side.
Requires Redis 7.4+.
Available implementations:
impementation setting value |
Local cache |
Data partitioning |
Ultra-fast read/write |
---|---|---|---|
native open-source version |
❌ | ❌ | ❌ |
native Redisson PRO version |
❌ | ❌ | ✔️ |
localcache_native available only in Redisson PRO |
✔️ | ❌ | ✔️ |
clustered_native available only in Redisson PRO |
❌ | ✔️ | ✔️ |
Usage¶
1. Add redisson-quarkus-cache
dependency into your project
Maven
<dependency>
<groupId>org.redisson</groupId>
<!-- for Quarkus v3.x.x -->
<artifactId>redisson-quarkus-30-cache</artifactId>
<version>3.36.0</version>
</dependency>
Gradle
2. Add settings into application.properties
file
-
Basic settings
expire-after-write
- setting defines time to live of the item stored in the cache. Default value is0
.
expire-after-access
- setting defines time to live added to the item after read operation. Default value is0
.
implementation
- setting defines the type of cache used. Default value isstandard
.Below is the cache configuration example.
quarkus.cache.type=redisson quarkus.cache.redisson.implementation=standard # Default configuration for all caches quarkus.cache.redisson.expire-after-write=5s quarkus.cache.redisson.expire-after-access=1s # Configuration for `sampleCache` cache quarkus.cache.redisson.sampleCache.expire-after-write=100s quarkus.cache.redisson.sampleCache.expire-after-access=10s
-
Local cache settings
quarkus.cache.redisson.[CACHE_NAME].max-size
- max size of this cache. Superfluous elements are evicted using LRU algorithm. If 0 the cache is unbounded. Default value is0
.quarkus.cache.redisson.[CACHE_NAME].cache-size
- local cache size. If size is 0 then local cache is unbounded. Default value is0
.quarkus.cache.redisson.[CACHE_NAME].reconnection-strategy
- used to load missed updates during any connection failures to Redis. Default value isCLEAR
. Since, local cache updates can't be executed in absence of connection to Redis. Available values: *CLEAR
- Clear local cache if map instance has been disconnected for a while. *LOAD
- Store invalidated entry hash in invalidation log for 10 minutes. Cache keys for stored invalidated entry hashes will be removed if LocalCachedMap instance has been disconnected less than 10 minutes or whole cache will be cleaned otherwise. *NONE
- No reconnection handlingredisson.cache.redisson.[CACHE_NAME].sync-strategy
- used to synchronize local cache changes. Default value isINVALIDATE
. Available values: *INVALIDATE
- Invalidate cache entry across all LocalCachedMap instances on map entry change. *UPDATE
- Insert/update cache entry across all LocalCachedMap instances on map entry change. *NONE
- No synchronizations on map changes.redisson.cache.redisson.[CACHE_NAME].eviction-policy
- defines local cache eviction policy. Default value isNONE
. Available values: *LRU
- uses local cache with LRU (least recently used) eviction policy. *LFU
- uses local cache with LFU (least frequently used) eviction policy. *SOFT
- uses local cache with soft references. The garbage collector will evict items from the local cache when the JVM is running out of memory. *WEAK
- uses local cache with weak references. The garbage collector will evict items from the local cache when it became weakly reachable. *NONE
- doesn't use eviction policy, but timeToLive and maxIdleTime params are still working.redisson.cache.redisson.[CACHE_NAME].time-to-live
- time to live duration of each map entry in local cache. If value equals to 0 then timeout is not applied. Default value is0
.redisson.cache.redisson.[CACHE_NAME].max-idle
- defines max idle time duration of each map entry in local cache. If value equals to 0 then timeout is not applied. Default value is0
.redisson.cache.redisson.[CACHE_NAME].store-mode
- defines store mode of cache data. Default value isLOCALCACHE_REDIS
. Available values: *LOCALCACHE
- store data in local cache only and use Redis or Valkey only for data update/invalidation
*LOCALCACHE_REDIS
- store data in both Redis or Valkey and local cacheredisson.cache.redisson.[CACHE_NAME].cache-provider
- defines Cache provider used as local cache store. Default value isREDISSON
. Available values: *REDISSON
- uses Redisson own implementation *CAFFEINE
- uses Caffeine implementationredisson.cache.redisson.[CACHE_NAME].store-cache-miss
- defines whether to store a cache miss into the local cache. Default value isfalse
.
Local cache configuration example:
quarkus.cache.type=redisson
# possible values for localcache: localcache, localcache_v2, clustered_localcache
quarkus.cache.redisson.implementation=localcache
# Default configuration for all caches
quarkus.cache.redisson.expire-after-write=5s
quarkus.cache.redisson.expire-after-access=1s
quarkus.cache.redisson.cache-size=100
quarkus.cache.redisson.eviction-policy=LFU
quarkus.cache.redisson.time-to-live=10s
quarkus.cache.redisson.max-idle=5s
# Configuration for `sampleCache` cache
quarkus.cache.redisson.sampleCache.expire-after-write=100s
quarkus.cache.redisson.sampleCache.expire-after-access=10s
quarkus.cache.redisson.sampleCache.cache-size=100
quarkus.cache.redisson.sampleCache.eviction-policy=LFU
quarkus.cache.redisson.sampleCache.time-to-live=10s
quarkus.cache.redisson.sampleCache.max-idle=5s