Slide 1

Slide 1 text

Caching with Memcached & APC Ben Ramsey TEK·X • May 21, 2010

Slide 2

Slide 2 text

Hi, I’m Ben. benramsey.com @ramsey joind.in/1599

Slide 3

Slide 3 text

What is a cache?

Slide 4

Slide 4 text

“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

Slide 5

Slide 5 text

“A cache is a temporary storage area where frequently accessed data can be stored for rapid access.”

Slide 6

Slide 6 text

Why use a cache?

Slide 7

Slide 7 text

• 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

Slide 8

Slide 8 text

Types of caches

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Memcached

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Who uses memcached? • Facebook • Digg • Youtube • Wikipedia • Us (Moontoast) • Many others...

Slide 13

Slide 13 text

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 doesn’t handle failover

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

memcached memcached memcached www www www

Slide 17

Slide 17 text

memcached memcached memcached www www www

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

$> 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. $>

Slide 20

Slide 20 text

Let’s see that with some code.

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

pecl/memcached

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Settings and configuration •Memcached::OPT_COMPRESSION •Memcached::OPT_DISTRIBUTION •Memcached::OPT_LIBKETAMA_COMPATIBLE •Memcached::OPT_BINARY_PROTOCOL •Memcached::OPT_NO_BLOCK

Slide 27

Slide 27 text

Memcached methods • add() • addServer() • append() • cas() • decrement() • delete() • get() • getMulti() • getResultCode() • getResultMessage() • getServerList() • getStats() • increment() • prepend() • replace() • set() • setMulti() • ... and more!

Slide 28

Slide 28 text

Alternative PHP Cache (APC)

Slide 29

Slide 29 text

apc apc apc www www www

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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, it’s 30 MB • To speed things up even more, turn off apc.stat (set to 0) • “Set and forget” … but it also does object storage

Slide 32

Slide 32 text

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 won’t be cached; if greater than zero, APC will attempt to remove expired entries

Slide 33

Slide 33 text

How does opcode caching work?

Slide 34

Slide 34 text

example.com/ 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 ... APC

Slide 35

Slide 35 text

example.com/ 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 ... APC

Slide 36

Slide 36 text

data base 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á ... ... ... ... ... ... ... ... ... background process en.php /welcome Magic!

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

APC object storage

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

• 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() APC functions

Slide 41

Slide 41 text

• apc_compile_file() • apc_bin_dump() • apc_bin_load() • apc_bin_dumpfile() • apc_bin_loadfile() Advanced APC

Slide 42

Slide 42 text

Memcached vs. APC

Slide 43

Slide 43 text

When should you use memcached? • When requests aren’t guaranteed to always go to the same machine • Data is specific or targeted to a user • User sessions

Slide 44

Slide 44 text

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)

Slide 45

Slide 45 text

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 it’s good at and memcached for things it’s good at

Slide 46

Slide 46 text

Questions?

Slide 47

Slide 47 text

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