You are on page 1of 47

Caching with

Memcached & APC


Ben Ramsey
TEKX May 21, 2010

Hi, Im Ben.
benramsey.com
@ramsey
joind.in/1599

What is a cache?

A cache is a collection of data


duplicating original values stored
elsewhere or computed earlier, where
the original data is expensive to fetch
(owing to longer access time) or to
compute, compared to the cost of
reading the cache.
Wikipedia

A cache is a temporary storage area


where frequently accessed data can
be stored for rapid access.

Why use a cache?

To reduce the number or retrieval queries


made to a database

To reduce the number of requests made


to external services

To reduce the time spent computing data


To reduce filesystem access

Types of caches

File system
Database
Shared memory
RAM disk
Object cache (memcached and APC)
Opcode cache (APC)

Memcached

What is memcached?

Distributed memory object caching


Acts as a simple key/value dictionary
Runs as a daemon
Has a simple protocol for client access
over TCP and UDP

Can be run in a pool, but individual

daemons are not aware of the pool

Clients/applications manage the pool


Not an opcode cache

Who uses memcached?

Facebook
Digg
Youtube
Wikipedia
Us (Moontoast)
Many others...

Memcached principles

Fast asynchronous network I/O


Not a persistent data store
It does not provide redundancy
Data is not replicated across the cluster
It doesnt handle failover

Memcached principles

Daemons are not aware of each other


It does not provide authentication
Works great on a small and local-area
network

A single value cannot contain more than


1MB of data

Keys are strings limited to 250 characters

Basic concepts and usage


1. Set up a pool of memcached servers
2. Assign values to keys that are stored in
the cluster
3. The client hashes the key to a particular
machine in the cluster
4. Subsequent requests for that key retrieve
the value from the memcached server on
which it was stored
5. Values time out after the specified TTL

memcached

www
www
memcached

memcached

www

memcached

www
www
memcached

memcached

www

A very simple protocol

Storage commands:

set, add, replace, append, prepend, cas

Retrieval command: get, gets


Deletion command: delete
Increment/decrement: incr, decr
Other commands:

stats, flush_all, version, verbosity,


quit

$> telnet localhost 11211


Trying ::1...
Connected to localhost.
Escape character is '^]'.
set foobar 0 0 15
This is a test.
STORED
get foobar
VALUE foobar 0 15
This is a test.
END
quit
Connection closed by foreign host.
$>

Lets see that with


some code.

$memcache = new Memcached();


$memcache->addServers(array(
array('10.35.24.1', '11211'),
array('10.35.24.2', '11211'),
array('10.35.24.3', '11211'),
));

$book = $memcache->get('0764596349');
if ($book === false)
{
if ($memcache->getResultCode()
== Memcached::RES_NOTFOUND)
{
$book = Book::getByIsbn('0764596349');
$memcache->set($book->getCacheKey(), $book);
}
}

Memcached limits

Key size has a 250 byte limit


Value can not be larger than 1 MB
Memory limits for 32bit/64bit systems
Replication not built-in; dependent on the
client

pecl/memcached

pecl/memcached basics

PHP extension based on the

libmemcached C client library

Andrei Zmievski authored the extension


Now at a stable version 1.0.2
http://php.net/memcached

Settings and configuration

Memcached::OPT_COMPRESSION
Memcached::OPT_DISTRIBUTION
Memcached::OPT_LIBKETAMA_COMPATIBLE
Memcached::OPT_BINARY_PROTOCOL
Memcached::OPT_NO_BLOCK

Memcached methods

add()
addServer()
append()
cas()
decrement()
delete()
get()
getMulti()
getResultCode()

getResultMessage()
getServerList()
getStats()
increment()
prepend()
replace()
set()
setMulti()
... and more!

Alternative PHP
Cache (APC)

apc

www
www
apc

apc

www

What is APC?

Opcode cache
Provides object caching (also referred to
in places as APC user variables)

Gives information about file upload


progress

