17.6.5.13:
Can we implement different types of memcached
as different nodes in the same server, so can there be
deterministic and non-deterministic in the same server?

17.6.5.14:
What are best practices for testing an implementation, to ensure
that it improves performance, and to measure the impact of
memcached configuration changes? And would
you recommend keeping the configuration very simple to start?

17.6.5.2:
What is the maximum size of an object you can store in
memcached? Is that configurable?

The default maximum object size is 1MB. In
memcached 1.4.2 and later, you can change the
maximum size of an object using the -I command
line option.

For versions before this, to increase this size, you have to
re-compile memcached. You can modify the
value of the POWER_BLOCK within the
slabs.c file within the source.

In memcached 1.4.2 and higher, you can
configure the maximum supported object size by using the
-I command-line option. For example, to
increase the maximum object size to 5MB:

$ memcached -I 5m

If an object is larger than the maximum object size, you must
manually split it. memcached is very simple:
you give it a key and some data, it tries to cache it in RAM. If
you try to store more than the default maximum size, the value
is just truncated for speed reasons.

17.6.5.3:
Is it true memcached will be much more
effective with db-read-intensive applications than with
db-write-intensive applications?

Yes. memcached plays no role in database
writes, it is a method of caching data already read from the
database in RAM.

17.6.5.4:
Is there any overhead in not using persistent connections? If
persistent is always recommended, what are the downsides (for
example, locking up)?

If you don't use persistent connections when communicating with
memcached, there will be a small increase in
the latency of opening the connection each time. The effect is
comparable to use nonpersistent connections with MySQL.

In general, the chance of locking or other issues with
persistent connections is minimal, because there is very little
locking within memcached. If there is a
problem, eventually your request will time out and return no
result, so your application will need to load from MySQL again.

17.6.5.5:
How is an event such as a crash of one of the
memcached servers handled by the
memcached client?

There is no automatic handling of this. If your client fails to
get a response from a server, code a fallback mechanism to load
the data from the MySQL database.

The client APIs all provide the ability to add and remove
memcached instances on the fly. If within
your application you notice that memcached
server is no longer responding, you can remove the server from
the list of servers, and keys will automatically be
redistributed to another memcached server in
the list. If retaining the cache content on all your servers is
important, make sure you use an API that supports a consistent
hashing algorithm. For more information, see
Section 16.6.2.4, “memcached Hashing/Distribution Types”.

17.6.5.6:
What is a recommended hardware configuration for a memcached
server?

memcached has a very low processing overhead.
All that is required is spare physical RAM capacity. A
memcached server does not require a dedicated
machine. If you have web, application, or database servers that
have spare RAM capacity, then use them with
memcached.

To build and deploy a dedicated memcached
server, use a relatively low-power CPU, lots of RAM, and one or
more Gigabit Ethernet interfaces.

17.6.5.7:
Is memcached more effective for video and audio as opposed to
textual read/writes?

memcached works equally well for all kinds of
data. To memcached, any value you store is
just a stream of data. Remember, though, that the maximum size
of an object you can store in memcached is
1MB, but can be configured to be larger by using the
-I option in memcached 1.4.2
and later, or by modifying the source in versions before 1.4.2.
If you plan on using memcached with audio and
video content, you will probably want to increase the maximum
object size. Also remember that memcached is
a solution for caching information for reading. It shouldn't be
used for writes, except when updating the information in the
cache.

17.6.5.8:
Can memcached work with ASPX?

There are ports and interfaces for many languages and
environments. ASPX relies on an underlying language such as C#
or VisualBasic, and if you are using ASP.NET then there is a C#
memcached library. For more information, see
https://sourceforge.net/projects/memcacheddotnet/.

17.6.5.9:
How expensive is it to establish a memcache connection? Should
those connections be pooled?

Opening the connection is relatively inexpensive, because there
is no security, authentication or other handshake taking place
before you can start sending requests and getting results. Most
APIs support a persistent connection to a
memcached instance to reduce the latency.
Connection pooling would depend on the API you are using, but if
you are communicating directly over TCP/IP, then connection
pooling would provide some small performance benefit.

17.6.5.10:
How is the data handled when the memcached
server is down?

The behavior is entirely application dependent. Most
applications fall back to loading the data from the database
(just as if they were updating the memcached
information). If you are using multiple
memcached servers, you might also remove a
downed server from the list to prevent it from affecting
performance. Otherwise, the client will still attempt to
communicate with the memcached server that
corresponds to the key you are trying to load.

17.6.5.11:
How are auto-increment columns in the MySQL database coordinated
across multiple instances of memcached?

They aren't. There is no relationship between MySQL and
memcached unless your application (or, if you
are using the MySQL UDFs for memcached, your
database definition) creates one.

If you are storing information based on an auto-increment key
into multiple instances of memcached, the
information is only stored on one of the
memcached instances anyway. The client uses
the key value to determine which memcached
instance to store the information. It doesn't store the same
information across all the instances, as that would be a waste
of cache memory.

17.6.5.12:
Is compression available?

Yes. Most of the client APIs support some sort of compression,
and some even allow you to specify the threshold at which a
value is deemed appropriate for compression during storage.

17.6.5.13:
Can we implement different types of memcached
as different nodes in the same server, so can there be
deterministic and non-deterministic in the same server?

Yes. You can run multiple instances of
memcached on a single server, and in your
client configuration you choose the list of servers you want to
use.

17.6.5.14:
What are best practices for testing an implementation, to ensure
that it improves performance, and to measure the impact of
memcached configuration changes? And would
you recommend keeping the configuration very simple to start?

The best way to test the performance is to start up a
memcached instance. First, modify your
application so that it stores the data just before the data is
about to be used or displayed into memcached.
Since the APIs handle the serialization of the data, it should
just be a one-line modification to your code. Then, modify the
start of the process that would normally load that information
from MySQL with the code that requests the data from
memcached. If the data cannot be loaded from
memcached, default to the MySQL process.

All of the changes required will probably amount to just a few
lines of code. To get the best benefit, make sure you cache
entire objects (for example, all the components of a web page,
blog post, discussion thread, and so on), rather than using
memcached as a simple cache of individual
rows of MySQL tables.

Keeping the configuration simple at the start, or even over the
long term, is easy with memcached. Once you
have the basic structure up and running, often the only ongoing
change is to add more servers into the list of servers used by
your applications. You don't need to manage the
memcached servers, and there is no complex
configuration; just add more servers to the list and let the
client API and the memcached servers make the
decisions.