SlideShare a Scribd company logo
Caching with Spring: Advanced Topics 
and Best Practices 
© 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. 
Michael Plöd 
@bitboss
I will talk about 
Caching Types / Topologies 
Best Practices for Caching in Enterprise Applications 
Caching with Spring 
JCache and Spring 
I will NOT talk about 
Latency / Synchronization discussion 
What is the best caching product on the market 
HTTP / Database Caching 
Caching in JPA, Hibernate or other ORMs
Cache! 
/ kæʃ /! 
In computing, a cache is a component that transparently stores data so that future requests 
for that data can be served faster. The data that is stored within a cache might be values that 
have been computed earlier or duplicates of original values that are stored elsewhere. If 
requested data is contained in the cache (cache hit), this request can be served by simply 
reading the cache, which is comparatively faster. Otherwise (cache miss), the data has to be 
recomputed or fetched from its original storage location, which is comparatively slower. Hence, 
the greater the number of requests that can be served from the cache, the faster the overall 
system performance becomes. 
Source: http://en.wikipedia.org/wiki/Cache_(computing)
That’s awesome. Let’s cache everything 
and everywhere and distribute it all in 
a Cluster in a transactional manner 
ohhh by the way: Twitter has been 
doing that for ages 
Are you 
crazy?
Business-Applications 
!= 
Twitter / Facebook & co.
Many enterprise grade projects 
are adapting caching too 
defensive or too offensive and are 
running into consistency or 
performance issues because of 
that
But with a well adjusted caching 
strategy you will make your 
application more scalable, faster 
and cheaper to operate.
Local Cache, Data Grid, Document Store, JPA 
First Level Cache, JPA Second Level Cache, 
Types of Places CACHES 
for 
Hybrid Cache 
Database, Heap, HTTP Proxy, Browser, 
Prozessor, Disk, Off Heap, Persistence- 
Framework, Application
We will focus on local and 
distributed caching at the 
application level with the Spring 
Framework
Which data shall I 
cache? 
Which cache shall I use? 
Where shall I cache? 
Which impact does it have on my 
infrastructure 
How about data-consistency 
How do I introduce 
caching? 
How about caching in 
Spring?
Which data shall I 
cache? 
Which cache shall I use? 
Where shall I cache? 
Which impact does it have on my 
infrastructure 
How about data-consistency 
How do I introduce 
caching? 
How about caching in 
Spring?
1 Identify suitable layers for 
caching
ComplaintManagementRestController 
ComplaintManagementBusinessService 
DataAggrgationManager 
Host! 
Commands 
SAP! 
Commands 
Spring Data 
Repository 
HTTP 
Caching 
Read 
Operations 
Read 
Operations 
Read 
Operations 
Read 
Operations 
Read and 
Write 
Operations 
Suitable 
Layers 
for 
Caching
2 Stay local as long as possible
Lokal In-Memory 
JVM 
Cache
Clustered 
JVM 
Cache 
JVM 
Cache 
JVM 
Cache 
JVM 
Cache
Which data shall I 
cache? 
Which cache shall I use? 
Where shall I cache? 
Which impact does it have on my 
infrastructure 
How about data-consistency 
How do I introduce 
caching? 
How about caching in 
Spring?
Clustered - with sync 
JVM 
JVM 
JVM 
JVM 
Cache 
Cache 
Cache 
Cache
Clustered - with sync 
JVM 
JVM 
JVM 
JVM 
Cache 
Cache 
Cache 
Cache 
Invalidation 
Replication
3 Avoid real replication where 
possible
Invalidation - Option 1 
Cache 
Cache 
Cache 
Cache
Invalidation - Option 1 
Cache 
Cache 
Cache 
#1 
Cache 
PUT 
(Insert) 
PUT 
(Insert) #1 
#1 
PUT 
(Insert) 
PUT 
(Insert) #1
Invalidation - Option 1 
Cache 
#1 #1 
Cache 
Cache 
Cache 
#1 #1
Invalidation - Option 1 
Cache 
#1 #1 
Cache 
Cache 
Cache 
PUT 
(Update) #1 #1
Invalidation - Option 1 
Cache 
Cache 
Cache 
Cache 
PUT 
(Update) #1
Invalidation - Option 2 
Cache 
Cache 
Cache 
Cache
Invalidation - Option 2 
Cache 
Cache 
Cache 
Cache 
PUT 
(Insert) #1
Replication 
Cache 
Cache 
Cache 
Cache
Replication 
Cache 
Cache 
Cache 
#1 
Cache 
#1 
#1 #1 
PUT 
(Insert)
Replication 
Cache 
Cache 
Cache 
#1 
Cache 
#1 
#1 #1
Replication 
Cache 
Cache 
Cache 
#1 
Cache 
#1 
#1 #1 
PUT 
(Update)
As of now every cache could 
potentially hold every data which 
consumes heap memory
Big Heap 
?
Which data shall I 
cache? 
Which cache shall I use? 
Where shall I cache? 
Which impact does it have on my 
infrastructure 
How about data-consistency 
How do I introduce 
caching? 
How about caching in 
Spring?
4 Avoid big heaps just for caching
Big heap 
leads to long 
major GCs 
Cache 
Application 
Data 
32 GB
Long GCs can destabilize your 
cluster 
JVM 
Cache 
JVM 
Cache 
JVM 
Cache 
JVM 
Cache
Small caches 
are a bad idea! 
" 
Many evictions, fewer hits, 
no „hot data“. 
This is especially critical for 
replicating caches.
5 Use a distributed cache for 
big amounts of data
Distributed Caches 
JVM 
JVM 
JVM JVM 
Cache Node 
1 
Cache Node 
2 
Cache Node 
3
1 
Customer 
#23 
Customer 
#30 
Customer 
#27 
Customer 
#32
1 2 
Customer 
#23 
Customer 
#30 
Customer 
#27 
Customer 
#32 
BACKUP 
#27 
BACKUP 
#32 
BACKUP 
#23 
BACKUP 
#30 
Data is being 
distributed and 
backed up
1 2 
3 
Customer 
#23 
Customer 
#30 
Customer 
#27 
Customer 
#32 
BACKUP 
#27 
BACKUP 
#32 
BACKUP 
#23 
BACKUP 
#30
1 2 
Customer 
#23 
3 4 
Customer 
#30 
Customer 
#27 
Customer 
#32 
BACKUP 
#27 
BACKUP 
#32 
BACKUP 
#23 
BACKUP 
#30
DEMO 
Hazelcast
A distributed cache leads to 
smaller heaps, more capacity and 
is easy to scale 
Application 
Data 
Cache 
2 - 4 GB 
… Cache
6 The operations specialist is 
your new best friend
Clustered caches are 
complex. Please make 
sure that operations 
and networking are 
involved as early as 
possible.
Which data shall I 
cache? 
Which cache shall I use? 
Where shall I cache? 
Which impact does it have on my 
infrastructure 
How about data-consistency 
How do I introduce 
caching? 
How about caching in 
Spring?
7 Make sure that only suitable 
data gets cached
The best cache candidates are 
read-mostly data, which are 
expensive to obtain
If you urgently must cache write-intensive 
data make sure to use a 
distributed cache and not a 
replicated or invalidating one
Which data shall I 
cache? 
Which cache shall I use? 
Where shall I cache? 
Which impact does it have on my 
infrastructure 
How about data-consistency 
How do I introduce 
caching? 
How about caching in 
Spring?
8 Only use existing cache 
implementations
NEVER 
write your own cache 
implementation 
EVER
Infinispan, EHCache, Hazelcast, Couchbase, 
Memcache, OSCache, SwarmCache, Xtreme 
Cache, Apache DirectMemory 
CACHE 
Implementations 
Terracotta, Coherence, Gemfire, Cacheonix, 
WebSphere eXtreme Scale, Oracle 12c In 
Memory Database
Which data shall I 
cache? 
Which cache shall I use? 
Where shall I cache? 
Which impact does it have on my 
infrastructure 
How about data-consistency 
How do I introduce 
caching? 
How about caching in 
Spring?
9 Introduce Caching in three 
steps
Optimize your 
application 
Local Cache Distributed Cache 
Performance 
Boost 
Performance 
Loss
10 Optimize Serialization
Example: Hazelcast 
putting and getting 10.000 objects locally 
GET Time PUT Time Payload Size 
Serializable ? ? ? 
Data 
Serializable ? ? ? 
Identifier 
Data 
Serializable 
? ? ?
DEMO 
Serialization
Example: Hazelcast 
putting and getting 10.000 objects locally 
GET Time PUT Time Payload Size 
Serializable 1287 ms 1220 ms 1164 byte 
Data 
Serializable 443 ms 408 ms 916 byte 
Identifier 
Data 
Serializable 
264 ms 207 ms 882 byte
JAVA 
SERIALIZATION 
SUCKS for Caching if alternatives are present
11 Use Off-Heap Storage for 
Cache instances with more 
than 4 GB Heap Size
Off Heap 
30 GB RAM 
No Garbage Collection 
JVM 
Cache Runtime 
Cache 
Data 
2 GB HEAP 
Very short Garbage 
Collections
12 Mind the security gap
Application 
Security Security Security 
„CRM“ „Host“ DB 
Cache 
CRM Data 
SAP Data 
DB Data 
? 
Mind security when reading 
data from the cache
I <3 Spring 
" 
Bot 
censored 
I’m at a Spring 
conference 
and this guy is 50 
slides in and hasn’t 
yet mentioned Spring 
even if he advertised
13 Abstract your cache 
provider
Tying your code to a cache provider is bad practice 
public Account retrieveAccount(String accountNumber) 
{! 
Cache cache = ehCacheMgr.getCache(„accounts“);! 
Account account = null;! 
Element element = cache.get(accountNumber);! 
if(element == null) {! 
//execute some business logic for retrieval! 
//account = result of logic above! 
cache.put(new Element(accountNumber, account));! 
} else {! 
account = (Account)element.getObjectValue();! 
}! 
return account;! 
}
Try switching from EHCache to Hazelcast 
public Account retrieveAccount(String accountNumber) 
{! 
Cache cache = ehCacheMgr.getCache(„accounts“);! 
Account account = null;! 
Element element = cache.get(accountNumber);! 
if(element == null) {! 
//execute some business logic for retrieval! 
//account = result of logic above! 
cache.put(new Element(accountNumber, account));! 
} else {! 
account = (Account)element.getObjectValue();! 
}! 
return account;! 
} 
You will 
have to 
adjust these 
lines of code 
to the 
Hazelcast 
API
You can’t switch cache providers between 
environments 
public Account retrieveAccount(String accountNumber) 
{! 
Cache cache = ehCacheMgr.getCache(„accounts“);! 
Account account = null;! 
Element element = cache.get(accountNumber);! 
if(element == null) {! 
//execute some business logic for retrieval! 
//account = result of logic above! 
cache.put(new Element(accountNumber, account));! 
} else {! 
account = (Account)element.getObjectValue();! 
}! 
return account;! 
} 
EHCache is 
tightly 
coupled to 
your code
You mess up your business logic with 
infrastructure 
public Account retrieveAccount(String accountNumber) 
{! 
Cache cache = ehCacheMgr.getCache(„accounts“);! 
Account account = null;! 
Element element = cache.get(accountNumber);! 
if(element == null) {! 
//execute some business logic for retrieval! 
//account = result of logic above! 
cache.put(new Element(accountNumber, account));! 
} else {! 
account = (Account)element.getObjectValue();! 
}! 
return account;! 
} 
This is all 
caching 
related code 
without any 
business 
relevance
Introducing Spring’s cache abstraction 
<cache:annotation-driven cache-manager="ehCacheManager"/>! 
" 
<!-- EH Cache local -->! 
<bean id="ehCacheManager" 
! class="org.springframework.cache.ehcache.EhCacheCacheManager"! 
p:cacheManager-ref="ehcache"/>! 
! ! 
<bean id="ehcache" 
! class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"! 
! p:configLocation="/ehcache.xml"/> 
@Cacheable("Customers")! 
public Customer getCustomer(String customerNumber) {! 
! …! 
}
Spring’s Caching Annotations 
Annotation Description 
@Cacheable Demarcates cachable methods, can read and write to the cache(s) 
@CacheEvict Demarcates methods that perform cache eviction, that is methods that 
act as triggers for removing data from the cache. 
@CachePut Updates the cache with the annotated method’s return value. Will always 
execute the method. 
@Caching Allows multiple nested @Cacheable, @CacheEvict 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 
Annotation Key 
@Cacheable("Customers")! 
public Customer getCustomer(String customerNumber) {! 
! …! 
} 
@Cacheable("CustomerList")! 
public List<Customer> listCustomers(int start, int count) {! 
! …! 
} 
@Cacheable("MonthlyReport")! 
public Report getMonthlyReport() {! 
! …! 
} 
customerNumber 
SimpleKey containing 
start and count 
SimpleKey.EMPTY
public class MyOwnKeyGenerator implements KeyGenerator {! 
@Override! 
public Object generate(Object target, Method method, Object... params) {! 
if (params.length == 0) {! 
return new SimpleKey("EMPTY");! 
}! 
if (params.length == 1) {! 
Object param = params[0];! 
if (param != null && !param.getClass().isArray()) {! 
return param;! 
}! 
}! 
return new SimpleKey(params);! 
}! 
} 
You need a custom default KeyGenerator? 
<cache:annotation-driven cache-manager="hazelcastCacheManager" 
keyGenerator="myOwnKeyGenerator" />
SpEL in Caching Annotations 
Annotation Effect 
@Cacheable("concerts", key="#location.id")! 
public List<Concert> findConcerts(Location location) 
@Cacheable("concerts", 
key="T(someType).hash(#location)")! 
public List<Concert> findConcerts(Location location) 
@Cacheable("concerts", 
condition="#location.city == 'Dallas')", 
unless="#location.outOfBusiness")! 
public List<Concert> findConcerts(Location location) 
Key: id of location 
@CachePut("locations", key="#result.id")! 
public Location saveLocation(Location location) 
Key: hashCode of location 
Conditional Caching if Location 
is in Dallas in operating 
Key: generated id of result
I have multiple Caches 
and Cache Managers! 
@Cacheable("concerts", cacheManager="hazelCastCacheManager")! 
public List<Concert> findConcerts(Location location) 
@Cacheable("bands", cacheManager="gemfireCacheManager"))! 
public List<Band> listBand(int start, int count) 
@Cacheable("bands", cacheResolver="myOwnCacheResolver"))! 
public List<Band> listBand(int start, int count) 
Programmatic resolution through an 
implementation of the CacheResolver Interface 
Manual 
Assignment 
Manual 
Assignment
public class MyOwnCacheResolver extends AbstractCacheResolver {! 
@Autowired 
public MyOwnCacheResolver(CacheManager cacheManager) { 
super(cacheManager); 
} 
protected Collection<String> getCacheNames(CacheOperationInvocationContext<?> context) {! 
return getCacheNames(context.getTarget().getClass());! 
}! 
" 
private getCacheNames(Class<?> businessServiceClass) { 
... 
}! 
} 
Working with CacheResolvers 
@Cacheable("bands", cacheResolver="myOwnCacheResolver"))! 
public List<Band> listBand(int start, int count)
You can use your own custom Annotations 
@Retention(RetentionPolicy.RUNTIME)! 
@Target({ElementType.METHOD})! 
@Cacheable("concerts", key="id")! 
public @interface DefaultConcertCacheable {! 
} 
@DefaultConcertCacheable! 
public Concert getConcert(Long id)
Spring 4.x is the first 
commerically supported 
container with JCache 
(JSR-107) Support! 
That’s years ahead 
of 
any JEE Server
Spring vs JCache Annotations 
Spring JCache Description 
@Cacheable @CacheResult Similar, but @CacheResult can cache Exceptions and force 
method execution 
@CacheEvict @CacheRemove Similar, but @CacheRemove supports eviction in the case of 
Exceptions 
@CacheEvict 
(removeAll=true) @CacheRemoveAll Same rules as for @CacheEvict vs @CacheRemove 
@CachePut @CachePut 
Different semantic: cache content must be annotated with 
@CacheValue. JCache brings Exception caching and caching 
before or after method execution 
@CacheConfig @CachePut Identical
Except for the dependencies 
JCache API and spring-context-support 
no further steps need to 
be taken to enable JCache 
Annotations in Spring 
Applications
? 
Your Cache Provider has no 
integration for Spring or JCache
Code 
Walkthrough 
CacheManager & Cache API
How do I disable 
caching for Unit Tests? 
<bean id="cacheManager" 
class="org.springframework.cache.support.CompositeCacheManager">! 
<property name="cacheManagers">! 
<list>! 
<ref bean="guavaCache"/>! 
<ref bean="ehCache"/>! 
</list>! 
</property>! 
<property name="fallbackToNoOpCache" value="true"/>! 
</bean>
Thank you! 
82 
Michael Plöd - Freelance Consultant 
https://github.com/mploed 
@bitboss 
http://slideshare.net/mploed

