Spring Cache Custom Key Generator
From the spring documentation :
- Spring Cache Custom Key Generator 2017
- Spring Cache Custom Key Generator Reviews
- Cacheable Custom Key Generator
- Spring Cache Key Generator
How can I specify @Cachable
to use isbn
and checkWarehouse
Age of empires ii hd edition steam key generator. as key?
Update: Current Spring cache implementation uses all method parameters as the cache key if not specified otherwise. If you want to use selected keys, refer to Arjan’s answer which uses SpEL list {#isbn, #includeUsed}
which is the simplest way to create unique keys.
From Spring Documentation
The default key generation strategy changed with the release of Spring
4.0. Earlier versions of Spring used a key generation strategy that, for multiple key parameters, only considered the hashCode() of
parameters and not equals(); this could cause unexpected key
collisions (see SPR-10237 for background). The new
‘SimpleKeyGenerator’ uses a compound key for such scenarios.
Before Spring 4.0
I suggest you to concat the values of the parameters in Spel expression with something like key='#checkWarehouse.toString() + #isbn.toString()')
, I believe this should work as org.springframework.cache.interceptor.ExpressionEvaluator returns Object, which is later used as the key so you don’t have to provide an int
in your SPEL expression.
Cisco crypto key generate rsa. As for the hash code with a high collision probability – you can’t use it as the key.
Nov 04, 2014 Caching with Spring: Advanced Topics and Best Practices. And @CachePut annotations to be used on the same method @CacheConfig Class-level annotation that allows to share the cache names, the custom KeyGenerator, the custom CacheManager and finally the custom CacheResolver. Does not enable caching. Default Key Generation Strategy. Sep 05, 2019 Just Announced - 'Learn Spring Security OAuth':. Contribute to eugenp/tutorials development by creating an account on GitHub. Just Announced - 'Learn Spring Security OAuth':. Contribute to eugenp/tutorials development by creating an account on GitHub. Cache: Spring cache: custom key generator: May 5, 2018: datetime: BAEL-2292: Oct 22.
Custom Key Generators. But what if you actually want to use the same cache for multiple methods without conflicts? The solution is to define and use a custom cache key generator. In the following example both methods use the same cache (“examplecache”), but also use a custom cache key generator (MethodSpecificKeyGenerator). The cache lookup is based on the method parameters. By default a cache key is generated by a key generator that uses Arrays.deepHashCode(Object) and Arrays.deepEquals(Object, Object) on the method parameters. The cache lookup based on this key is similar to a HashMap lookup.
Someone in this thread has suggested to use T(java.util.Objects).hash(#p0,#p1, #p2)
but it WILL NOT WORK and this approach is easy to break, for example I’ve used the data from SPR-9377 :
Both lines print -636517714 on my environment.
P.S. Actually in the reference documentation we have
Spring Cache Custom Key Generator 2017
I think that this example is WRONG and misleading and should be removed from the documentation, as the keys should be unique.
Spring Cache Custom Key Generator Reviews
P.P.S. also see https://jira.springsource.org/browse/SPR-9036 for some interesting ideas regarding the default key generation.
Cacheable Custom Key Generator
I’d like to add for the sake of correctness and as an entertaining fact that using a secure cryptographic hash function like SHA256, due to the properties of such function IS possible for this task, but to compute it every time may be too expensive.
After some limited testing with Spring 3.2, it seems one can use a SpEL list: {.., .., ..}
. This can also include null
values. Spring passes the list as the key to the actual cache implementation. When using Ehcache, such will at some point invoke List#hashCode(), which takes all its items into account. (I am not sure if Ehcache only relies on the hash code.)
I use this for a shared cache, in which I include the method name in the key as well, which the Spring default key generator does not include. This way I can easily wipe the (single) cache, without (too much…) risking matching keys for different methods. Like:
Of course, if many methods need this and you’re always using all parameters for your key, then one can also define a custom key generator that includes the class and method name:
…with:
You can use a Spring-EL expression, for eg on JDK 1.7:
This will work
Spring Cache Key Generator
@Cacheable(value=”bookCache”, key=”#checkwarehouse.toString().append(#isbn.toString())”)