This page introduces part 4 of our
 series on software caches in Java application servers.
In part 3, we showed how distributed
 caches can be set up using peer-to-peer architectures.
 One of the benefits of peer-to-peer is the low maintenance
 overhead: Caches become part of the peer-to-peer cluster automatically,
 the cluster is self-organizing, peers can join and leave the cluster any
 time without any configuration.
However, data in peer-to-peer clusters is always stored on the peers:
 The application servers become data stores at the same time.
In many cases, it will be more convenient to have dedicated storage instances
 hosting the cached data, and to relieve the application servers from serving
 the cache data. In those cases, client-server architectures should be used.
The following pages show how our example application
 can be implemented with Ehcache, Hazelcast, and Infinispan in client-server mode: