SlideShare a Scribd company logo
Where is my cache?
Architectural patterns for caching
microservices by example
Rafał Leszko
Cloud Software Engineer
Hazelcast
About me
● Cloud Software Engineer at Hazelcast
● Worked at Google and CERN
● Author of the book "Continuous Delivery with
Docker and Jenkins"
● Trainer and conference speaker
● Live in Kraków, Poland
About Hazelcast
● Distributed Company
● Open Source Software
● 140+ Employees
● Products:
○ Hazelcast IMDG
○ Hazelcast Jet
○ Hazelcast Cloud
@Hazelcast
www.hazelcast.com
● Introduction
● Caching Architectural Patterns
○ Embedded
○ Embedded Distributed
○ Client-Server
○ Cloud
○ Sidecar
○ Reverse Proxy
○ Reverse Proxy Sidecar
● Summary
Agenda
Why Caching?
● Performance
○ Decrease latency
○ Reduce load
● Resilience
○ High availability
○ Lower downtime
Service 1
Service 2 v1
Service 2 v2
Service 1
Service 4 v1
Service 4 v2
Service 4 v3
Ruby
Microservice World
Service 1
Service 2 v1
Service 2 v2
Service 1
Service 4 v1
Service 4 v2
Service 4 v3
Ruby
Microservice World
cache
cache
cache
cache
Service 1
Service 2 v1
Service 2 v2
Service 1
Service 4 v1
Service 4 v2
Service 4 v3
Ruby
Microservice World
cache
cache
cache
Service 1
Service 2 v1
Service 2 v2
Service 1
Service 4 v1
Service 4 v2
Service 4 v3
Ruby
Microservice World
cache
cache
cache
● Introduction ✔
● Caching Architectural Patterns
○ Embedded
○ Embedded Distributed
○ Client-Server
○ Cloud
○ Sidecar
○ Reverse Proxy
○ Reverse Proxy Sidecar
● Summary
Agenda
1. Embedded
Application
Load Balancer
Cache
Application
Cache
Request
Embedded Cache
private ConcurrentHashMap<String, String> cache =
new ConcurrentHashMap<>();
private String processRequest(String request) {
if (cache.contains(request)) {
return cache.get(request);
}
String response = process(request);
cache.put(request, response);
return response;
}
Embedded Cache (Pure Java implementation)
private ConcurrentHashMap<String, String> cache =
new ConcurrentHashMap<>();
private String processRequest(String request) {
if (cache.contains(request)) {
return cache.get(request);
}
String response = process(request);
cache.put(request, response);
return response;
}
Embedded Cache (Pure Java implementation)
● No Eviction Policies
● No Max Size Limit
(OutOfMemoryError)
● No Statistics
● No built-in Cache Loaders
● No Expiration Time
● No Notification Mechanism
Java Collection is not a Cache!
CacheBuilder.newBuilder()
.initialCapacity(300)
.expireAfterAccess(Duration.ofMinutes(10))
.maximumSize(1000)
.build();
Embedded Cache (Java libraries)
Embedded Cache (Java libraries)
CacheBuilder.newBuilder()
.initialCapacity(300)
.expireAfterAccess(Duration.ofMinutes(10))
.maximumSize(1000)
.build();
Caching Application Layer
@Service
public class BookService {
@Cacheable("books")
public String getBookNameByIsbn(String isbn) {
return findBookInSlowSource(isbn);
}
}
Caching Application Layer
@Service
public class BookService {
@Cacheable("books")
public String getBookNameByIsbn(String isbn) {
return findBookInSlowSource(isbn);
}
}
Be Careful, Spring uses ConcurrentHashMap by default!
Application
Load Balancer
Cache
Application
Cache
Request
Embedded Cache
1*. Embedded Distributed
Application
Application
Load Balancer
Cache
Cache
Request
Hazelcast
Cluster
Embedded Distributed Cache
@Configuration
public class HazelcastConfiguration {
@Bean
CacheManager cacheManager() {
return new HazelcastCacheManager(
Hazelcast.newHazelcastInstance());
}
}
Embedded Distributed Cache (Spring with Hazelcast)
DEMO
Hazelcast Discovery Plugins
Hazelcast Discovery Plugins
Hazelcast Discovery Plugins
Application
Application
Load Balancer
Cache
Cache
Request
Embedded Distributed Cache
Hazelcast
Cluster
Embedded Cache
Pros Cons
● Simple configuration /
deployment
● Low-latency data access
● No separate Ops Team needed
● Not flexible management (scaling,
backup)
● Limited to JVM-based
applications
● Data collocated with applications
● Introduction ✔
● Caching Architectural Patterns
○ Embedded ✔
○ Embedded Distributed ✔
○ Client-Server
○ Cloud
○ Sidecar
○ Reverse Proxy
○ Reverse Proxy Sidecar
● Summary
Agenda
2. Client-Server
Application
Load Balancer
Application
Request
Cache Server
Client-Server Cache
Application
Load Balancer
Application
Request
Cache Server
Client-Server Cache
Application
Load Balancer
Application
Request
Cache Server
Client-Server Cache
Separate Management:
● backups
● (auto) scaling
● security
Ops Team
Application
Load Balancer
Application
Request
Cache Server
Client-Server Cache
Application
Load Balancer
Application
Request
Cache Server
Client-Server Cache
Client-Server Cache
Client-Server Cache
Client-Server Cache
$ ./start.sh
Starting Hazelcast Cache Server (standalone)
Client-Server Cache
Starting Hazelcast Cache Server (Kubernetes)
$ helm install hazelcast/hazelcast
Client-Server Cache
Hazelcast Client (Kubernetes):
@Configuration
public class HazelcastClientConfiguration {
@Bean
CacheManager cacheManager() {
ClientConfig clientConfig = new ClientConfig();
clientConfig.getNetworkConfig().getKubernetesConfig()
.setEnabled(true);
return new HazelcastCacheManager(HazelcastClient
.newHazelcastClient(clientConfig));
}
}
Starting Hazelcast Cache Server (Kubernetes)
$ helm install hazelcast/hazelcast
Application
Load Balancer
Application
Request
Cache Server
Client-Server Cache
Ops Team
Separate Management:
● backups
● (auto) scaling
● security
2*. Cloud
Application
Load Balancer
Application
Request
Cloud (Cache as a Service)
Application
Load Balancer
Application
Request
Cloud (Cache as a Service)
Management:
● backups
● (auto) scaling
● security
Ops Team
Application
Load Balancer
Application
Request
Cloud (Cache as a Service)
Management:
● backups
● (auto) scaling
● security
Ops Team
Application
Load Balancer
Application
Request
Cloud (Cache as a Service)
@Configuration
public class HazelcastCloudConfiguration {
@Bean
CacheManager cacheManager() {
ClientConfig clientConfig = new ClientConfig();
clientConfig.getNetworkConfig().getCloudConfig()
.setEnabled(true)
.setDiscoveryToken("KSXFDTi5HXPJGR0wRAjLgKe45tvEEhd");
clientConfig.setGroupConfig(
new GroupConfig("test-cluster", "b2f984b5dd3314"));
return new HazelcastCacheManager(
HazelcastClient.newHazelcastClient(clientConfig));
}
}
Cloud (Cache as a Service)
DEMO
cloud.hazelcast.com
Client-Server (Cloud) Cache
Pros
● Data separate from applications
● Separate management (scaling,
backup)
● Programming-language agnostic
Cons
● Separate Ops effort
● Higher latency
● Server network requires
adjustment (same region, same
VPC)
● Introduction ✔
● Caching Architectural Patterns
○ Embedded ✔
○ Embedded Distributed ✔
○ Client-Server ✔
○ Cloud ✔
○ Sidecar
○ Reverse Proxy
○ Reverse Proxy Sidecar
● Summary
Agenda
3. Sidecar
Kubernetes Service
(Load Balancer)
Request
Kubernetes POD
Application Container
Cache Container
Application Container
Cache Container
Kubernetes POD
Sidecar Cache
Hazelcast
Cluster
Sidecar Cache
Similar to Embedded:
● the same physical machine
● the same resource pool
● scales up and down together
● no discovery needed (always localhost)
Similar to Client-Server:
● different programming language
● uses cache client to connect
● clear isolation between app and cache
@Configuration
public class HazelcastSidecarConfiguration {
@Bean
CacheManager cacheManager() {
ClientConfig clientConfig = new ClientConfig();
clientConfig.getNetworkConfig()
.addAddress("localhost:5701");
return new HazelcastCacheManager(HazelcastClient
.newHazelcastClient(clientConfig));
}
}
Sidecar Cache
Sidecar Cache
apiVersion: apps/v1
kind: Deployment
...
spec:
template:
spec:
containers:
- name: application
image: leszko/application
- name: hazelcast
image: hazelcast/hazelcast
Sidecar Cache
Pros Cons
● Simple configuration
● Programming-language agnostic
● Low latency
● Some isolation of data and
applications
● Limited to container-based
environments
● Not flexible management (scaling,
backup)
● Data collocated with application
PODs
● Introduction ✔
● Caching Architectural Patterns
○ Embedded ✔
○ Embedded Distributed ✔
○ Client-Server ✔
○ Cloud ✔
○ Sidecar ✔
○ Reverse Proxy
○ Reverse Proxy Sidecar
● Summary
Agenda
4. Reverse Proxy
Application
Load Balancer Cache
Application
Request
Reverse Proxy Cache
Reverse Proxy Cache
http {
...
proxy_cache_path /data/nginx/cache
keys_zone=one:10m;
...
}
● Only for HTTP
● Not distributed
● No High Availability
● Data stored on the disk
NGINX Reverse Proxy Cache Issues
NGINX Reverse Proxy Cache Issues
● Only for HTTP
● Not distributed
● No High Availability
● Data stored on the disk
4*. Reverse Proxy Sidecar
Kubernetes Service
(Load Balancer)
Request
Kubernetes POD
Application Container
Reverse Proxy Cache
Container
Application Container
Reverse Proxy Cache
Container
Kubernetes POD
Reverse Proxy Sidecar Cache
Hazelcast
Cluster
Where is my cache architectural patterns for caching microservices by example
Good
Reverse Proxy Sidecar Cache
Service 1
Service 2 v1
Service 2 v2
Service 1
Service 4 v1
Service 4 v2
Service 4 v3
Ruby
Reverse Proxy Sidecar Cache
Service 1
Service 2 v1
Service 2 v2
Service 1
Service 4 v1
Service 4 v2
Service 4 v3
Ruby
Reverse Proxy Sidecar Cache
apiVersion: apps/v1
kind: Deployment
...
spec:
template:
spec:
initContainers:
- name: init-networking
image: leszko/init-networking
containers:
- name: caching-proxy
image: leszko/caching-proxy
- name: application
image: leszko/application
Reverse Proxy Cache
Container
Application
Container
eth0
:80
Reverse Proxy Sidecar Cache
:80
Pod
:8000
lo
:80
Reverse Proxy Sidecar Cache
#!/bin/bash
# Forward TCP traffic on port 80 to port 8000 on the eth0 interface.
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j REDIRECT --to-port 8000
Reverse Proxy Sidecar Cache
Service 1
Service 2 v1
Service 2 v2
Service 1
Service 4 v1
Service 4 v2
Service 4 v3
Ruby
Where is my cache architectural patterns for caching microservices by example
Reverse Proxy Sidecar Cache (Istio)
Bad
Where is my cache architectural patterns for caching microservices by example
Reverse Proxy Cache
@CacheEvict(value = "someValue", allEntries = true)
public void evictAllCacheValues() {}
Application Cache:
Reverse Proxy Cache
@CacheEvict(value = "someValue", allEntries = true)
public void evictAllCacheValues() {}
Application Cache:
Proxy Cache:
http {
...
location / {
add_header Cache-Control public;
expires 86400;
etag on;
}
}
Reverse Proxy (Sidecar) Cache
Pros Cons
● Configuration-based (no need to
change applications)
● Programming-language agnostic
● Consistent with containers and
microservice world
● Difficult cache invalidation
● No mature solutions yet
● Protocol-based (e.g. works only
with HTTP)
● Introduction ✔
● Caching Architectural Patterns
○ Embedded ✔
○ Embedded Distributed ✔
○ Client-Server ✔
○ Cloud ✔
○ Sidecar ✔
○ Reverse Proxy ✔
○ Reverse Proxy Sidecar ✔
● Summary
Agenda
Summary
application-aware?
application-aware?
containers?
no
application-aware?
containers?
Reverse Proxy
no
no
application-aware?
containers?
Reverse ProxyReverse Proxy Sidecar
no
yes no
application-aware?
containers?
Reverse ProxyReverse Proxy Sidecar
lot of data?
security restrictions?
yes no
yes no
application-aware?
containers?
Reverse ProxyReverse Proxy Sidecar
lot of data?
security restrictions?
language-agnostic?
containers?
yes no
yes nono
application-aware?
containers?
Reverse ProxyReverse Proxy Sidecar
lot of data?
security restrictions?
language-agnostic?
containers?
Embedded
(Distributed)
yes no
yes no
no
no
application-aware?
containers?
Reverse ProxyReverse Proxy Sidecar
lot of data?
security restrictions?
language-agnostic?
containers?
Embedded
(Distributed)
Sidecar
yes no
yes
yes no
no
no
application-aware?
containers?
Reverse ProxyReverse Proxy Sidecar
lot of data?
security restrictions?
language-agnostic?
containers?
Embedded
(Distributed)
Sidecar
cloud?
yes no
yes
yes
yes no
no
no
application-aware?
containers?
Reverse ProxyReverse Proxy Sidecar
lot of data?
security restrictions?
language-agnostic?
containers?
Embedded
(Distributed)
Sidecar
cloud?
Client-Server
yes no
yes
yes
yes no
nono
no
application-aware?
containers?
Reverse ProxyReverse Proxy Sidecar
lot of data?
security restrictions?
language-agnostic?
containers?
Embedded
(Distributed)
Sidecar
cloud?
Client-ServerCloud
yes no
yes
yes yes
yes no
nono
no
Resources
● Hazelcast Sidecar Container Pattern:
https://hazelcast.com/blog/hazelcast-sidecar-container-pattern/
● Hazelcast Reverse Proxy Sidecar Caching Prototype:
https://github.com/leszko/caching-injector
● Caching Best Practices: https://vladmihalcea.com/caching-best-practices/
● NGINX HTTP Reverse Proxy Caching:
https://www.nginx.com/resources/videos/best-practices-for-caching/
Thank You!
Rafał Leszko
@RafalLeszko