More Related Content

What's hot (20)

PPTX
Apache Kafka vs RabbitMQ: Fit For Purpose / Decision Tree
Slim Baltagi
 
PPTX
Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)
Svetlin Nakov
 
PDF
Message Redelivery: An Unexpected Journey - Pulsar Summit SF 2022
StreamNative
 
PPTX
Schema registry
Whiteklay
 
PDF
How Apache Kafka® Works
confluent
 
PDF
Introduction to Spring webflux
Knoldus Inc.
 
PPTX
Spring Security 5
Jesus Perez Franco
 
PPTX
Springboot Microservices
NexThoughts Technologies
 
PPTX
Introduction to Apache Kafka
AIMDek Technologies
 
ODP
OAuth2 - Introduction
Knoldus Inc.
 
PDF
Synchronous Commands over Apache Kafka (Neil Buesing, Object Partners, Inc) K...
confluent
 
PDF
Spring Security
Sumit Gole
 
PDF
Schema Registry 101 with Bill Bejeck | Kafka Summit London 2022
HostedbyConfluent
 
PPTX
Java performance tuning
Mohammed Fazuluddin
 
PDF
KafkaConsumer - Decoupling Consumption and Processing for Better Resource Uti...
confluent
 
PPTX
Introduction to Apache Kafka
Jeff Holoman
 
