CACHING FOR CASH - CACHING
Scott MacVicarphp|works 2008
WHY CACHE?
Reduce memory usage
Reduce processing time
Reduce network traffic
Reduce disk access
CACHING OPTIONS
Flat file
RAM disk
Database
Memcache
APC
Script level
WHAT TO CACHE?
External resources
Large result sets
Static data
Sessions
FLAT FILE CACHE
Write data out to a local file
Config files from Database or XML
Remote resources store locally
Output buffering to local file
CACHING FILES
PEAR::Cache_Lite
Zend_Cache in Zend Framework
var_export in PHP
RAM DISK
Mount some memory as disk space
Used when IO actions can’t be avoided
Non resizable on the fly
LIGHTTPD + PHP
Lua is a scripting language in lighttpd
Use PHP to write out file to disk
Have Lua look at the modified time of the file, if within the limit serve else execute PHP
MEMCACHE
Origins within Livejournal
Used by Facebook, Youtube, Wikipedia and digg
Caching daemon, no persistence
Stores key / value pairs
FACEBOOK EXAMPLE
200 dedicated memcache servers
Each 16GB quad-core amd64
3TB memcache data
MEMCACHE
Slab Allocator
Libevent based (non-blocking)
Simple Protocol
Server is just a hash table
No authentication or self awareness
MEMCACHE CLIENT
Clients provide key and value
Responsible for serialising any value
Compress data
SERVER PROTOCOL
set/replace/add
get
append/prepend
increment/decrement
compare and swap
HASHING
Key is hashed into a value
Modulous then applied which is the number of the servers
Server is then picked and stored
If one server drops out you only lose a fraction of the keys
MEMCACHE LIMITS
Key Size is 250 bytes
Data Size is 1 megabyte
32bit/64bit memory limit
No Replication across cluster
MEMCACHE CLEANING UP
Uses Least Recently Used Algorithm
Looks for the oldest item and removes
TTL also applies to key / value pairs
SIMPLE USAGE
Fetch from memcache
If there return
Else calculate, store in cache and return
WHERE TO RUN?
Any server works
No need for matching size
Low CPU usage
MEMCACHE + PHP
PECL extension using custom connection
pecl install memcache
Provides MemcachePool and Memcache
INI settings to change hash strategy, function and protocol.
MEMCACHE SAMPLE
MEMCACHE ACTIONS
Add - only if the key doesn’t exist
Set - will add or update key
Replace - only if the key already exists
MEMCACHE TASK
Open Terminal in VMWare Image and runsudo service memcached start
Try using memcache to set, get and add values
Try setting a value using the Time To Live parameter
Ask questions :-)
MEMCACHEDB
Persistent key/value storage system
BDB used for persitence
Compatible with Memcache protocol
MEMCACHEDB CAVEATS
No expiration
Isn’t a replacement for memcache
APC
Provides OPCode caching in PHP
Shared memory for storage
APC is only on the local server
No network overhead from TCP/IP
APC
Tokenizer
Parser
Compiler
Executor
APC
Input
Store Opcodes
APC SAMPLE
CACHE LAYERING
APC Memcache Disk / Database
Fetch from APC locally
Fetch from Memcache, add to APC
Finally fetch from the original source and store back in Memcache
APC USE CASES
Should always use it to cache opcode of files
Small but frequently accessed things
You only have one server
APC TASK
Try storing classes or arrays in APC
Use the Time To Live
APC supports an array for keys in apc_get, fetch multiple values
SQLITE
Local node storage of filesystem
Cache result sets from remote database
In memory database
DATABASE QUERY CACHING
Rely on MySQL to do the query caching
Doesn’t quite work though :-(
Invalidation of cache happens easily
ALTERNATIVE DATABASE CACHING
Store the result set from the database using another caching software
Hash query as a key value
Extend your DB layer to add this transparently?
CACHING TIPS
Pre-heat the cache
Use multiple levels of cache
Cache even dynamic data for short times
serialize() is slow
QUESTIONS?