More Related Content

PPTX
NGINX High-performance Caching
PDF
High Availability Content Caching with NGINX
PDF
Nginx: Accelerate Rails, HTTP Tricks
PDF
ITB2017 - Nginx Effective High Availability Content Caching
PDF
NGINX: The Past, Present and Future of the Modern Web
PPTX
Distributed Caching in Kubernetes with Hazelcast
PDF
Using NGINX as an Effective and Highly Available Content Cache
PPTX
Reverse proxy & web cache with NGINX, HAProxy and Varnish
NGINX High-performance Caching
High Availability Content Caching with NGINX
Nginx: Accelerate Rails, HTTP Tricks
ITB2017 - Nginx Effective High Availability Content Caching
NGINX: The Past, Present and Future of the Modern Web
Distributed Caching in Kubernetes with Hazelcast
Using NGINX as an Effective and Highly Available Content Cache
Reverse proxy & web cache with NGINX, HAProxy and Varnish

What's hot (20)

PDF
Hazelcast
PDF
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
PDF
Clug 2012 March web server optimisation
PDF
Nova: Openstack Compute-as-a-service
PDF
Ceph scale testing with 10 Billion Objects
PDF
2020-02-20 - HashiTalks 2020 - HashiCorp Vault configuration as code via Hash...
PDF
OpenCensus with Prometheus and Kubernetes
PDF
RBD: What will the future bring? - Jason Dillaman
PPTX
Securing MongoDB to Serve an AWS-Based, Multi-Tenant, Security-Fanatic SaaS A...
ODP
OpenStack Nova Scheduler
PDF
Swami osi bangalore2017days pike release_updates
PPTX
Webinar: Architecting Secure and Compliant Applications with MongoDB
PDF
MongoDB World 2016: From the Polls to the Trolls: Seeing What the World Think...
PDF
Kafka Summit SF 2017 - Infrastructure for Streaming Applications
PDF
Managing your Black Friday Logs
PPTX
MongoDB - External Authentication
PDF
Hands On Gluster with Jeff Darcy
PPTX
MongoDB - Sharded Cluster Tutorial
PPTX
Storing Cassandra Metrics (Chris Lohfink, DataStax) | C* Summit 2016
POTX
Putting the Go in MongoDB: How We Rebuilt The MongoDB Tools in Go
Hazelcast
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Clug 2012 March web server optimisation
Nova: Openstack Compute-as-a-service
Ceph scale testing with 10 Billion Objects
2020-02-20 - HashiTalks 2020 - HashiCorp Vault configuration as code via Hash...
OpenCensus with Prometheus and Kubernetes
RBD: What will the future bring? - Jason Dillaman
Securing MongoDB to Serve an AWS-Based, Multi-Tenant, Security-Fanatic SaaS A...
OpenStack Nova Scheduler
Swami osi bangalore2017days pike release_updates
Webinar: Architecting Secure and Compliant Applications with MongoDB
MongoDB World 2016: From the Polls to the Trolls: Seeing What the World Think...
Kafka Summit SF 2017 - Infrastructure for Streaming Applications
Managing your Black Friday Logs
MongoDB - External Authentication
Hands On Gluster with Jeff Darcy
MongoDB - Sharded Cluster Tutorial
Storing Cassandra Metrics (Chris Lohfink, DataStax) | C* Summit 2016
Putting the Go in MongoDB: How We Rebuilt The MongoDB Tools in Go
Ad

