How you can benefit from using Redis. Javier Ramirez, teowaki, at Codemotion 2014

Post on 02-Jul-2015

735 views 1 download

description

All the cool cats are using Redis, and with a reason: It's fast, it's robust, it's easy and it's web scale. Redis is powering sites like twitter, instagram, snapchat, youporn, world of warcraft or pinterest, but you can also benefit from the power of Redis even in a more modest project. In this session I will talk about what is Redis, what you can do with it, how other people are using it, and how we are using it in our startup for a number of common use cases.

Transcript of How you can benefit from using Redis. Javier Ramirez, teowaki, at Codemotion 2014

by javier ramirez@supercoco9

How you can benefit from using

https://teowaki.com https://datawaki.com

I was Lois Lane

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

redis has super powers

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

superpower I: super speed

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

redis-benchmark -r 1000000 -n 2000000 -t get,set,lpush,lpop,mset -P 16 -q

On my laptop:

SET: 513610 requests per secondGET: 641436 requests per secondLPUSH: 845665 requests per secondLPOP: 783392 requests per secondMSET (10 keys): 89988 requests per second

On a small digital ocean server ($5/month)

SET: 227816 requests per secondGET: 228258 requests per secondLPUSH: 251098 requests per secondLPOP: 251572 requests per secondMSET (10 keys): 43918 requests per second

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

superpower II: it doesn't hide

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

http://redis.io

open source, BSD licensed, advanced key-value store.

It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets, sorted sets and hyperloglogs.

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

started in 2009 by Salvatore Sanfilippo @antirez

112 contributors at

https://github.com/antirez/redis

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

The Redis Manifesto1.A DSL for Abstract Data Types

2.Memory storage is #1

3.Fundamental data structures for a fundamental API

4.Two levels of API

5.Code is like a poem; it's not just something we write to reach some practical result

6.We're against complexity

7.We optimize for joy

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

superpower III: Redis makes You think

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

Redis data typesStrings

Hashes

Lists

Sets

Sorted Sets

HyperLogLogsjavier ramirez @supercoco9 https://teowaki.com https://datawaki.com

basic commands

Setting/getting/deleting/expiring

Increment/decrement

Pushing/popping

Checking membership, size...

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

much cooler commandsSetting only if exists

Blocking pop

(Blocking) pop from one list, push to another

Get/set string ranges (and bit operations)

Set intersections/diffs (and store)

Pub/subjavier ramirez @supercoco9 https://teowaki.com https://datawaki.com

A chat in 6 lines of code

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

r=Redis.new driver: :hiredisr.subscribe “chatrooms:42” do |on|

on.message do |topic, msg|puts “#{topic}: #{msg}”

endend

r.publish “chatrooms:42”, “Hello codemotion”

superpower IV: atomicity

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

single threaded, so no concurrency problems

transactions and lua scripts to run multiple operations atomically

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

superpower V: flexible data persistence

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

Redis keeps everything in memory all the time

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

Does that mean if the server goes down I will lose my data?

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

NO**unless you didn't configure it properly

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

superpower VI: data distribution

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

High Availability & scaling out

One master, several read-only slaves

Sharding, Twemproxy, Dynomite

Redis clusterjavier ramirez @supercoco9 https://teowaki.com https://datawaki.com

what's being used for

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

twitter

Every time line (800 tweets per user) is on redis

5000 writes per second avg300K reads per second

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

twitter

user info from gizmoduck(memcached)

user id tweet id metadata

write API (from browser or client app)

rpushx to Redis

tweet info from tweetypie (memcached + mysql)

your twitter timeline

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

fanout (flockDB)

one per follower

Crashlytics

Activity tracking with Strings and Bit Operations

Event tracking with Hashes

Leaderboards with Sorted Sets

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

soundcloud

Roshi implements a time-series event storage via a LWW-element-set CRDT with inline garbage collection.

Roshi is a stateless, distributed layer on top of Redis and is implemented in Go. It is partition tolerant, highly available and eventually consistent.

https://github.com/soundcloud/roshi

World Of Warcraft

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

Blizzard is quite secretive about it

Known to have at least 8 servers with 64Gb each to serve user avatars

Known to have seen 1.000.000 users concurrently in the Asian version of the game

stack overflowThree level cache:

local cache (no persistence)sessions, and pending view count updates

site cache hot question id lists, user acceptance rates...

