Your SlideShare is downloading. ×
Caching Up and Down the Stack
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Caching Up and Down the Stack

383

Published on

Presented by James Meickle, developer evangelist at AppNeta, to the Boston Django Meetup on March 28, 2014.

Presented by James Meickle, developer evangelist at AppNeta, to the Boston Django Meetup on March 28, 2014.

Published in: Software
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
383
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • Caches that exist at the client or CDN level
  • Caches that exist within a running application’s code
  • Caches that exist at the programming language or infrastructure level
  • Transcript

    • 1. Caching Up and Down the Stack 1 James Meickle Developer evangelist, AppNeta @jmeickle Django Boston Meetup Group March 26, 2014
    • 2. 2 4 WHAT IS CACHING? Uncached Client Data Source
    • 3. 3 4 WHAT IS CACHING? Uncached Cached Client Data Source Data Source Client Cache Intermediary
    • 4. 4 4 WHAT IS CACHING? Uncached Cached Client Data Source Data Source Client Cache Intermediary Fast ! Slow...
    • 5. 5 • Images • CSS • JavaScript • HTML documents • DNS 4 WHAT GETS CACHED BY CLIENTS?
    • 6. 6 • HTML documents • HTML fragments • Operations on data • Database queries • Expensive objects 4 WHAT GETS CACHED BY APPS?
    • 7. 7 • Compiled source • Packages • Disk access • Memory access • CPU instructions 4 WHAT GETS CACHED BY SERVERS?
    • 8. 8 • Client-side assets • Full pages 4 CACHING IN DJANGO: FRONTEND
    • 9. 9 4 OUR SITES appneta.com (static site via Jekyll)
    • 10. 10 4 OUR SITES internal.tracelytics.com (dynamic single page Pylons app)
    • 11. 11 4 CLIENT-SIDE ASSETS
    • 12. 12 • Use HTTP caches! • CDN • Intermediate proxies • Browser • Set policy with cache headers • Cache-Control • Expires 4 CLIENT-SIDE ASSETS
    • 13. 13 4 CLIENT-SIDE ASSETS /tl-layouts_base-compiled-757f5eec3603f60850acfdb86e6701cf104f80ae.css Request Method: GET Status Code: 304 Not Modified Cache-Control: max-age=315360000 Connection: keep-alive Date: Mon, 18 Feb 2013 22:46:12 GMT Expires: Thu, 31 Dec 2037 23:55:55 GMT Last-Modified: Tue, 12 Feb 2013 21:10:20 GMT Server: nginx/0.8.54
    • 14. 14 4 CLIENT-SIDE ASSETS appneta.com internal.tracelytics.com
    • 15. 15 4 CLIENT-SIDE ASSETS (IN DJANGO) VS
    • 16. 16 • Full pages • Partial pages • Objects • Queries 4 CACHING IN DJANGO: BACKEND
    • 17. 17 4 WE’RE STILL TALKING ABOUT PAGES? Client-side assets Pages
    • 18. 18 4 FULL-PAGE HTTP CACHING Client Varnish Do HTTP caching, but with your rules. No internet standards necessary! Webserver
    • 19. 19 • Why do it server-side? • Invalidation • Amount cached • Changing cache policies 4 FULL-PAGE HTTP CACHING
    • 20. 20 4 FULL-PAGE HTTP CACHING (IN DJANGO)
    • 21. 21 • Full pages • Partial pages • Objects • Queries 4 CACHING IN DJANGO: BACKEND
    • 22. 22 4 FULL-PAGE HTTP CACHING? appneta.com
    • 23. 24 4 FRAGMENT CACHING appneta.com Ruins everything
    • 24. 25 4 FRAGMENT CACHING
    • 25. 26 4 FRAGMENT CACHING
    • 26. 27 4 FRAGMENT CACHING
    • 27. 28 4 FRAGMENT CACHING (IN DJANGO)
    • 28. 29 • Full pages • Partial pages • Objects • Queries 4 CACHING IN DJANGO: BACKEND
    • 29. 30 4 OBJECT CACHING def get_item_by_id(key): # Look up the item in our database return session.query(User) .filter_by(id=key) .first()
    • 30. 31 4 OBJECT CACHING def get_item_by_id(key): # Check in cache val = mc.get(key) # If exists, return it if val: return val # If not, get the val, store it in the cache val = return session.query(User) .filter_by(id=key) .first() mc.set(key, val) return val
    • 31. 32 4 OBJECT CACHING @decorator def cache(expensive_func, key): # Check in cache val = mc.get(key) # If exists, return it if val: return val # If not, get the val, store it in the cache val = expensive_func(key) mc.set(key, val) return val
    • 32. 33 4 OBJECT CACHING @cache def get_item_by_id(key): # Look up the item in our database return session.query(User) .filter_by(id=key) .first()
    • 33. 34 4 OBJECT CACHING (IN DJANGO)
    • 34. 35 • Full pages • Partial pages • Objects • Queries 4 CACHING IN DJANGO: BACKEND
    • 35. 36 4 QUERY CACHING Cached Table Data DB client Query Cache SQL server Retrieve results from memory… …or from memcached… …or cache in the DB itself!
    • 36. 37 4 QUERY CACHING mysql> select SQL_CACHE count(*) from traces; +----------+ | count(*) | +----------+ | 3135623 | +----------+ 1 row in set (0.56 sec) mysql> select SQL_CACHE count(*) from traces; +----------+ | count(*) | +----------+ | 3135623 | +----------+ 1 row in set (0.00 sec)
    • 37. 38 4 QUERY CACHING (IN DJANGO)
    • 38. 39 4 QUERY CACHING (IN TRACEVIEW) Cassandra in TraceView: Retrieving data from data warehouse
    • 39. 40 4 QUERY CACHING (IN TRACEVIEW) Memcache in TraceView: 97%ile is 50ms!
    • 40. 41 • Invalidation • Fragmentation • Stampedes • Complexity 4 WHAT CAN GO WRONG?
    • 41. 42 4 INVALIDATION Uncached Cached Client Data Source Data Source Client Cache Intermediary Invalidation
    • 42. 43 4 INVALIDATION Drupal: Automatically cache everything!
    • 43. 44 4 INVALIDATION Memcache GET performance
    • 44. 45 4 INVALIDATION Do you know what you’re storing in this call?
    • 45. 46 4 INVALIDATION Memcache SET performance
    • 46. 47 4 FRAGMENTATION “In the beginning there was NCSA Mosaic, and Mosaic called itself NCSA_Mosaic/2.0 (Windows 3.1), and Mosaic displayed pictures along with text, and there was much rejoicing.” History of the browser user-agent string
    • 47. 48 • On a cache miss extra work is done • The result is stored in the cache • What if multiple simultaneous misses? • Every node tries to do the same work at the same time and your 4 STAMPEDES
    • 48. 49 • What caching scheme? • How many extra servers? • What happens if they fail? • What will you do to debug it? 4 COMPLEXITY
    • 49. 50 • The ‘how’ of caching: • What are you caching? • Where are you caching it? • How bad is a cache miss? • How and when are you invalidating? 4 TAKEAWAYS
    • 50. 51 • The ‘why’ of caching: • Did it actually get faster? • Is speed worth extra complexity? • Don’t guess – measure! • Always use real-world conditions. 4 TAKEAWAYS
    • 51. 52 • ? 4 QUESTIONS
    • 52. 53 • Django documentation on caching: https://docs.djangoproject.com/en/dev/topics/cache/ • Varnish caching, via Disqus: http://blog.disqus.com/post/62187806135/scaling-django-to-8- billion-page-views • Django cache option comparisons: http://codysoyland.com/2010/jan/17/evaluating-django-caching- options/ • More Django-specific tips: http://www.slideshare.net/csky/where- django-caching-bust-at-the-seams • Guide to cache-related HTTP headers: http://www.mobify.com/blog/beginners-guide-to-http-cache- headers/ 4 RESOURCES
    • 53. 54 TraceView Stop by later tonight to hear more about AppNeta or TraceView  (make sure to get a sticker!) April 1: Come drink on our tab after the Boston Python Meetup April 11: PyCon! Swing by our booth (214) for an awesome shirt Or, just try us out: THANK YOU! http://www.appneta.com/products/traceview/

    ×