

To initialize a custom policy, we need to implement the Expiry interface: cache = Caffeine.newBuilder().expireAfter(new Expiry() long expireAfterCreate( To configure expire-after-write strategy, we use the expireAfterWrite method: cache = Caffeine.newBuilder() Let’s configure the expire-after-access strategy using the expireAfterAccess method: LoadingCache cache = Caffeine.newBuilder() Custom policy - an expiration time is calculated for each entry individually by the Expiry implementation.Expire after write - entry is expired after period is passed since the last write occurs.Expire after access - entry is expired after period is passed since the last read or write occurs.This eviction strategy is based on the expiration time of the entry and has three types: The values are removed from the cache when the weight is over 10: We can also pass a weigher Functionto get the size of the cache: LoadingCache cache = Caffeine.newBuilder() This is because the cache eviction is executed asynchronously, and this method helps to await the completion of the eviction. It is worth mention that we call the cleanUp method before getting the cache size. We can add the second value to the cache, which leads to the removal of the first value: cache.get("B") When we add a value, the size obviously increases: cache.get("A") build(k -> DataObject.get("Data for " + k)) When the cache is initialized, its size is equal to zero: LoadingCache cache = Caffeine.newBuilder() Let’s see how we could count objects in the cache. There are two ways of getting the size - counting objects in the cache, or getting their weights. This type of eviction assumes that eviction occurs when the configured size limit of the cache is exceeded. Sometimes we need to invalidate some cached values manually: This beverage contains no caffeine or coffee. A serving of Grande (16 fl oz) contains 0 mg caffeine, 16 g of fat, 5 g of protein, and 16 g total fat, as well as 52 g of sugar.


That’s why using get is preferable to getIfPresent. So if you’re looking for a coffee-flavored treat that’s sure to please, look no further than the Starbucks Vanilla Bean Frappuccino. This means that the computation will be made only once - even if several threads ask for the value simultaneously. The get method performs the computation atomically. get(key, k -> DataObject.get("Data for A")) ĪssertEquals("Data for A", dataObject.getData()) This function will be used for providing the fallback value if the key is not present in the cache, which would be inserted in the cache after computation: dataObject = cache We can also get the value using the get method, which takes a Function along with a key as an argument. We can populate the cache manually using the put method: cache.put(key, dataObject) This method will return null if the value is not present in the cache: String key = "A" ĭataObject dataObject = cache.getIfPresent(key) Now, we can get some value from the cache using the getIfPresent method.