PDF
Chaos Engineering with Kubernetes - Berlin / Hamburg Chaos Engineering Meetup...
Ana Medina
 
PPTX
Web API authentication and authorization
Chalermpon Areepong
 
PDF
Apache kafka
NexThoughts Technologies
 
PPTX
Java Spring Framework
Mehul Jariwala
 
Apache Kafka vs RabbitMQ: Fit For Purpose / Decision Tree
Slim Baltagi
 
Cryptography for Java Developers: Nakov jProfessionals (Jan 2019)
Svetlin Nakov
 
Message Redelivery: An Unexpected Journey - Pulsar Summit SF 2022
StreamNative
 
Schema registry
Whiteklay
 
How Apache Kafka® Works
confluent
 
Introduction to Spring webflux
Knoldus Inc.
 
Spring Security 5
Jesus Perez Franco
 
Springboot Microservices
NexThoughts Technologies
 
Introduction to Apache Kafka
AIMDek Technologies
 
OAuth2 - Introduction
Knoldus Inc.
 
Synchronous Commands over Apache Kafka (Neil Buesing, Object Partners, Inc) K...
confluent
 
Spring Security
Sumit Gole
 
Schema Registry 101 with Bill Bejeck | Kafka Summit London 2022
HostedbyConfluent
 
Java performance tuning
Mohammed Fazuluddin
 
