redis: data cheeseburgers - scale · > strlen fries 4 > getrange fries 0 1 ov > append...

62
Redis: Data Cheeseburgers Nick Quaranto @qrush / [email protected]

Upload: others

Post on 17-Mar-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

Redis: Data Cheeseburgers

Nick Quaranto

@qrush / [email protected]

Page 2: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

thoughtbot.com

i work at

Page 3: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

we use

Page 4: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

hoptoadapp.com

on

Page 5: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

rubygems.org

and

Page 6: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries
Page 7: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries
Page 8: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries
Page 9: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries
Page 10: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries
Page 11: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries
Page 12: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

Redis

Page 13: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

redis

“an advanced key-value

store”

Page 14: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

no

•tables

•relations

•documents

•graphs

Page 15: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

yes

data structures

Page 16: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

a big hash

_ => _

Page 17: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

really it’s just

key => data structure

Page 18: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

run commands

> GET foo

“bar”

Page 19: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

memory

•all keys & values in RAM

•sync to disk when necessary

•various levels of paranoia

Page 20: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

•data structures

•getting started

•use cases

Page 21: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

data structures

Page 22: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

strings

•like memcached

•chunk of data

•binary aware

Page 23: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

> get fries(nil)

> set fries overOK

> get friesover

fries

over

fries

over

fries

Page 24: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

> strlen fries4

> getrange fries 0 1ov

> append fries overdone

over

fries

over

fries

overdone

fries

Page 25: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

> rename fries chipsOK

> del chips1

> exists chips0

overdone

chips

chips

chips

Page 26: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

counters

•like strings, cast to an integer

•atomic increment/decrement

•very, very fast

Page 27: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

> get burgersnil

> incr burgers1

> incrby burgers 4142

burgers

1

42

burgers

burgers

Page 28: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

lists

•push, pop

•random access

•blocking actions

Page 29: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

RPUSH

LPOP

LPUSH

RPOP

thanks to peter cooper (@peterc) for the graphs!

a b c d e

Page 30: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

hotdog friesburger

> rpush order burger1> rpush order hotdog2> rpush order fries3

order

Page 31: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

hotdog friesburger

> lrange order 0 11. burger2. hotdog

> lindex order 2fries

order

Page 32: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

hotdog friesburger

> lrange order 0 -11. burger2. hotdog3. fries

order

Page 33: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

> lpop orderburger

hotdog friesburger

order

Page 34: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

sets

•unique elements

•intersect, union, difference

Page 35: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

> sadd meat bacon1> sadd meat turkey1> sadd toppings bacon1> sadd toppings bacon0

Page 36: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

RPUSHmeat

thanks to peter cooper (@peterc) for the graphs!

burger turkey ham capicola jerky bacon

toppings relish bacon ketchupmustard pickles

Page 37: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

meatburger turkey ham capicola jerky

toppings

relish ketchupmustard pickles

> sinter meat toppings1. bacon

bacon

Page 38: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

sorted sets

•high score list

•set algebra

•ranges by score or rank

Page 39: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

> zadd menu 4.99 burger1> zadd menu 2.99 shake1> zadd menu 1.99 fries1

Page 40: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

menu

burger

fries

shake

key score

1.99

2.99

4.99

Page 41: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

menu

burger

fries

shake

key score

1.99

2.99

4.99

> zrange menu 0 -1

1. fries2. shake3. burger

Page 42: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

menu

burger

fries

shake

key score

1.99

2.99

4.99

> zrank menu fries0

> zscore menu fries1.99

Page 43: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

menu

burger

fries

shake

key score

1.99

2.99

4.99

> zrangebyscore menu 2 5

1. shake2. burger

Page 44: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

menu

burger

fries

shake

key score

1.99

2.99

4.99

> zremrangebyscore menu 1.50 4.502

deleted!

Page 45: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

hashes

•easier to get all keys, values

•space saver

Page 46: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

orders:1

thanks to peter cooper (@peterc) for the graphs!

nick burgerjohn friesmike shakejoe saladcreated_at 1298686121

> hset orders:1 nick burger1> hset orders:1 john fries1

Page 47: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

orders:1nick burgerjohn friesmike shakejoe saladcreated_at 1298686121

> hget orders:1 mikeshake> hlen orders:15> hexists orders:1 brian0

Page 48: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

orders:1nick burgerjohn friesmike shakejoe saladcreated_at 1298686121

> hvals orders1. burger2. fries3. shake4. salad5. 1298686121

Page 49: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

getting started

Page 50: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

communityBSD, on GitHub

Awesome maintainer (antirez)

IRC, wiki, mailing list

Hosting providers: Redis TO GO, OpenRedis

Page 51: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

git clone git://github.com/antirez/redis

make

redis-server

or... $YOUR_DISTRO’s package manager

installing

Page 52: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

simple telnet interface

no authorization/authentication by default

AUTH password

use appendonly & daily cron BGREWRITEAOF

sysadmin

Page 53: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

depends on system and configuration

ranges from 5,000 to 120,000 ops/sec

commands have O(n) complexity listed

performance

Page 54: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

misc

master/slave replication

diskstore soon

cluster support someday?

Page 55: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

use cases

Page 56: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

when?

Whenever you want to store data fast that doesn't need to be 100% consistent.

-Mathias Meyerhttp://www.paperplanes.de/2009/10/29/when_to_redis.html

Page 57: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

hit counter

ideal with speed and INCR/INCRBY

total counts = counters

daily per URL = sorted set (ZINCRBY)

Page 58: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

on a URL hit...

HTTP: GET /index.html

Redis:INCR index.htmlZINCRBY hits 1 index.html

Page 59: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

> get index.html3910> get pages/docs.html2983> get public/404.html199

basic stats

Page 60: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

advanced

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

Page 61: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

queueatomic pops = multiple workers

start a job: RPUSH key '{"some":"data"}'

worker daemon(s): BLPOP key

Page 62: Redis: Data Cheeseburgers - SCALE · > strlen fries 4 > getrange fries 0 1 ov > append fries over done over fries over fries overdone fries

Thanks!

http://redis.io