* Intro
** memcached is nice and fast, and people like it
** but it's not transactional
** we can do better
*** better consistency
*** better programming model
** Goals
*** Cache application data
*** Be transactionally consistent with the database
*** Scale linearly
*** Don't slow things down (never abort or block)
*** Provide an easy-to-use programming model that avoids global reasoning
** why haven't we done this by now
*** invalidations are messy, hard to get right, and don't scale
** using slightly stale, but still edible data makes this possible

* Architecture
** Distributed in-memory cache
** Caching application objects
** Programming model
*** Transactions, cacheable functions, queries

* Running r/o transactions in the past
** Why this is useful
*** maximize usage of objects in the cache
*** don't need invalidations
** Why this is not totally incorrect

* Cache
** Hash table, plus multiversion support
** Replacement policy
** Dealing with current data?

* Database support
** Limited time travel
** Validity intervals
** Invalidations (?)

* Library
** Mapping function calls -> keys -> nodes
** Assigning timestamps lazily & updating validity intervals
** Pincushion goes somewhere.

* Evaluation
** Database overhead
** Speedup w/ cache
** Cache scalability
** Comparison w/ memcached?

* Conclusion
