Slide 1

Slide 1 text

Redis: Data Cheeseburgers Nick Quaranto @qrush / nick@quaran.to

Slide 2

Slide 2 text

thoughtbot.com i work at

Slide 3

Slide 3 text

we use

Slide 4

Slide 4 text

hoptoadapp.com on

Slide 5

Slide 5 text

rubygems.org and

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Redis

Slide 13

Slide 13 text

redis “an advanced key-value store”

Slide 14

Slide 14 text

no •tables •relations •documents •graphs

Slide 15

Slide 15 text

yes data structures

Slide 16

Slide 16 text

a big hash _ => _

Slide 17

Slide 17 text

really it’s just key => data structure

Slide 18

Slide 18 text

run commands > GET foo “bar”

Slide 19

Slide 19 text

memory •all keys & values in RAM •sync to disk when necessary •various levels of paranoia

Slide 20

Slide 20 text

•data structures •getting started •use cases

Slide 21

Slide 21 text

data structures

Slide 22

Slide 22 text

strings •like memcached •chunk of data •binary aware

Slide 23

Slide 23 text

> get fries (nil) > set fries over OK > get fries over fries over fries over fries

Slide 24

Slide 24 text

> strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

Slide 25

Slide 25 text

> rename fries chips OK > del chips 1 > exists chips 0 overdone chips chips chips

Slide 26

Slide 26 text

counters •like strings, cast to an integer •atomic increment/ decrement •very, very fast

Slide 27

Slide 27 text

> get burgers nil > incr burgers 1 > incrby burgers 41 42 burgers 1 42 burgers burgers

Slide 28

Slide 28 text

lists •push, pop •random access •blocking actions

Slide 29

Slide 29 text

RPUSH LPOP LPUSH RPOP thanks to peter cooper (@peterc) for the graphs! a b c d e

Slide 30

Slide 30 text

hotdog fries burger > rpush order burger 1 > rpush order hotdog 2 > rpush order fries 3 order

Slide 31

Slide 31 text

hotdog fries burger > lrange order 0 1 1. burger 2. hotdog > lindex order 2 fries order

Slide 32

Slide 32 text

hotdog fries burger > lrange order 0 -1 1. burger 2. hotdog 3. fries order

Slide 33

Slide 33 text

> lpop order burger hotdog fries burger order

Slide 34

Slide 34 text

sets •unique elements •intersect, union, difference

Slide 35

Slide 35 text

> sadd meat bacon 1 > sadd meat turkey 1 > sadd toppings bacon 1 > sadd toppings bacon 0

Slide 36

Slide 36 text

RPUSH meat thanks to peter cooper (@peterc) for the graphs! burger turkey ham capicola jerky bacon toppings relish bacon ketchup mustard pickles

Slide 37

Slide 37 text

meat burger turkey ham capicola jerky toppings relish ketchup mustard pickles > sinter meat toppings 1. bacon bacon

Slide 38

Slide 38 text

sorted sets •high score list •set algebra •ranges by score or rank

Slide 39

Slide 39 text

> zadd menu 4.99 burger 1 > zadd menu 2.99 shake 1 > zadd menu 1.99 fries 1

Slide 40

Slide 40 text

menu burger fries shake key score 1.99 2.99 4.99

Slide 41

Slide 41 text

menu burger fries shake key score 1.99 2.99 4.99 > zrange menu 0 -1 1. fries 2. shake 3. burger

Slide 42

Slide 42 text

menu burger fries shake key score 1.99 2.99 4.99 > zrank menu fries 0 > zscore menu fries 1.99

Slide 43

Slide 43 text

menu burger fries shake key score 1.99 2.99 4.99 > zrangebyscore menu 2 5 1. shake 2. burger

Slide 44

Slide 44 text

menu burger fries shake key score 1.99 2.99 4.99 > zremrangebyscore menu 1.50 4.50 2 deleted!

Slide 45

Slide 45 text

hashes •easier to get all keys, values •space saver

Slide 46

Slide 46 text

orders:1 thanks to peter cooper (@peterc) for the graphs! nick burger john fries mike shake joe salad created_at 1298686121 > hset orders:1 nick burger 1 > hset orders:1 john fries 1

Slide 47

Slide 47 text

orders:1 nick burger john fries mike shake joe salad created_at 1298686121 > hget orders:1 mike shake > hlen orders:1 5 > hexists orders:1 brian 0

Slide 48

Slide 48 text

orders:1 nick burger john fries mike shake joe salad created_at 1298686121 > hvals orders 1. burger 2. fries 3. shake 4. salad 5. 1298686121

Slide 49

Slide 49 text

getting started

Slide 50

Slide 50 text

community BSD, on GitHub Awesome maintainer (antirez) IRC, wiki, mailing list Hosting providers: Redis TO GO, OpenRedis

Slide 51

Slide 51 text

git clone git://github.com/antirez/redis make redis-server or... $YOUR_DISTRO’s package manager installing

Slide 52

Slide 52 text

simple telnet interface no authorization/authentication by default AUTH password use appendonly & daily cron BGREWRITEAOF sysadmin

Slide 53

Slide 53 text

depends on system and configuration ranges from 5,000 to 120,000 ops/sec commands have O(n) complexity listed performance

Slide 54

Slide 54 text

misc master/slave replication diskstore soon cluster support someday?

Slide 55

Slide 55 text

use cases

Slide 56

Slide 56 text

when? Whenever you want to store data fast that doesn't need to be 100% consistent. -Mathias Meyer http://www.paperplanes.de/2009/10/29/when_to_redis.html

Slide 57

Slide 57 text

hit counter ideal with speed and INCR/INCRBY total counts = counters daily per URL = sorted set (ZINCRBY)

Slide 58

Slide 58 text

on a URL hit... HTTP: GET /index.html Redis: INCR index.html ZINCRBY hits 1 index.html

Slide 59

Slide 59 text

> get index.html 3910 > get pages/docs.html 2983 > get public/404.html 199 basic stats

Slide 60

Slide 60 text

advanced > zrange hits 0 -1 withscores 1) "public/404.html" 2) "199" 3) "pages/docs.html" 4) "2983" 5) "index.html" 6) "3910"

Slide 61

Slide 61 text

queue atomic pops = multiple workers start a job: RPUSH key '{"some":"data"}' worker daemon(s): BLPOP key

Slide 62

Slide 62 text

Thanks! http://redis.io