Reputation: 447
I am trying to setup L1 + L2 caching strategy to use with @Cacheable
annotation. My objective is
I know this is not supported out of the box, but i have been trying to read the documentation on how to go about wiring up such a solution.
My current solution is to wrap my actual service is a RedisBackedService
which has the redisCacheManager
on the cacheable
annotation which in turn is wrapped in a CaffeineBackedService
which has a caffeineCacheManager
on the cacheable
annotation. Needless to say it seems redundant.
Any pointers would be helpful.
Upvotes: 3
Views: 2770
Reputation: 33121
So to conclude here and provide an answer based on the comments, this is not a feature of the cache abstraction but the SPI of the cache abstraction is simple enough for you to implement something yourself.
public class FallbackCache implements Cache {
private final Cache primaryCache;
private final Cache fallbackCache;
FallbackCache(Cache primaryCache, Cache fallbackCache) { ... }
public ValueWrapper get(Object key) {
ValueWrapper wrapper = primaryCache.get(key);
if (wrapper != null) {
return wrapper;
}
return fallbackCache.get(key);
}
// other methods
}
Some methods like the native cache accessor can be a bit tricky for this use case. I'd return the primary cache and hide the fact that there is a fallback from the caller.
If you know your caches upfront, then you can create them and wrap them in a SimpleCacheManager
. If you need to create them on the fly, the CacheManager
API requires you to implement two simple methods.
Upvotes: 5