Similar to Where is my cache architectural patterns for caching microservices by example (20)

PDF
Architectural patterns for caching microservices
PDF
Where is my cache architectural patterns for caching microservices by example
PDF
[DevopsDays India 2019] Where is my cache? Architectural patterns for caching...
PDF
[jLove 2020] Where is my cache architectural patterns for caching microservi...
PDF
Where is my cache architectural patterns for caching microservices by example
PDF
Where is my cache? Architectural patterns for caching microservices by example
PDF
Architectural caching patterns for kubernetes
PDF
Where is my cache? Architectural patterns for caching microservices by example
PDF
Where is my cache? Architectural patterns for caching microservices by example
PDF
Architectural caching patterns for kubernetes
PDF
Architectural patterns for high performance microservices in kubernetes
PPTX
Docker & ECS: Secure Nearline Execution
PPTX
High Availability Content Caching with NGINX
ODP
Guaranteeing CloudStack Storage Performance
PPTX
Scale Your Data Tier with Windows Server AppFabric
PPTX
More Cache for Less Cash (DevLink 2014)
PDF
What’s new in cas 4.2
PPTX
OWASP ZAP Workshop for QA Testers
PPTX
Nytro-XV_NWD_VM_Performance_Acceleration
PPTX
CloudStack Meetup London - Primary Storage Presentation by SolidFire
Architectural patterns for caching microservices
Where is my cache architectural patterns for caching microservices by example
[DevopsDays India 2019] Where is my cache? Architectural patterns for caching...
[jLove 2020] Where is my cache architectural patterns for caching microservi...
Where is my cache architectural patterns for caching microservices by example
Where is my cache? Architectural patterns for caching microservices by example
Architectural caching patterns for kubernetes
Where is my cache? Architectural patterns for caching microservices by example
Where is my cache? Architectural patterns for caching microservices by example
Architectural caching patterns for kubernetes
Architectural patterns for high performance microservices in kubernetes
Docker & ECS: Secure Nearline Execution
High Availability Content Caching with NGINX
Guaranteeing CloudStack Storage Performance
Scale Your Data Tier with Windows Server AppFabric
More Cache for Less Cash (DevLink 2014)
What’s new in cas 4.2
OWASP ZAP Workshop for QA Testers
Nytro-XV_NWD_VM_Performance_Acceleration
CloudStack Meetup London - Primary Storage Presentation by SolidFire
Ad