Stores to local, shared memory


Not distributed
http://php.net/apc

Basic concepts and usage

For opcode caching, just install the

extension and turn it on: apc.enabled=1

For memory allocation, change

apc.shm_size; by default, its 30 MB

To speed things up even more, turn off


apc.stat (set to 0)

Set and forget but it also does object


storage

Settings and configuration

apc.shm_size Determines how much

apc.stat Determines whether APC will

apc.ttl Leaving at zero means APC

memory is allocated to APC


check if a file has been modified on every
request
could potentially fill up with stale entries
while newer ones wont be cached; if
greater than zero, APC will attempt to
remove expired entries

How does opcode


caching work?

example.com/

APC

index.php

public/index.php
library/Zend/Application.php
library/Zend/Loader/Autoloader.php
library/Zend/Loader.php
library/Zend/Config/Ini.php
library/Zend/Config.php
application/Bootstrap.php
library/Zend/Application/Bootstrap/Bootstrap.php
library/Zend/Application/Bootstrap/BootstrapAbstract.php
library/Zend/Application/Bootstrap/Bootstrapper.php
library/Zend/Application/Bootstrap/
ResourceBootstrapper.php
library/Zend/Application/Module/Autoloader.php
library/Zend/Loader/Autoloader/Resource.php
library/Zend/Loader/Autoloader/Interface.php
library/Zend/Loader/PluginLoader.php
... 48 more files ...

example.com/

APC

index.php

public/index.php
library/Zend/Application.php
library/Zend/Loader/Autoloader.php
library/Zend/Loader.php
library/Zend/Config/Ini.php
library/Zend/Config.php
application/Bootstrap.php
library/Zend/Application/Bootstrap/Bootstrap.php
library/Zend/Application/Bootstrap/BootstrapAbstract.php
library/Zend/Application/Bootstrap/Bootstrapper.php
library/Zend/Application/Bootstrap/
ResourceBootstrapper.php
library/Zend/Application/Module/Autoloader.php
library/Zend/Loader/Autoloader/Resource.php
library/Zend/Loader/Autoloader/Interface.php
library/Zend/Loader/PluginLoader.php
... 48 more files ...

/welcome

Magic!

en.php

background
process

language

key

translation

en

HELLO

Hello

fr

HELLO

Bonjour

es

HELLO

Hola

de

HELLO

Hallo

nl

HELLO

Hallo

fi

HELLO

Hei

ga

HELLO

Dia duit

pt

HELLO

Ol

...

...

...

...

...

...

...

...

...

data
base

Even better:
store the array to
APC with apc_store()!

APC object storage

if (($book = apc_fetch('0764596349')) === false)


{
$book = Book::getByIsbn('0764596349');
apc_store($book->getCacheKey(), $book);
}

APC functions

apc_cache_info()
apc_clear_cache()
apc_sma_info()
apc_store()
apc_fetch()
apc_delete()
apc_delete_file()
apc_compile_file()
apc_define_constants()

apc_load_constants()
apc_add()
apc_inc()
apc_dec()
apc_cas()
apc_bin_dump()
apc_bin_load()
apc_bin_dumpfile()
apc_bin_loadfile()

Advanced APC

apc_compile_file()
apc_bin_dump()
apc_bin_load()
apc_bin_dumpfile()
apc_bin_loadfile()

Memcached
vs. APC

When should you use memcached?

When requests arent guaranteed to


always go to the same machine

Data is specific or targeted to a user


User sessions

When should you use APC?

Application settings
Configuration
Data that is the same for each user
Requests are guaranteed to go to the
same machine (i.e. sticky sessions)

File upload progress & sessions (if using


sticky sessions)

Why not use both?

Create a caching adapter for a uniform


caching interface and decide where to
store at the app level or even
dynamically at runtime

Use APC for things its good at and


memcached for things its good at

Questions?

Thank you!
Ben Ramsey
benramsey.com
@ramsey
joind.in/1599

You might also like