global cache (separate Redis DB)Inboxes, API usage quotas...

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

tumblr

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

started using Redis for notifications (over 7000/s) because MySQL would struggle.

They liked it, so then they replaced memcached too

Booking.com

2TB of data in server-side cookie sessions

36 masters – 36 slaves in 2 datacenters

Implemented new command to have versioned race-free hash entries

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

pinterest object graph

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

per userRedis SortedSet, with timestamp as the score to

store the users followed explicitlystore the users followed implicitlystore the user’s explicit followersstore the user’s implicit followersstore boards followed explicitly

Redis set to store boards unfollowed explicitly

per boardRedis Hash to store a board’s explicit followersRedis Set to store a board’s explicit unfollowers

youporn

Most data is found in hashes with ordered sets used to know what data to show.

zInterStore on: videos:filters:released, Videos:filters:orientation:straight,Videos:filters:categories:{category_id}, Videos:ordering:rating

Then perform a zRange to get the pages we want and get the list of video_ids back.

Then start a pipeline and get all the videos from hashes.

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

snapchatRedis cluster of 216 master and 216 slaves.Over 400MM messages per day.Running on Google App Engine.No need to have an operations team.

githubGit as a service internally.

Redis is used for storing routing info matching user repositories to server names

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

hipchatRedis for caching.

Information like which users are in which rooms, presence information, who is online...

Redis to balance XMPP, so it doesn’t matter which XMPP server you connect to.

when things go wrong

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

the instagram case

moving from redis to cassandra: 75% savings on servers

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

pick the right superhero

the twilio case

credit card hell

lesson learnt: know what you are doing. Don't change config on the fly

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

stripe

Master didn't have persistence, but slaves did.

Master was stopped, slaves kept working.

Master was re-started, asked the slaves to replicate the master database (it was empty)

All the data in the cluster was lost.

Luckily, this was only a test, but a scary one.

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

take the time to masteryour super powers

everybody fails, sometimes

Salvatore Sanfilippo lost his own blog*because he forgotto configure persistance

* he recovered it in 30 minutes

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

superpower VII: it doesn't get scared ofbig numbers

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

you can go a long waybefore havingscary numbers

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

how teowaki is using redis

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

Abusing queues

keep track of every activity in the system, even if you don't need them all right now:- every page view- every API request- every time a record is created/updated/deleted

benefits:- highly decoupled system- easier to divide into services- you can add behaviour without changing your app

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

intermediate cache* As a very fast lightweight storage for analytics data before sending them to our google bigquery based solution

* As a cache for attributes frequently looked up in join tables(names, nicknames, guids, delegated or included model names...)

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

Some of our uses of LuaExpiring attributes inside a Redis hash

Inserting notifications into a list only if there are notpending notifications from the same user for the same scope

Paginating a list by an attribute

Manipulating JSON directly at the Redis layer

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

counters

Atomic counters can be safely invoked concurrently from anywhere, so you can implement “like” features, global sequences or usage monitoring systems in highly concurrent applications for free.

You can share your counters with any other internal application and still be sure they won't collide.

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

Temporary dataRedis allows us to self expire keys after a time has passed. You can use this mechanism for a simple cache

If you operate on a key with expiration time, you can change its value and still keep the expiration going. By combining a decrementing counter with an expiration time, implementing usage quotas is trivial

Also, you can inspect which keys you have in your server efficiently using SCAN commands

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

bloom filtersbloom filter: space-efficient probabilistic data structure that is used to test whether an element is a member of a set. False positive matches are possible, but false negatives are not.

Redis bit operations make easy to implement bloom filters

We are using bloom filters for checking uniqueness of user names and reserved words without going to postgresql

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

nginx + lua + redis

Multiple levels of cache by using Redis on the webserver/middleware layer

http://wiki.nginx.org/HttpRedis

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com

summarizing* Redis is more powerful than it seems

* Very fast, easy to use, simple, good documentation

* In-memory data structures, distributed, shared and persisted

* Good as data store, intermediate data store, cache or queue

* Lots of use cases, both in huge and smaller systems

You should probably use it a lot more

javier ramirez @supercoco9 https://teowaki.com https://datawaki.com https://datawaki.com

Find related links at

https://teowaki.com/teams/javier-community/link-categories/redis

gracias!¡If you enjoyed this talk, please sign up for

https://teowaki.com

Don't forget to invite your friends too!

Javier Ramírez@supercoco9