KafkaConsumer - Decoupling Consumption and Processing for Better Resource Uti...
confluent
 
Introduction to Apache Kafka
Jeff Holoman
 
Chaos Engineering with Kubernetes - Berlin / Hamburg Chaos Engineering Meetup...
Ana Medina
 
Web API authentication and authorization
Chalermpon Areepong
 
Java Spring Framework
Mehul Jariwala
 

Similar to Spring One 2 GX 2014 - CACHING WITH SPRING: ADVANCED TOPICS AND BEST PRACTICES (20)

PPTX
Share point 2013 distributed cache
Michael Nokhamzon
 
PPS
Web20expo Scalable Web Arch
mclee
 
PPS
Web20expo Scalable Web Arch
guest18a0f1
 
PPS
Web20expo Scalable Web Arch
royans
 
PPTX
IMC Summit 2016 Breakout - Per Minoborg - Work with Multiple Hot Terabytes in...
In-Memory Computing Summit
 
ODP
Caching and tuning fun for high scalability @ phpBenelux 2011
Wim Godden
 
PPTX
Jug Lugano - Scale over the limits
Davide Carnevali
 
PPS
Scalable Web Architectures: Common Patterns and Approaches - Web 2.0 Expo NYC
Cal Henderson
 
PPT
Web Speed And Scalability
Jason Ragsdale
 
PDF
JCON World 2023 - Cache, but Cache Wisely.pdf
DevenPhillips
 
PDF
Caching principles-solutions
pmanvi
 
ODP
MNPHP Scalable Architecture 101 - Feb 3 2011
Mike Willbanks
 