More from Rafał Leszko (15)

PDF
Build Your Kubernetes Operator with the Right Tool!
PDF
Mutation Testing with PIT
PDF
Distributed Locking in Kubernetes
PDF
Mutation testing with PIT
PDF
Build your operator with the right tool
PDF
5 levels of high availability from multi instance to hybrid cloud
PDF
5 Levels of High Availability: From Multi-instance to Hybrid Cloud
PDF
Stream Processing in the Cloud - Athens Kubernetes Meetup 16.07.2019
PDF
Stream Processing with Hazelcast Jet - Voxxed Days Thessaloniki 19.11.2018
PDF
Mutation Testing - Voxxed Days Cluj-Napoca 2017
PDF
Continuous Delivery - Voxxed Days Cluj-Napoca 2017
PDF
Continuous Delivery - Voxxed Days Bucharest 2017
PDF
Mutation Testing - Voxxed Days Bucharest 10.03.2017
PDF
Continuous Delivery - Devoxx Morocco 2016
PDF
Continuous Delivery - Voxxed Days Thessaloniki 21.10.2016
Build Your Kubernetes Operator with the Right Tool!
Mutation Testing with PIT
Distributed Locking in Kubernetes
Mutation testing with PIT
Build your operator with the right tool
5 levels of high availability from multi instance to hybrid cloud
5 Levels of High Availability: From Multi-instance to Hybrid Cloud
Stream Processing in the Cloud - Athens Kubernetes Meetup 16.07.2019
Stream Processing with Hazelcast Jet - Voxxed Days Thessaloniki 19.11.2018
Mutation Testing - Voxxed Days Cluj-Napoca 2017
Continuous Delivery - Voxxed Days Cluj-Napoca 2017
Continuous Delivery - Voxxed Days Bucharest 2017
Mutation Testing - Voxxed Days Bucharest 10.03.2017
Continuous Delivery - Devoxx Morocco 2016
Continuous Delivery - Voxxed Days Thessaloniki 21.10.2016

Recently uploaded (20)

PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Understanding Forklifts - TECH EHS Solution
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
System and Network Administraation Chapter 3
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PPTX
history of c programming in notes for students .pptx
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
System and Network Administration Chapter 2
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Understanding Forklifts - TECH EHS Solution
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PTS Company Brochure 2025 (1).pdf.......
How to Choose the Right IT Partner for Your Business in Malaysia
Navsoft: AI-Powered Business Solutions & Custom Software Development
System and Network Administraation Chapter 3
Adobe Illustrator 28.6 Crack My Vision of Vector Design
history of c programming in notes for students .pptx
Odoo Companies in India – Driving Business Transformation.pdf
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Which alternative to Crystal Reports is best for small or large businesses.pdf
wealthsignaloriginal-com-DS-text-... (1).pdf
Design an Analysis of Algorithms II-SECS-1021-03
System and Network Administration Chapter 2

Where is my cache architectural patterns for caching microservices by example