Anda di halaman 1dari 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 external services

To reduce the number of requests made 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) progress

Gives information about file upload Stores to local, shared memory Not distributed http://php.net/apc

Basic concepts and usage

For opcode caching, just install the For memory allocation, change
apc.stat (set to 0)

extension and turn it on: apc.enabled=1


apc.shm_size; by default, its 30 MB

To speed things up even more, turn off Set and forget but it also does object
storage

Settings and configuration

apc.shm_size Determines how much

memory is allocated to APC


apc.stat Determines whether APC will

check if a file has been modified on every request


apc.ttl Leaving at zero means APC

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/

index.php

APC

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/

index.php

APC

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!
language en fr key HELLO HELLO HELLO HELLO HELLO HELLO HELLO HELLO ... ... ... translation Hello Bonjour Hola Hallo Hallo Hei Dia duit Ol ... ... ...

en.php

es de nl fi ga pt ... ... ...

background process

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) sticky sessions)

File upload progress & sessions (if using

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 memcached for things its good at

Use APC for things its good at and

Questions?

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

Anda mungkin juga menyukai