Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf ·...

63
Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Transcript of Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf ·...

Page 1: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

CachingMemcached vs. Redis

San Francisco MySQL Meetup

Ryan LoweErin O’Neill

1

Page 2: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Databases

WE LOVE THEM...

Except when we don’t

2

Page 3: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

When Databases Rule

• Many access patterns on the same set of data

• Transactions (both monetary and isolated units of work)

• Don’t know what the end state access patterns will be

• Always :)

3

Page 4: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

When Databases Suck

• Lots of concurrent users

• ORMs

• Big Data Sets

• Small Pockets of VERY hot data

4

Page 5: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

How Caching Works

• External vs. built-in caching

• MySQL Query Cache

• InnoDB Buffer Pool

• Rails SOMETHING

5

Page 6: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Caching Architecture

Becomes

6

Page 7: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Why Caching Works

7

Page 8: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

8

Page 9: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

9

Page 10: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

There are only two hard problems in Computer Science: cache invalidation, naming things, and off-by-one errors.

-- Martin Fowler

10

Page 11: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Problems with Caching

• Cache Misses

• Thundering Herd

• Stale Data

• Warm-Up Times

• Overly-Aggressive Caching

• Poor Cache Design

11

Page 12: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Cache Misses

Cache Hit: 1 OperationCache Miss: 3 Operations

12

Page 13: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Thundering Herd

• Key TOP_10_VIDEOS expires @ 9:00

• Generating the K/V takes three seconds

• Page gets 100 req/s = 100*3 = 300 threads!

13

Page 14: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Stale Data

• Must maintain consistency between the database and the cache from within the application

• Extremely difficult to validate correctness

14

Page 15: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Cache Warm-Up

• All attempts to read from the cache are CACHE MISSES, which require three operations.

• This can result in a significant degradation of response time.

• Usually accompanied by a Thundering Herd

15

Page 16: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Use Cases

• Sessions

• Popular Items

• Full Page Cache

• Profile Information

• User Preferences

• Tag Clouds

• Auto-suggest lists

• Relationships

• User Information

• Online Users

• Statistics

16

Page 17: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Memcached

Memcached is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering.

17

Page 18: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis

Redis is an open source, advanced key-value store. It is often referred to as a “data structure server” since keys can contain strings, hashes, lists, sets and sorted sets.

18

Page 19: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

In-Memory Means We’re Bound By RAM

19

Page 20: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Consistent Hashing

• Each Key deterministically goes to a particular server. Think (KEY % SERVERS)

20

Page 21: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Memcached

• Dead Simple & Battle Tested

• Fast

• Non-Blocking get()/set()

• Multi-Threaded

• Consistent Hashing

21

Page 22: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Memcached Example

employee_id = 1234

employee_json = {

name => ‘Ryan Lowe’,

title => ‘Production Engineer’ }

set(employee_id, employee_json)

get(employee_id) [Returns employee_json]

22

Page 23: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

But I don’t want all the data

• What if I just want the name?