PPT
Four Ways to Improve ASP .NET Performance and Scalability
Alachisoft
 
PDF
Application Scalability in Server Farms - NCache
Alachisoft
 
PPS
Scalable Web Architectures - Common Patterns & Approaches
Cal Henderson
 
PPS
Scalable Web Arch
royans
 
PDF
Presto at Tivo, Boston Hadoop Meetup
Justin Borgman
 
PPTX
Mini-Training: To cache or not to cache
Betclic Everest Group Tech Team
 
ODP
Caching and tuning fun for high scalability @ PHPTour
Wim Godden
 
ODP
Caching and tuning fun for high scalability @ FrOSCon 2011
Wim Godden
 
Share point 2013 distributed cache
Michael Nokhamzon
 
Web20expo Scalable Web Arch
mclee
 
Web20expo Scalable Web Arch
guest18a0f1
 
Web20expo Scalable Web Arch
royans
 
IMC Summit 2016 Breakout - Per Minoborg - Work with Multiple Hot Terabytes in...
In-Memory Computing Summit
 
Caching and tuning fun for high scalability @ phpBenelux 2011
Wim Godden
 
Jug Lugano - Scale over the limits
Davide Carnevali
 
Scalable Web Architectures: Common Patterns and Approaches - Web 2.0 Expo NYC
Cal Henderson
 
Web Speed And Scalability
Jason Ragsdale
 
JCON World 2023 - Cache, but Cache Wisely.pdf
DevenPhillips
 
Caching principles-solutions
pmanvi
 
MNPHP Scalable Architecture 101 - Feb 3 2011
Mike Willbanks
 
Four Ways to Improve ASP .NET Performance and Scalability
Alachisoft
 
Application Scalability in Server Farms - NCache
Alachisoft
 
Scalable Web Architectures - Common Patterns & Approaches
Cal Henderson
 
Scalable Web Arch
royans
 
Presto at Tivo, Boston Hadoop Meetup
Justin Borgman
 
Mini-Training: To cache or not to cache
Betclic Everest Group Tech Team
 
Caching and tuning fun for high scalability @ PHPTour
Wim Godden
 
Caching and tuning fun for high scalability @ FrOSCon 2011
Wim Godden
 
Ad

More from Michael Plöd (13)

PDF
Event Sourcing: Einführung und Best Practices
Michael Plöd
 
PDF
Building Microservices with Event Sourcing and CQRS
Michael Plöd
 
PDF
Migrating from Grails 2 to Grails 3
Michael Plöd
 
PDF
Event Sourcing: Introduction & Challenges
Michael Plöd
 
PDF
Caching in Hibernate
Michael Plöd
 
PDF
Anatomie von Microservice Landschaften
Michael Plöd
 
PDF
Event Sourcing für reaktive Anwendungen
Michael Plöd
 
PDF
CQRS basierte Architekturen mit Microservices
Michael Plöd
 
PDF
Caching - Hintergründe, Patterns und Best Practices
Michael Plöd
 
PDF
Warum empfehle ich meinen Kunden das Spring Framework?
Michael Plöd
 
PDF
Hibernate Tuning
Michael Plöd
 
PDF
Bessere Präsentationen
Michael Plöd
 
KEY
Integrating Wicket with Java EE 6
Michael Plöd
 
Event Sourcing: Einführung und Best Practices
Michael Plöd
 
Building Microservices with Event Sourcing and CQRS
Michael Plöd
 
Migrating from Grails 2 to Grails 3
Michael Plöd
 
Event Sourcing: Introduction & Challenges
Michael Plöd
 
Caching in Hibernate
Michael Plöd
 
Anatomie von Microservice Landschaften
Michael Plöd
 
Event Sourcing für reaktive Anwendungen
Michael Plöd
 
CQRS basierte Architekturen mit Microservices
Michael Plöd
 
Caching - Hintergründe, Patterns und Best Practices
Michael Plöd
 
Warum empfehle ich meinen Kunden das Spring Framework?
Michael Plöd
 
Hibernate Tuning
Michael Plöd
 
Bessere Präsentationen
Michael Plöd
 
Integrating Wicket with Java EE 6
Michael Plöd
 
Ad

Recently uploaded (20)

PPTX
ChiSquare Procedure in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PPTX
Tally_Basic_Operations_Presentation.pptx
AditiBansal54083
 
PPTX
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 
PDF
[Solution] Why Choose the VeryPDF DRM Protector Custom-Built Solution for You...
Lingwen1998
 
PDF
AOMEI Partition Assistant Crack 10.8.2 + WinPE Free Downlaod New Version 2025
bashirkhan333g
 
PPTX
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
PDF
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
PPTX
Help for Correlations in IBM SPSS Statistics.pptx
Version 1 Analytics
 
PDF
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
PPTX
In From the Cold: Open Source as Part of Mainstream Software Asset Management
Shane Coughlan
 
PDF
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
PDF
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
PDF
Driver Easy Pro 6.1.1 Crack Licensce key 2025 FREE
utfefguu
 
PDF
Wondershare PDFelement Pro Crack for MacOS New Version Latest 2025
bashirkhan333g
 
PPTX
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 
PPTX
Customise Your Correlation Table in IBM SPSS Statistics.pptx
Version 1 Analytics
 
PPTX
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
PDF
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
PPTX
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
ChiSquare Procedure in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Tally_Basic_Operations_Presentation.pptx
AditiBansal54083
 