• 64 Bytes for the object vs. 10 for just the name :-(

• 6x network traffic

• More work for the application

• Fatter applications

23

Page 24: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis

• Advanced Data Types

• Replication

• Persistence

• Usually Fast

• Very Cool Atomic Operations

24

Page 25: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis: The Bad

• Single-Threaded

• Limited client support for consistent hashing

• Significant overhead for persistence (do be discussed later)

• Not widely deployed (compared to Memcached)

25

Page 26: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis: Datatypes

• Strings (just like Memcached)

• Lists

• Sets

• Sorted Sets

• Hashes

26

Page 27: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis: Lists

• Stored in sorted order

• Can push/pop

• Fast head/tail access

• Index access (yay)

27

Page 28: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis: Lists

r.lpush(‘employees’, ‘Ryan Lowe’)

r.lpush(‘employees’, ‘Dave Apgar’)

r.lrange(‘employees’, 0, -1)

(‘Dave Apgar’, ‘Ryan Lowe’)

r.rpush(‘employees’, ‘Evan Miller’)

r.lrange(‘employees’, 0, -1)

(‘Dave Apgar’, ‘Ryan Lowe’, ‘Evan Miller’)

28

Page 29: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis: Sets

• Un-ordered collections of strings

• Unique (no repeated members)

• diff, intersect, merge

29

Page 30: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis: Sets

sadd(‘employees’, ‘Ryan Lowe’)

sadd(‘former_employees’, ‘Bryan Lowe’)

sdiff(‘former_employees’, ‘employees’)

(‘Ryan Lowe’,‘Bryan Lowe’)

30

Page 31: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis: Sorted Sets

• Same as Sets but ordered by a score

31

Page 32: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis: Hashesr.hset(‘employees’, ‘count’, 1234)

r.hset(‘employees’,‘females’, 1000)

r.hset(‘employees’,‘males’, 234)

hget(‘employees’,‘count’)

“1234”

hgetall(‘employees’)

{ ‘count’ => 1234,

‘females’ => 1000,

‘males’ => 234 }

32

Page 33: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Memcached vs. RedisMemcached Redis

(multi)get ✓ ✓(multi)set ✓ ✓incr/decr ✓ ✓

delete ✓ ✓Expiration ✓ ✓

prepend/append ✓Range Queries ✓

Data Types! ✓Persistence (sorta) ✓

Multi-Threaded ✓Replication (sorta) ✓

33

Page 34: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Instrumentation

• Redis: info

• Memcached: stats

• Both give system information, connections, hits, misses, etc.

• Graphite most of the metrics!!!

34

Page 35: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Benchmarks

35

Page 36: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

About the Benchmarks

• 1 Hour

• Redis 2.6 & Memcached 1.4.5

• 64,000,000 Keys"KEY_#{i.to_s}"

• 51-Character Values(0...50).map{ ('a'..'z').to_a[rand(26)] }.join

36

Page 37: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Benchmarks

37

Page 38: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Set (1 Server)

0

1500

3000

4500

6000

7500

9000

10500

12000

1 Client 2 Clients 4 Clients 8 Clients12 Clients 16 Clients 24 Clients 32 Clients

38

Page 39: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Set (1 Server)

0

1500

3000

4500

6000

7500

9000

10500

12000

1 Client 2 Clients 4 Clients 8 Clients12 Clients 16 Clients 24 Clients 32 Clients

WTF?!

39

Page 40: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Set (1 Server)

0

2000

4000

6000

8000

10000

1 Client 2 Clients 4 Clients 8 Clients12 Clients 16 Clients 24 Clients

40

Page 41: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Set (2 Servers)

0

4000

8000

12000

16000

1 Client 2 Clients 4 Clients 8 Clients12 Clients 16 Clients 24 Clients 32 Clients

41

Page 42: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Set (2 Servers)

0

4000

8000

12000

16000

1 Client 2 Clients 4 Clients 8 Clients12 Clients 16 Clients 24 Clients 32 Clients

WTF?!

42

Page 43: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Set (4 Servers)

0

4000

8000

12000

16000

1 Client 2 Clients 4 Clients 8 Clients12 Clients 16 Clients 24 Clients 32 Clients

43

Page 44: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Set (8 Servers)

0

4000

8000

12000

16000

1 Client 2 Clients 4 Clients 8 Clients12 Clients 16 Clients 24 Clients 32 Clients

44

Page 45: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Hash Ring Balance (%)

0

50

100

Redis Memcached

Server 1 Server 2

45

Page 46: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Hash Ring Balance (%)

0

25

50

Redis Memcached

Server 1 Server 2 Server 3 Server 4

46

Page 47: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Hash Ring Balance (%)

0

12.5

25

Redis Memcached

Server 1 Server 2 Server 3 Server 4 Server 5Server 6 Server 7 Server 8

47

Page 48: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Get (1 Server)

0

25000

50000

75000

100000

125000

1 Client 2 Clients 4 Clients 8 Clients12 Clients 16 Clients 24 Clients 32 Clients

48

Page 49: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Get (2 Servers)

0

25000

50000

75000

100000

125000

1 Client 2 Clients 4 Clients 8 Clients12 Clients 16 Clients 24 Clients 32 Clients

49

Page 50: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Get (4 Servers)

0

25000

50000

75000

100000

125000

1 Client 2 Clients 4 Clients 8 Clients12 Clients 16 Clients 24 Clients 32 Clients

50

Page 51: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis Get (8 Servers)

0

25000

50000

75000

100000

125000

1 Client 2 Clients 4 Clients 8 Clients12 Clients 16 Clients 24 Clients 32 Clients

51

Page 52: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

The Cost of Persistence

4000

6000

8000

10000

12000

Redis No Persistence Redis BGSAVE (FIO) Redis AOF

52

Page 53: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Redis & MemcachedBenchmarks

53

Page 54: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Set Operations (1 Server, 24 Clients)

9300

9475

9650

9825

10000

Memcached Redis

54

Page 55: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Get Operations(1 Server, 24 Clients)

80000

92500

105000

117500

130000

Memcached Redis

55

Page 56: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Set Operations (2 Servers, 24 Clients)

8000

9250

10500

11750

13000

Memcached Redis

56

Page 57: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Get Operations (2 Servers, 24 Clients)

8000

41000

74000

107000

140000

Memcached Redis

57

Page 58: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Set Operations (4 Servers, 24 Clients)

8000

9250

10500

11750

13000

Memcached Redis

58

Page 59: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Get Operations (4 Servers, 24 Clients)

8000

41000

74000

107000

140000

Memcached Redis

59

Page 60: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Set Operations (8 Servers, 24 Clients)

8000

9000

10000

11000

12000

Memcached Redis

60

Page 61: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Get Operations (8 Servers, 24 Clients)

8000

43500

79000

114500

150000

Memcached Redis

61

Page 62: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Conclusions

• Redis inconsistent under heavy load

• We need more benchmarks!

• (Redis) Datatype-specific

• Big Memory

• (Redis) Big Keys

62

Page 63: Caching Memcached vs. Redis - files.meetup.comfiles.meetup.com/107604/redis_memcached_pdf.pdf · Caching Memcached vs. Redis San Francisco MySQL Meetup Ryan Lowe Erin O’Neill 1

Questions?

63