Change Common Properties in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 
[Solution] Why Choose the VeryPDF DRM Protector Custom-Built Solution for You...
Lingwen1998
 
AOMEI Partition Assistant Crack 10.8.2 + WinPE Free Downlaod New Version 2025
bashirkhan333g
 
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
Build It, Buy It, or Already Got It? Make Smarter Martech Decisions
bbedford2
 
Help for Correlations in IBM SPSS Statistics.pptx
Version 1 Analytics
 
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
In From the Cold: Open Source as Part of Mainstream Software Asset Management
Shane Coughlan
 
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
Driver Easy Pro 6.1.1 Crack Licensce key 2025 FREE
utfefguu
 
Wondershare PDFelement Pro Crack for MacOS New Version Latest 2025
bashirkhan333g
 
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 
Customise Your Correlation Table in IBM SPSS Statistics.pptx
Version 1 Analytics
 
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 

Spring One 2 GX 2014 - CACHING WITH SPRING: ADVANCED TOPICS AND BEST PRACTICES

  • 1. Caching with Spring: Advanced Topics and Best Practices © 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. Michael Plöd @bitboss
  • 2. I will talk about Caching Types / Topologies Best Practices for Caching in Enterprise Applications Caching with Spring JCache and Spring I will NOT talk about Latency / Synchronization discussion What is the best caching product on the market HTTP / Database Caching Caching in JPA, Hibernate or other ORMs
  • 3. Cache! / kæʃ /! In computing, a cache is a component that transparently stores data so that future requests for that data can be served faster. The data that is stored within a cache might be values that have been computed earlier or duplicates of original values that are stored elsewhere. If requested data is contained in the cache (cache hit), this request can be served by simply reading the cache, which is comparatively faster. Otherwise (cache miss), the data has to be recomputed or fetched from its original storage location, which is comparatively slower. Hence, the greater the number of requests that can be served from the cache, the faster the overall system performance becomes. Source: http://en.wikipedia.org/wiki/Cache_(computing)
  • 4. That’s awesome. Let’s cache everything and everywhere and distribute it all in a Cluster in a transactional manner ohhh by the way: Twitter has been doing that for ages Are you crazy?
  • 6. Many enterprise grade projects are adapting caching too defensive or too offensive and are running into consistency or performance issues because of that
  • 7. But with a well adjusted caching strategy you will make your application more scalable, faster and cheaper to operate.
  • 8. Local Cache, Data Grid, Document Store, JPA First Level Cache, JPA Second Level Cache, Types of Places CACHES for Hybrid Cache Database, Heap, HTTP Proxy, Browser, Prozessor, Disk, Off Heap, Persistence- Framework, Application
  • 9. We will focus on local and distributed caching at the application level with the Spring Framework
  • 10. Which data shall I cache? Which cache shall I use? Where shall I cache? Which impact does it have on my infrastructure How about data-consistency How do I introduce caching? How about caching in Spring?
  • 11. Which data shall I cache? Which cache shall I use? Where shall I cache? Which impact does it have on my infrastructure How about data-consistency How do I introduce caching? How about caching in Spring?
  • 12. 1 Identify suitable layers for caching
  • 13. ComplaintManagementRestController ComplaintManagementBusinessService DataAggrgationManager Host! Commands SAP! Commands Spring Data Repository HTTP Caching Read Operations Read Operations Read Operations Read Operations Read and Write Operations Suitable Layers for Caching
  • 14. 2 Stay local as long as possible
  • 16. Clustered JVM Cache JVM Cache JVM Cache JVM Cache
  • 17. Which data shall I cache? Which cache shall I use? Where shall I cache? Which impact does it have on my infrastructure How about data-consistency How do I introduce caching? How about caching in Spring?
  • 18. Clustered - with sync JVM JVM JVM JVM Cache Cache Cache Cache
  • 19. Clustered - with sync JVM JVM JVM JVM Cache Cache Cache Cache Invalidation Replication
  • 20. 3 Avoid real replication where possible
  • 21. Invalidation - Option 1 Cache Cache Cache Cache
  • 22. Invalidation - Option 1 Cache Cache Cache #1 Cache PUT (Insert) PUT (Insert) #1 #1 PUT (Insert) PUT (Insert) #1
  • 23. Invalidation - Option 1 Cache #1 #1 Cache Cache Cache #1 #1
  • 24. Invalidation - Option 1 Cache #1 #1 Cache Cache Cache PUT (Update) #1 #1
  • 25. Invalidation - Option 1 Cache Cache Cache Cache PUT (Update) #1
  • 26. Invalidation - Option 2 Cache Cache Cache Cache
  • 27. Invalidation - Option 2 Cache Cache Cache Cache PUT (Insert) #1
  • 28. Replication Cache Cache Cache Cache
  • 29. Replication Cache Cache Cache #1 Cache #1 #1 #1 PUT (Insert)
  • 30. Replication Cache Cache Cache #1 Cache #1 #1 #1
  • 31. Replication Cache Cache Cache #1 Cache #1 #1 #1 PUT (Update)
  • 32. As of now every cache could potentially hold every data which consumes heap memory
  • 34. Which data shall I cache? Which cache shall I use? Where shall I cache? Which impact does it have on my infrastructure How about data-consistency How do I introduce caching? How about caching in Spring?
  • 35. 4 Avoid big heaps just for caching
  • 36. Big heap leads to long major GCs Cache Application Data 32 GB
  • 37. Long GCs can destabilize your cluster JVM Cache JVM Cache JVM Cache JVM Cache
  • 38. Small caches are a bad idea! " Many evictions, fewer hits, no „hot data“. This is especially critical for replicating caches.
  • 39. 5 Use a distributed cache for big amounts of data
  • 40. Distributed Caches JVM JVM JVM JVM Cache Node 1 Cache Node 2 Cache Node 3
  • 41. 1 Customer #23 Customer #30 Customer #27 Customer #32
  • 42. 1 2 Customer #23 Customer #30 Customer #27 Customer #32 BACKUP #27 BACKUP #32 BACKUP #23 BACKUP #30 Data is being distributed and backed up
  • 43. 1 2 3 Customer #23 Customer #30 Customer #27 Customer #32 BACKUP #27 BACKUP #32 BACKUP #23 BACKUP #30
  • 44. 1 2 Customer #23 3 4 Customer #30 Customer #27 Customer #32 BACKUP #27 BACKUP #32 BACKUP #23 BACKUP #30
  • 46. A distributed cache leads to smaller heaps, more capacity and is easy to scale Application Data Cache 2 - 4 GB … Cache
  • 47. 6 The operations specialist is your new best friend
  • 48. Clustered caches are complex. Please make sure that operations and networking are involved as early as possible.
  • 49. Which data shall I cache? Which cache shall I use? Where shall I cache? Which impact does it have on my infrastructure How about data-consistency How do I introduce caching? How about caching in Spring?
  • 50. 7 Make sure that only suitable data gets cached
  • 51. The best cache candidates are read-mostly data, which are expensive to obtain
  • 52. If you urgently must cache write-intensive data make sure to use a distributed cache and not a replicated or invalidating one
  • 53. Which data shall I cache? Which cache shall I use? Where shall I cache? Which impact does it have on my infrastructure How about data-consistency How do I introduce caching? How about caching in Spring?
  • 54. 8 Only use existing cache implementations
  • 55. NEVER write your own cache implementation EVER
  • 56. Infinispan, EHCache, Hazelcast, Couchbase, Memcache, OSCache, SwarmCache, Xtreme Cache, Apache DirectMemory CACHE Implementations Terracotta, Coherence, Gemfire, Cacheonix, WebSphere eXtreme Scale, Oracle 12c In Memory Database
  • 57. Which data shall I cache? Which cache shall I use? Where shall I cache? Which impact does it have on my infrastructure How about data-consistency How do I introduce caching? How about caching in Spring?
  • 58. 9 Introduce Caching in three steps
  • 59. Optimize your application Local Cache Distributed Cache Performance Boost Performance Loss
  • 61. Example: Hazelcast putting and getting 10.000 objects locally GET Time PUT Time Payload Size Serializable ? ? ? Data Serializable ? ? ? Identifier Data Serializable ? ? ?
  • 63. Example: Hazelcast putting and getting 10.000 objects locally GET Time PUT Time Payload Size Serializable 1287 ms 1220 ms 1164 byte Data Serializable 443 ms 408 ms 916 byte Identifier Data Serializable 264 ms 207 ms 882 byte
  • 64. JAVA SERIALIZATION SUCKS for Caching if alternatives are present
  • 65. 11 Use Off-Heap Storage for Cache instances with more than 4 GB Heap Size
  • 66. Off Heap 30 GB RAM No Garbage Collection JVM Cache Runtime Cache Data 2 GB HEAP Very short Garbage Collections
  • 67. 12 Mind the security gap
  • 68. Application Security Security Security „CRM“ „Host“ DB Cache CRM Data SAP Data DB Data ? Mind security when reading data from the cache
  • 69. I <3 Spring " Bot censored I’m at a Spring conference and this guy is 50 slides in and hasn’t yet mentioned Spring even if he advertised
  • 70. 13 Abstract your cache provider
  • 71. Tying your code to a cache provider is bad practice public Account retrieveAccount(String accountNumber) {! Cache cache = ehCacheMgr.getCache(„accounts“);! Account account = null;! Element element = cache.get(accountNumber);! if(element == null) {! //execute some business logic for retrieval! //account = result of logic above! cache.put(new Element(accountNumber, account));! } else {! account = (Account)element.getObjectValue();! }! return account;! }
  • 72. Try switching from EHCache to Hazelcast public Account retrieveAccount(String accountNumber) {! Cache cache = ehCacheMgr.getCache(„accounts“);! Account account = null;! Element element = cache.get(accountNumber);! if(element == null) {! //execute some business logic for retrieval! //account = result of logic above! cache.put(new Element(accountNumber, account));! } else {! account = (Account)element.getObjectValue();! }! return account;! } You will have to adjust these lines of code to the Hazelcast API
  • 73. You can’t switch cache providers between environments public Account retrieveAccount(String accountNumber) {! Cache cache = ehCacheMgr.getCache(„accounts“);! Account account = null;! Element element = cache.get(accountNumber);! if(element == null) {! //execute some business logic for retrieval! //account = result of logic above! cache.put(new Element(accountNumber, account));! } else {! account = (Account)element.getObjectValue();! }! return account;! } EHCache is tightly coupled to your code
  • 74. You mess up your business logic with infrastructure public Account retrieveAccount(String accountNumber) {! Cache cache = ehCacheMgr.getCache(„accounts“);! Account account = null;! Element element = cache.get(accountNumber);! if(element == null) {! //execute some business logic for retrieval! //account = result of logic above! cache.put(new Element(accountNumber, account));! } else {! account = (Account)element.getObjectValue();! }! return account;! } This is all caching related code without any business relevance
  • 75. Introducing Spring’s cache abstraction <cache:annotation-driven cache-manager="ehCacheManager"/>! " <!-- EH Cache local -->! <bean id="ehCacheManager" ! class="org.springframework.cache.ehcache.EhCacheCacheManager"! p:cacheManager-ref="ehcache"/>! ! ! <bean id="ehcache" ! class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"! ! p:configLocation="/ehcache.xml"/> @Cacheable("Customers")! public Customer getCustomer(String customerNumber) {! ! …! }
  • 76. Spring’s Caching Annotations Annotation Description @Cacheable Demarcates cachable methods, can read and write to the cache(s) @CacheEvict Demarcates methods that perform cache eviction, that is methods that act as triggers for removing data from the cache. @CachePut Updates the cache with the annotated method’s return value. Will always execute the method. @Caching Allows multiple nested @Cacheable, @CacheEvict 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.
  • 77. Default Key Generation Strategy Annotation Key @Cacheable("Customers")! public Customer getCustomer(String customerNumber) {! ! …! } @Cacheable("CustomerList")! public List<Customer> listCustomers(int start, int count) {! ! …! } @Cacheable("MonthlyReport")! public Report getMonthlyReport() {! ! …! } customerNumber SimpleKey containing start and count SimpleKey.EMPTY
  • 78. public class MyOwnKeyGenerator implements KeyGenerator {! @Override! public Object generate(Object target, Method method, Object... params) {! if (params.length == 0) {! return new SimpleKey("EMPTY");! }! if (params.length == 1) {! Object param = params[0];! if (param != null && !param.getClass().isArray()) {! return param;! }! }! return new SimpleKey(params);! }! } You need a custom default KeyGenerator? <cache:annotation-driven cache-manager="hazelcastCacheManager" keyGenerator="myOwnKeyGenerator" />
  • 79. SpEL in Caching Annotations Annotation Effect @Cacheable("concerts", key="#location.id")! public List<Concert> findConcerts(Location location) @Cacheable("concerts", key="T(someType).hash(#location)")! public List<Concert> findConcerts(Location location) @Cacheable("concerts", condition="#location.city == 'Dallas')", unless="#location.outOfBusiness")! public List<Concert> findConcerts(Location location) Key: id of location @CachePut("locations", key="#result.id")! public Location saveLocation(Location location) Key: hashCode of location Conditional Caching if Location is in Dallas in operating Key: generated id of result
  • 80. I have multiple Caches and Cache Managers! @Cacheable("concerts", cacheManager="hazelCastCacheManager")! public List<Concert> findConcerts(Location location) @Cacheable("bands", cacheManager="gemfireCacheManager"))! public List<Band> listBand(int start, int count) @Cacheable("bands", cacheResolver="myOwnCacheResolver"))! public List<Band> listBand(int start, int count) Programmatic resolution through an implementation of the CacheResolver Interface Manual Assignment Manual Assignment
  • 81. public class MyOwnCacheResolver extends AbstractCacheResolver {! @Autowired public MyOwnCacheResolver(CacheManager cacheManager) { super(cacheManager); } protected Collection<String> getCacheNames(CacheOperationInvocationContext<?> context) {! return getCacheNames(context.getTarget().getClass());! }! " private getCacheNames(Class<?> businessServiceClass) { ... }! } Working with CacheResolvers @Cacheable("bands", cacheResolver="myOwnCacheResolver"))! public List<Band> listBand(int start, int count)
  • 82. You can use your own custom Annotations @Retention(RetentionPolicy.RUNTIME)! @Target({ElementType.METHOD})! @Cacheable("concerts", key="id")! public @interface DefaultConcertCacheable {! } @DefaultConcertCacheable! public Concert getConcert(Long id)
  • 83. Spring 4.x is the first commerically supported container with JCache (JSR-107) Support! That’s years ahead of any JEE Server
  • 84. Spring vs JCache Annotations Spring JCache Description @Cacheable @CacheResult Similar, but @CacheResult can cache Exceptions and force method execution @CacheEvict @CacheRemove Similar, but @CacheRemove supports eviction in the case of Exceptions @CacheEvict (removeAll=true) @CacheRemoveAll Same rules as for @CacheEvict vs @CacheRemove @CachePut @CachePut Different semantic: cache content must be annotated with @CacheValue. JCache brings Exception caching and caching before or after method execution @CacheConfig @CachePut Identical
  • 85. Except for the dependencies JCache API and spring-context-support no further steps need to be taken to enable JCache Annotations in Spring Applications
  • 86. ? Your Cache Provider has no integration for Spring or JCache
  • 88. How do I disable caching for Unit Tests? <bean id="cacheManager" class="org.springframework.cache.support.CompositeCacheManager">! <property name="cacheManagers">! <list>! <ref bean="guavaCache"/>! <ref bean="ehCache"/>! </list>! </property>! <property name="fallbackToNoOpCache" value="true"/>! </bean>
  • 89. Thank you! 82 Michael Plöd - Freelance Consultant https://github.com/mploed @bitboss http://slideshare.net/mploed