Redis: Need for speed

159
REDIS: Need for speed @elena_kolevska Elena Kolevska 1 About Our Company REDIS: NEED FOR SPEED Elena Kolevska

Transcript of Redis: Need for speed

Page 1: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 1

About Our Company

REDIS: NEED FOR SPEEDElena Kolevska

Page 2: Redis: Need for speed

2

Page 3: Redis: Need for speed

Hello World!

A free spirit, traveller, capoeirista, mum, music lover, wannabe entrepreneur,

proud geek.

Elena Kolevska Software engineer

We're going to talk about Redis:

Things you didn't know

How much faster does it get?

2

Page 4: Redis: Need for speed
Page 5: Redis: Need for speed

HOW MUCH FASTER DOES IT GET?

Page 6: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 4

How much faster does it get?

OUR SCENARIO: TWITTER ANALYZER DASHBOARD

751TOTAL TWEETS

751Main stream 120sub-stream foo 107sub-stream bar

...Foo

Bar

Baz

0 30 60 90 120

86

107

120

Page 7: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 4

How much faster does it get?

OUR SCENARIO: TWITTER ANALYZER DASHBOARD

751TOTAL TWEETS

751Main stream 120sub-stream foo 107sub-stream bar

...Foo

Bar

Baz

0 30 60 90 120

86

107

120

Total tweets

Page 8: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 4

How much faster does it get?

OUR SCENARIO: TWITTER ANALYZER DASHBOARD

751TOTAL TWEETS

751Main stream 120sub-stream foo 107sub-stream bar

...Foo

Bar

Baz

0 30 60 90 120

86

107

120

Total tweets Main Stream

Page 9: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 4

How much faster does it get?

OUR SCENARIO: TWITTER ANALYZER DASHBOARD

751TOTAL TWEETS

751Main stream 120sub-stream foo 107sub-stream bar

...

Substream:keyword 1

Foo

Bar

Baz

0 30 60 90 120

86

107

120

Total tweets Main Stream

Page 10: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 4

How much faster does it get?

OUR SCENARIO: TWITTER ANALYZER DASHBOARD

751TOTAL TWEETS

751Main stream 120sub-stream foo 107sub-stream bar

...

Substream:keyword 1 Substream:keyword 2

Foo

Bar

Baz

0 30 60 90 120

86

107

120

Total tweets Main Stream

Page 11: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 4

How much faster does it get?

OUR SCENARIO: TWITTER ANALYZER DASHBOARD

751TOTAL TWEETS

751Main stream 120sub-stream foo 107sub-stream bar

...

Substream:keyword 1 Substream:keyword 2

Foo

Bar

Baz

0 30 60 90 120

86

107

120

Total tweets

Scores

Main Stream

Page 12: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 5

How much faster does it get?

THE PROCESS:

This is a tweet about the

words foo and bar

Page 13: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 5

How much faster does it get?

THE PROCESS:

This is a tweet about the

words foo and bar

Send tweet to main stream

Main stream

Page 14: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 5

How much faster does it get?

THE PROCESS:

This is a tweet about the

words foo and bar

Send tweet to main stream

Main stream

Increase counter

of total tweets

Total tweets counter

Page 15: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 5

How much faster does it get?

THE PROCESS:

This is a tweet about the

words foo and bar

foo

Send tweet to appropriate sub-stream

Stream foo

Stream barbar

Send tweet to main stream

Main stream

Increase counter

of total tweets

Total tweets counter

Page 16: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 5

How much faster does it get?

THE PROCESS:

This is a tweet about the

words foo and bar

foo

Send tweet to appropriate sub-stream

Stream foo

Stream barbar

Increase counters for

streams foo/bar

Counter foo

Counter bar

Send tweet to main stream

Main stream

Increase counter

of total tweets

Total tweets counter

Page 17: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 6

How much faster does it get?

THE STEPS:

•Save the complete tweet

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for total tweets

•Add tweet to main feed

•Increase counter for found keywords

•Add tweet to sub-feed

Page 18: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 7

How much faster does it get?

Redis is TCP server using client/server model. A request to the server is accomplished in two steps:

•The client sends a query to the server, and reads from the socket, usually in a blocking way, for the server response

•The server processes the command and sends the response back to the client

Client Server

Page 19: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 7

How much faster does it get?

Redis is TCP server using client/server model. A request to the server is accomplished in two steps:

•The client sends a query to the server, and reads from the socket, usually in a blocking way, for the server response

•The server processes the command and sends the response back to the client

Client Server

Networking link

Page 20: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 7

How much faster does it get?

Redis is TCP server using client/server model. A request to the server is accomplished in two steps:

•The client sends a query to the server, and reads from the socket, usually in a blocking way, for the server response

•The server processes the command and sends the response back to the client

Client Server

Page 21: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 7

How much faster does it get?

Redis is TCP server using client/server model. A request to the server is accomplished in two steps:

•The client sends a query to the server, and reads from the socket, usually in a blocking way, for the server response

•The server processes the command and sends the response back to the client

Client Server

Request from client to server

Page 22: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 7

How much faster does it get?

Redis is TCP server using client/server model. A request to the server is accomplished in two steps:

•The client sends a query to the server, and reads from the socket, usually in a blocking way, for the server response

•The server processes the command and sends the response back to the client

Client Server

Request from client to server

Response from server to client

Page 23: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 8

How much faster does it get?

Redis is TCP server using client/server model. A request to the server is accomplished in two steps:

•The client sends a query to the server, and reads from the socket, usually in a blocking way, for the server response

•The server processes the command and sends the response back to the client

Client Server

Request from client to server

Response from server to client

RTT: Round Trip Time

Page 24: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 9

How much faster does it get?

THE STEPS:

SET request to the server

•Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

Page 25: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 9

How much faster does it get?

THE STEPS:

SET request to the server

1Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

Page 26: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 10

How much faster does it get?

THE STEPS:Number of requests to

server •Save the tweet

•Add tweet to main feed•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

1

Page 27: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 10

How much faster does it get?

THE STEPS:

LPUSH

Number of requests to

server •Save the tweet

•Add tweet to main feed•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

1

Page 28: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 10

How much faster does it get?

THE STEPS:

LPUSH

Number of requests to

server •Save the tweet

•Add tweet to main feed•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

2

Page 29: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 10

How much faster does it get?

THE STEPS:

LPUSH

Number of requests to

server •Save the tweet

•Add tweet to main feed•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

+ LTRIM

2

Page 30: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 10

How much faster does it get?

THE STEPS:

LPUSH

Number of requests to

server •Save the tweet

•Add tweet to main feed•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

+ LTRIM

3

Page 31: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 11

How much faster does it get?

THE STEPS:Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

3

Page 32: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 11

How much faster does it get?

THE STEPS:

INCR

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

3

Page 33: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 11

How much faster does it get?

THE STEPS:

INCR

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

4

Page 34: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 12

How much faster does it get?

THE STEPS:Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

4

Page 35: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 12

How much faster does it get?

THE STEPS:

SMEMBERS

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

4

Page 36: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 12

How much faster does it get?

THE STEPS:

SMEMBERS

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

5

Page 37: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 13

How much faster does it get?

THE STEPS:Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

5

Page 38: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 13

How much faster does it get?

THE STEPS:

Logic on client side

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

5

Page 39: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 14

How much faster does it get?

THE STEPS:Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords•Add tweet to sub-feed

•Update score

5

Page 40: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 14

How much faster does it get?

THE STEPS:

INCR

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords•Add tweet to sub-feed

•Update score

5

Page 41: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 14

How much faster does it get?

THE STEPS:

INCR

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords•Add tweet to sub-feed

•Update score

6

Page 42: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 15

How much faster does it get?

THE STEPS:Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed•Update score

6

Page 43: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 15

How much faster does it get?

THE STEPS:

LPUSH

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed•Update score

6

Page 44: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 15

How much faster does it get?

THE STEPS:

LPUSH

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed•Update score

7

Page 45: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 15

How much faster does it get?

THE STEPS:

LPUSH

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed•Update score

7

+ LTRIM

Page 46: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 15

How much faster does it get?

THE STEPS:

LPUSH

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed•Update score

+ LTRIM

8

Page 47: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 16

How much faster does it get?

THE STEPS:Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

8

Page 48: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 16

How much faster does it get?

THE STEPS:

ZINCRBY

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

8

Page 49: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 16

How much faster does it get?

THE STEPS:

ZINCRBY

Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

9

Page 50: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 17

How much faster does it get?

THE STEPS:Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

9

Page 51: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 17

How much faster does it get?

THE STEPS:Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

9

} + 4 requests for every found keyword

Page 52: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 17

How much faster does it get?

THE STEPS:Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score

13?

} + 4 requests for every found keyword

Page 53: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 17

How much faster does it get?

THE STEPS:Number of requests to

server •Save the tweet

•Add tweet to main feed

•Increase counter for total tweets

•Get all monitored keywords

•Check tweet for any keywords

•Increase counter for found keywords

•Add tweet to sub-feed

•Update score } + 4 requests for every found keyword

17?

Page 54: Redis: Need for speed
Page 55: Redis: Need for speed

LEVEL1: PIPELINING

Page 56: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 19

How much faster does it get?

Using the PRedis library for PHP</php

$keywords = $client->smembers("keywords");

$responses = $client->pipeline(function ($pipe) use ($keywords) {

$pipe->set(...); // Save the tweet $pipe->lpush(...); // Save the tweet to main feed $pipe->ltrim(...); // Trim the main feed to X tweets so it doesn't grow forever

foreach ($keywords as $keyword) { $pipe->incr(...); // Increase the counter for the keyword $pipe->lpush(...); // Add to the subbed $pipe->ltrim(...); // Trim the stream to X tweets $pipe->zincrby(...); // Update score }

});

Page 57: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 19

How much faster does it get?

Using the PRedis library for PHP</php

$keywords = $client->smembers("keywords");

$responses = $client->pipeline(function ($pipe) use ($keywords) {

$pipe->set(...); // Save the tweet $pipe->lpush(...); // Save the tweet to main feed $pipe->ltrim(...); // Trim the main feed to X tweets so it doesn't grow forever

foreach ($keywords as $keyword) { $pipe->incr(...); // Increase the counter for the keyword $pipe->lpush(...); // Add to the subbed $pipe->ltrim(...); // Trim the stream to X tweets $pipe->zincrby(...); // Update score }

});

Page 58: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 19

How much faster does it get?

Using the PRedis library for PHP 1Number of requests to

server </php

$keywords = $client->smembers("keywords");

$responses = $client->pipeline(function ($pipe) use ($keywords) {

$pipe->set(...); // Save the tweet $pipe->lpush(...); // Save the tweet to main feed $pipe->ltrim(...); // Trim the main feed to X tweets so it doesn't grow forever

foreach ($keywords as $keyword) { $pipe->incr(...); // Increase the counter for the keyword $pipe->lpush(...); // Add to the subbed $pipe->ltrim(...); // Trim the stream to X tweets $pipe->zincrby(...); // Update score }

});

Page 59: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 20

How much faster does it get?

Using the PRedis library for PHP 2Number of requests to

server </php

$keywords = $client->smembers("keywords");

$responses = $client->pipeline(function ($pipe) use ($keywords) {

$pipe->set(...); // Save the tweet $pipe->lpush(...); // Save the tweet to main feed $pipe->ltrim(...); // Trim the main feed to X tweets so it doesn't grow forever

foreach ($keywords as $keyword) { $pipe->incr(...); // Increase the counter for the keyword $pipe->lpush(...); // Add to the subbed $pipe->ltrim(...); // Trim the stream to X tweets $pipe->zincrby(...); // Update score }

});

Page 60: Redis: Need for speed
Page 61: Redis: Need for speed

LEVEL2: LUA SCRIPTING

Page 62: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 22

How much faster does it get?

Create a hello.lua file:

return "Hello"

> redis-cli --eval /path/to/script/hello.lua"Hello"

Page 63: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 22

How much faster does it get?

Create a hello.lua file:

return "Hello"

> redis-cli --eval /path/to/script/hello.lua"Hello"

Page 64: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 23

How much faster does it get?

hello.lua:local tweet = ARGV[1] local key_tweet = KEYS[1] local key_keywords = KEYS[2] local key_total_tweets_count = KEYS[3] local key_scores = KEYS[4] local key_main_feed = KEYS[5]

redis.call("SET", key_tweet, tweet) -- Save the tweet redis.call("INCR", key_total_tweets_count) -- Increase the total tweet count redis.call("LPUSH", key_main_feed, tweet) -- Push the tweet to the main feed redis.call("LTRIM", key_main_feed, 0, 100) -- Trim the main feed

local keywords = redis.call("SMEMBERS", key_keywords) -- Get the keywords

for i, name in ipairs(keywords) do if string.find(tweet, name) then local substream_name = "sub_feed:" .. name redis.call("LPUSH", substream_name, tweet) -- Push the tweet to the sub feed redis.call("LTRIM", substream_name, 0, 100) -- Trim the sub feed redis.call("ZINCRBY", key_scores, 1, name) -- Increment the score for the keyword in the leaderboard end end

return "OK"

Page 65: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 24

How much faster does it get?

> redis-cli --eval hello.lua tweet_123 keywords ... , "A tweet about the words foo and bar""OK"

Page 66: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 24

How much faster does it get?

> redis-cli --eval hello.lua tweet_123 keywords ... , "A tweet about the words foo and bar""OK"

1!Number of requests to

server

Page 67: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 25

How much faster does it get?

SCRIPT

•Evaluates a script cached on the server side by its SHA1 digest. The command is otherwise identical to EVAL.

> redis-cli SCRIPT LOAD "$(cat hello.lua)""6d52847f03028ab1d4620b60dd6ef4a14c8727d7"

> redis-cli evalsha 6d52847f03028ab1d4620b60dd6ef4a14c8727d7 5 \ > tweet_123 keywords ... "A tweet about the words foo and bar""OK"

EVALSHA

•Load a script into the scripts cache, without executing it. Returns a SHA-1 digest of the script.

Page 68: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 26

How much faster does it get?

CONS:

•While your script is running, everything else is on hold

•Trickier to maintain

PROS:•Speed

•Atomicity

•Logic moves out of your app layer

•Logic moves out of your app layer

Page 69: Redis: Need for speed
Page 70: Redis: Need for speed

WARP DRIVE: REDIS MODULES

Page 71: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 28

How much faster does it get?

What are Redis modules?

•Dynamically loaded libraries

•Written in C

•Almost as fast as the Redis core

•Let you extend Redis commands, create new data structures, access data almost as fast as native Redis commands

•Add-ons to Redis

•Coming in version 4.0, currently in Beta (RC)

Page 72: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 29

How much faster does it get?

Layers of the Modules API:

•Low-level: Close to native access to core data structures

•High-level: Client-like access to core and modules' commands

Page 73: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 30

How much faster does it get?

0

0.35

0.7

1.05

1.4

Python Lua M:HighLevel M:LowLevel

1.2 1.25

1.05

0.1

Time needed for summing 1 000 000

Sorted Set Scores

Statistics from Itamar Haber @ redislabs

Page 74: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 31

How much faster does it get?

Page 75: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 32

How much faster does it get?

Page 76: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 33

How much faster does it get?

Page 77: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 34

How much faster does it get?

High level API

RedisModule_Call(ctx,"INCR","sc",argv[1],"10");

c -- Null terminated C string pointer.

b -- C buffer, two arguments needed: C string pointer and size_t length.

s -- RedisModuleString as received in argv or by other Redis module APIs returning a RedisModuleString object.

l -- Long long integer.

v -- Array of RedisModuleString objects.

! -- This modifier just tells the function to replicate the command to slaves and AOF. It is ignored from the point of view of arguments parsing.

Page 78: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 34

How much faster does it get?

High level API

RedisModule_Call(ctx,"INCR","sc",argv[1],"10");

The context object

c -- Null terminated C string pointer.

b -- C buffer, two arguments needed: C string pointer and size_t length.

s -- RedisModuleString as received in argv or by other Redis module APIs returning a RedisModuleString object.

l -- Long long integer.

v -- Array of RedisModuleString objects.

! -- This modifier just tells the function to replicate the command to slaves and AOF. It is ignored from the point of view of arguments parsing.

Page 79: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 34

How much faster does it get?

High level API

RedisModule_Call(ctx,"INCR","sc",argv[1],"10");

Command

c -- Null terminated C string pointer.

b -- C buffer, two arguments needed: C string pointer and size_t length.

s -- RedisModuleString as received in argv or by other Redis module APIs returning a RedisModuleString object.

l -- Long long integer.

v -- Array of RedisModuleString objects.

! -- This modifier just tells the function to replicate the command to slaves and AOF. It is ignored from the point of view of arguments parsing.

Page 80: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 34

How much faster does it get?

High level API

RedisModule_Call(ctx,"INCR","sc",argv[1],"10");

Arguments

c -- Null terminated C string pointer.

b -- C buffer, two arguments needed: C string pointer and size_t length.

s -- RedisModuleString as received in argv or by other Redis module APIs returning a RedisModuleString object.

l -- Long long integer.

v -- Array of RedisModuleString objects.

! -- This modifier just tells the function to replicate the command to slaves and AOF. It is ignored from the point of view of arguments parsing.

Page 81: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 34

How much faster does it get?

High level API

RedisModule_Call(ctx,"INCR","sc",argv[1],"10");

Format specifier

c -- Null terminated C string pointer.

b -- C buffer, two arguments needed: C string pointer and size_t length.

s -- RedisModuleString as received in argv or by other Redis module APIs returning a RedisModuleString object.

l -- Long long integer.

v -- Array of RedisModuleString objects.

! -- This modifier just tells the function to replicate the command to slaves and AOF. It is ignored from the point of view of arguments parsing.

Page 82: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 35

How much faster does it get?

High level API

RedisModule_Call(ctx,"INCR","sc",argv[1],"10");

c -- Null terminated C string pointer.

b -- C buffer, two arguments needed: C string pointer and size_t length.

s -- RedisModuleString as received in argv or by other Redis module APIs returning a RedisModuleString object.

l -- Long long integer.

v -- Array of RedisModuleString objects.

! -- This modifier just tells the function to replicate the command to slaves and AOF. It is ignored from the point of view of arguments parsing.

Page 83: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 35

How much faster does it get?

High level API

RedisModule_Call(ctx,"INCR","sc",argv[1],"10");

Format specifier

c -- Null terminated C string pointer.

b -- C buffer, two arguments needed: C string pointer and size_t length.

s -- RedisModuleString as received in argv or by other Redis module APIs returning a RedisModuleString object.

l -- Long long integer.

v -- Array of RedisModuleString objects.

! -- This modifier just tells the function to replicate the command to slaves and AOF. It is ignored from the point of view of arguments parsing.

Page 84: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 36

How much faster does it get?

High level API

RedisModule_Call(ctx,"INCR","sc",argv[1],"10");

c -- Null terminated C string pointer.

b -- C buffer, two arguments needed: C string pointer and size_t length.

s -- RedisModuleString as received in argv or by other Redis module APIs returning a RedisModuleString object.

l -- Long long integer.

v -- Array of RedisModuleString objects.

! -- This modifier just tells the function to replicate the command to slaves and AOF. It is ignored from the point of view of arguments parsing.

Page 85: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 36

How much faster does it get?

High level API

RedisModule_Call(ctx,"INCR","sc",argv[1],"10");

Format specifier

c -- Null terminated C string pointer.

b -- C buffer, two arguments needed: C string pointer and size_t length.

s -- RedisModuleString as received in argv or by other Redis module APIs returning a RedisModuleString object.

l -- Long long integer.

v -- Array of RedisModuleString objects.

! -- This modifier just tells the function to replicate the command to slaves and AOF. It is ignored from the point of view of arguments parsing.

Page 86: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 37

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "tweet_processor", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "tweet.process", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

Page 87: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 37

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "tweet_processor", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "tweet.process", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

Definitions of the API

Page 88: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 37

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "tweet_processor", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "tweet.process", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

Definitions of the API

Page 89: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 37

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "tweet_processor", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "tweet.process", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

Definitions of the APICalled whenever the module is loaded Must be present in each Redis module

Page 90: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 37

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "tweet_processor", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "tweet.process", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

Definitions of the API

Register the module or error out

Page 91: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 37

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "tweet_processor", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "tweet.process", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

Definitions of the API

Register the command or error out

Page 92: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 37

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "tweet_processor", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "tweet.process", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

Definitions of the API

Command name

Page 93: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 37

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "tweet_processor", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "tweet.process", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

Definitions of the API

Function name

Page 94: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 38

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "process_tweet", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "process_tweet.rand", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

Page 95: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 38

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "process_tweet", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "process_tweet.rand", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

The logic of the module

Page 96: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 39

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "process_tweet", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "process_tweet.rand", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {

// We need EXACTLY 5 arguments if (argc != 5) return RedisModule_WrongArity(ctx);

RedisModule_AutoMemory(ctx);

RedisModuleCallReply *reply; reply = RedisModule_Call(ctx, "INCR", "s", argv[3]); RedisModule_ReplyWithCallReply(ctx, reply);

return REDISMODULE_OK; }

Page 97: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 39

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "process_tweet", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "process_tweet.rand", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {

// We need EXACTLY 5 arguments if (argc != 5) return RedisModule_WrongArity(ctx);

RedisModule_AutoMemory(ctx);

RedisModuleCallReply *reply; reply = RedisModule_Call(ctx, "INCR", "s", argv[3]); RedisModule_ReplyWithCallReply(ctx, reply);

return REDISMODULE_OK; }

Enable automatic memory management

Page 98: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 39

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "process_tweet", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "process_tweet.rand", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {

// We need EXACTLY 5 arguments if (argc != 5) return RedisModule_WrongArity(ctx);

RedisModule_AutoMemory(ctx);

RedisModuleCallReply *reply; reply = RedisModule_Call(ctx, "INCR", "s", argv[3]); RedisModule_ReplyWithCallReply(ctx, reply);

return REDISMODULE_OK; }

Call Redis commands

Page 99: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 39

How much faster does it get?

Anatomy of a module

#include "redismodule.h" #include <stdlib.h>

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // ... }

int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { // Register the module or error out if (RedisModule_Init(ctx, "process_tweet", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR;

// Register the command or error out if (RedisModule_CreateCommand(ctx, "process_tweet.rand", ProcessTweet_RedisCommand,

"readonly", 1,1,1) == REDISMODULE_ERR) return REDISMODULE_ERR;

return REDISMODULE_OK; }

int ProcessTweet_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {

// We need EXACTLY 5 arguments if (argc != 5) return RedisModule_WrongArity(ctx);

RedisModule_AutoMemory(ctx);

RedisModuleCallReply *reply; reply = RedisModule_Call(ctx, "INCR", "s", argv[3]); RedisModule_ReplyWithCallReply(ctx, reply);

return REDISMODULE_OK; }

Reply with a call object

Page 100: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 40

How much faster does it get?

Low level API

RedisModule_AutoMemory(ctx);

RedisModuleKey *key;

key = RedisModule_OpenKey(ctx,argv[1],REDISMODULE_READ|REDISMODULE_WRITE);

if (RedisModule_KeyType(key) == REDISMODULE_KEYTYPE_EMPTY) { RedisModule_StringSet(key,argv[2]); }

RedisModule_CloseKey(key);

Page 101: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 40

How much faster does it get?

Low level API

RedisModule_AutoMemory(ctx);

RedisModuleKey *key;

key = RedisModule_OpenKey(ctx,argv[1],REDISMODULE_READ|REDISMODULE_WRITE);

if (RedisModule_KeyType(key) == REDISMODULE_KEYTYPE_EMPTY) { RedisModule_StringSet(key,argv[2]); }

RedisModule_CloseKey(key);

Open a key. Return a key pointer

Page 102: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 40

How much faster does it get?

Low level API

RedisModule_AutoMemory(ctx);

RedisModuleKey *key;

key = RedisModule_OpenKey(ctx,argv[1],REDISMODULE_READ|REDISMODULE_WRITE);

if (RedisModule_KeyType(key) == REDISMODULE_KEYTYPE_EMPTY) { RedisModule_StringSet(key,argv[2]); }

RedisModule_CloseKey(key);

Checks the type of the key

Page 103: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 40

How much faster does it get?

Low level API

RedisModule_AutoMemory(ctx);

RedisModuleKey *key;

key = RedisModule_OpenKey(ctx,argv[1],REDISMODULE_READ|REDISMODULE_WRITE);

if (RedisModule_KeyType(key) == REDISMODULE_KEYTYPE_EMPTY) { RedisModule_StringSet(key,argv[2]); }

RedisModule_CloseKey(key);

Set a string value for a key

Page 104: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 40

How much faster does it get?

Low level API

RedisModule_AutoMemory(ctx);

RedisModuleKey *key;

key = RedisModule_OpenKey(ctx,argv[1],REDISMODULE_READ|REDISMODULE_WRITE);

if (RedisModule_KeyType(key) == REDISMODULE_KEYTYPE_EMPTY) { RedisModule_StringSet(key,argv[2]); }

RedisModule_CloseKey(key);

Close the key

Page 105: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 41

How much faster does it get?

Compiling

$ gcc -fPIC -std=gnu99 -c -o process_tweet process_tweet.c $ ld -o process_tweet.so process_tweet.o -shared -Bsymbolic -lc

On Linux:

$ gcc -dynamic -fno-common -std=gnu99 -c -o process_tweet.o process_tweet.c $ ld -o process_tweet.so process_tweet.o -bundle -undefined dynamic_lookup -lc

On OSX:

Loading

./redis-unstable/src/redis-server --loadmodule ./process_tweet.so

Page 106: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 42

How much faster does it get?

Calling the command

127.0.01:6379> tweet.process tweet_id:42 "This is my tweet about the words foo and bar" ...

Our command

Page 107: Redis: Need for speed
Page 108: Redis: Need for speed

THINGS YOU DIDN'T KNOW

Page 109: Redis: Need for speed

THINGS YOU probably DIDN'T KNOW

Page 110: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 45

Big O Notation: O(1) commands

•ZSCORE

•LPOP, BLPOP, LPUSHX, BRPOPLPUSH

•EXISTS

•GET, GETSET, HGET, GETBIT

•GETRANGE, SETRANGE

•HLEN, HSTRLEN

•LLEN

•PFADD, PFCOUNT

•SISMEMBER

•APPEND

Things you didn't know

Page 111: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 45

Big O Notation: O(1) commands

•ZSCORE

•LPOP, BLPOP, LPUSHX, BRPOPLPUSH

•EXISTS

•GET, GETSET, HGET, GETBIT

•GETRANGE, SETRANGE

•HLEN, HSTRLEN

•LLEN

•PFADD, PFCOUNT

•SISMEMBER

•APPEND

Things you didn't know

O(N), but can be considered O(1) for short substrings

Page 112: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 45

Big O Notation: O(1) commands

•ZSCORE

•LPOP, BLPOP, LPUSHX, BRPOPLPUSH

•EXISTS

•GET, GETSET, HGET, GETBIT

•GETRANGE, SETRANGE

•HLEN, HSTRLEN

•LLEN

•PFADD, PFCOUNT

•SISMEMBER

•APPEND

Things you didn't know

Page 113: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 46

Things you didn't know

Expiration and eviction

Keys are expired in two ways:

•Active

•Passive 1

3 2

Test 20 random keys from the set of keys with an associated expire

10 times per second

Delete all the keys found expiredIf more than 25% of keys were expired, start again from step 1

Page 114: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

PublisherSubscriber A Subscriber B

Things you didn't know

Page 115: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

PublisherSubscriber A Subscriber B

Things you didn't know

Page 116: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1

PublisherSubscriber A Subscriber B

Things you didn't know

Page 117: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1

127.0.0.1:6379> subscribe bgwebsummit sofia

PublisherSubscriber A Subscriber B

Things you didn't know

Page 118: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1

127.0.0.1:6379> subscribe bgwebsummit sofia

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 1) "subscribe" 2) "sofia" 3) (integer) 2

PublisherSubscriber A Subscriber B

Things you didn't know

Page 119: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1

127.0.0.1:6379> subscribe bgwebsummit sofia

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 1) "subscribe" 2) "sofia" 3) (integer) 2

PublisherSubscriber A Subscriber B

127.0.0.1:6379> pubsub channels

Things you didn't know

Page 120: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1

127.0.0.1:6379> subscribe bgwebsummit sofia

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 1) "subscribe" 2) "sofia" 3) (integer) 2

PublisherSubscriber A Subscriber B

127.0.0.1:6379> pubsub channels

1) "sofia" 2) "bgwebsummit"

Things you didn't know

Page 121: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 127.0.0.1:6379> publish bgwebsummit Hello

127.0.0.1:6379> subscribe bgwebsummit sofia

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 1) "subscribe" 2) "sofia" 3) (integer) 2

PublisherSubscriber A Subscriber B

127.0.0.1:6379> pubsub channels

1) "sofia" 2) "bgwebsummit"

Things you didn't know

Page 122: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 127.0.0.1:6379> publish bgwebsummit Hello

(integer) 1

127.0.0.1:6379> subscribe bgwebsummit sofia

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 1) "subscribe" 2) "sofia" 3) (integer) 2

PublisherSubscriber A Subscriber B

127.0.0.1:6379> pubsub channels

1) "sofia" 2) "bgwebsummit"

Things you didn't know

Page 123: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 127.0.0.1:6379> publish bgwebsummit Hello

(integer) 11) "message" 2) "bgwebsummit" 3) "Hello"

127.0.0.1:6379> subscribe bgwebsummit sofia

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 1) "subscribe" 2) "sofia" 3) (integer) 2

PublisherSubscriber A Subscriber B

127.0.0.1:6379> pubsub channels

1) "sofia" 2) "bgwebsummit"

Things you didn't know

Page 124: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 127.0.0.1:6379> publish bgwebsummit Hello

(integer) 11) "message" 2) "bgwebsummit" 3) "Hello"

127.0.0.1:6379> subscribe bgwebsummit sofia

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 1) "subscribe" 2) "sofia" 3) (integer) 2

1) "message" 2) "bgwebsummit" 3) "Hello"

PublisherSubscriber A Subscriber B

127.0.0.1:6379> pubsub channels

1) "sofia" 2) "bgwebsummit"

Things you didn't know

Page 125: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 127.0.0.1:6379> publish bgwebsummit Hello

(integer) 11) "message" 2) "bgwebsummit" 3) "Hello"

127.0.0.1:6379> subscribe bgwebsummit sofia

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 1) "subscribe" 2) "sofia" 3) (integer) 2

1) "message" 2) "bgwebsummit" 3) "Hello"

PublisherSubscriber A Subscriber B

127.0.0.1:6379> publish sofia Zdraveite

127.0.0.1:6379> pubsub channels

1) "sofia" 2) "bgwebsummit"

Things you didn't know

Page 126: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 47

Pub Sub

127.0.0.1:6379> subscribe bgwebsummit

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 127.0.0.1:6379> publish bgwebsummit Hello

(integer) 11) "message" 2) "bgwebsummit" 3) "Hello"

127.0.0.1:6379> subscribe bgwebsummit sofia

Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "bgwebsummit" 3) (integer) 1 1) "subscribe" 2) "sofia" 3) (integer) 2

1) "message" 2) "bgwebsummit" 3) "Hello"

PublisherSubscriber A Subscriber B

127.0.0.1:6379> publish sofia Zdraveite

127.0.0.1:6379> pubsub channels

1) "sofia" 2) "bgwebsummit"

1) "message" 2) "sofia" 3) "Zdraveite"

Things you didn't know

Page 127: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 48

Things you didn't know

Pub Sub

•PSUBSCRIBE can be used to subscribe to all channels matching a pattern

•Once a Redis client enters the subscriber mode, it can no longer perform any operation other than subscribe to more channels or unsubscribe from the subscribed ones. An additional connection will be needed in order to publish messages.

•Publishing on db 10, will be heard by a subscriber on db 1

Page 128: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 49

Persistence

Persistence options:

•RDB (Point-in-time snapshots)

•AOF (Append only file)

•Combination of AOF and RDB

•No persistence

Things you didn't know

Page 129: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 50

Geo API

•Search a GeoSet for members within ‘radius’ distance from given coordinates

•Return the distance in unit (meters by default) between elem1 and elem2 in a GeoSet

Things you didn't know

•Storing and querying named pairs of longitude/latitude coordinates into Redis keys

•Sorted sets with GeoHashing

Page 130: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 51

redis-cli

•redis-cli --bigkeys•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 131: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 51

redis-cli

•redis-cli --bigkeys•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

> redis-cli --bigkeys

•cat /commands.txt| redis-cli

Things you didn't know

Page 132: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 51

redis-cli

•redis-cli --bigkeys•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

> redis-cli --bigkeys# Scanning the entire keyspace to find biggest keys as well as # average sizes per key type. You can use -i 0.1 to sleep 0.1 sec # per 100 SCAN commands (not usually needed).

[00.00%] Biggest string found so far 'foo1' with 10285 bytes [00.00%] Biggest zset found so far 'foo2' with 1 members [00.00%] Biggest string found so far 'foo4' with 100095 bytes [00.00%] Biggest set found so far 'foo5' with 1 members [12.66%] Biggest string found so far 'foo5' with 13505361 bytes [25.32%] Biggest list found so far 'foo6' with 10001 items -------- summary ------- Sampled 79 keys in the keyspace! Total key length in bytes is 3243 (avg len 41.05)

Biggest string found 'foo5' has 13505361 bytes Biggest list found 'foo6' has 10001 items Biggest set found 'foo5' has 12 members Biggest zset found 'foo7' has 8 members

50 strings with 13946784 bytes (63.29% of keys, avg size 278935.68) 3 lists with 10007 items (03.80% of keys, avg size 3335.67) 3 sets with 3 members (03.80% of keys, avg size 1.00) 0 hashs with 0 fields (00.00% of keys, avg size 0.00) 23 zsets with 80 members (29.11% of keys, avg size 3.48)

•cat /commands.txt| redis-cli

Things you didn't know

Page 133: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 52

redis-cli

•redis-cli --bigkeys

•redis-cli monitor•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 134: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 52

redis-cli

•redis-cli --bigkeys

•redis-cli monitor•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

> redis-cli monitor

•cat /commands.txt| redis-cli

Things you didn't know

Page 135: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 52

redis-cli

•redis-cli --bigkeys

•redis-cli monitor•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

OK 1491054587.455533 [0 127.0.0.1:35532] "zadd" "foo" "1" "one" 1491054591.768172 [0 127.0.0.1:35532] "zadd" "foo" "2" "two" 1491054605.088297 [0 127.0.0.1:35532] "get" "bar" 1491054609.336546 [0 127.0.0.1:35532] "del" "bar" 1491054618.424296 [0 127.0.0.1:35532] "set" "foobar" "here I am" 1491054669.240038 [0 127.0.0.1:35532] "zcount" "foo" "-inf" "+inf"

> redis-cli monitor

•cat /commands.txt| redis-cli

Things you didn't know

Page 136: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 53

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'•redis-cli --stat

•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 137: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 53

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'•redis-cli --stat

•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

> redis-cli --scan --pattern '*foo*'

•cat /commands.txt| redis-cli

Things you didn't know

Page 138: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 53

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'•redis-cli --stat

•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

key-foo12 key-foo23 foo24 foobarbaz foobarbaz43 foo:bar:12

> redis-cli --scan --pattern '*foo*'

•cat /commands.txt| redis-cli

Things you didn't know

Page 139: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 54

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 140: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 54

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

> redis-cli --stat

•cat /commands.txt| redis-cli

Things you didn't know

Page 141: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 54

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat•redis-cli -x set foo < /etc/services

•redis-cli get bar > ~/bar.txt

------- data ------ -------------------------------------- load ----------------------------------- - child - keys mem clients blocked requests connections 506 1015.00K 1 0 24 (+0) 7 506 1015.00K 1 0 25 (+1) 7 506 3.40M 51 0 60461 (+60436) 57 506 3.40M 51 0 146425 (+85964) 107 507 3.40M 51 0 233844 (+87419) 157 507 3.40M 51 0 321715 (+87871) 207 508 3.40M 51 0 408642 (+86927) 257 508 3.40M 51 0 497038 (+88396) 257

> redis-cli --stat

•cat /commands.txt| redis-cli

Things you didn't know

Page 142: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 55

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt•redis-cli get bar > ~/bar.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 143: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 55

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt•redis-cli get bar > ~/bar.txt

> cat /etc/foo.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 144: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 55

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt•redis-cli get bar > ~/bar.txt

A long long text In multiple lines

> cat /etc/foo.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 145: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 55

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt•redis-cli get bar > ~/bar.txt

A long long text In multiple lines

> cat /etc/foo.txt

> redis-cli -x set foo < /etc/foo.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 146: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 55

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt•redis-cli get bar > ~/bar.txt

A long long text In multiple lines

> cat /etc/foo.txt

> redis-cli -x set foo < /etc/foo.txtOK

•cat /commands.txt| redis-cli

Things you didn't know

Page 147: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 55

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt•redis-cli get bar > ~/bar.txt

A long long text In multiple lines

> cat /etc/foo.txt

> redis-cli -x set foo < /etc/foo.txtOK

> redis-cli 127.0.0.1:6379>

•cat /commands.txt| redis-cli

Things you didn't know

Page 148: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 55

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt•redis-cli get bar > ~/bar.txt

A long long text In multiple lines

> cat /etc/foo.txt

> redis-cli -x set foo < /etc/foo.txtOK

> redis-cli 127.0.0.1:6379> get foo

•cat /commands.txt| redis-cli

Things you didn't know

Page 149: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 55

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt•redis-cli get bar > ~/bar.txt

A long long text In multiple lines

> cat /etc/foo.txt

> redis-cli -x set foo < /etc/foo.txtOK

> redis-cli 127.0.0.1:6379>"A long long text\nIn multiple lines\n"

get foo

•cat /commands.txt| redis-cli

Things you didn't know

Page 150: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 56

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt

•redis-cli get foo > ~/bar.txt

A long long text In multiple lines

> cat /etc/foo.txt

> redis-cli -x set foo < /etc/foo.txtOK

> redis-cli 127.0.0.1:6379>"A long long text\nIn multiple lines\n"

get foo

•cat /commands.txt| redis-cli

Things you didn't know

Page 151: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 56

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt

•redis-cli get foo > ~/bar.txt

A long long text In multiple lines

> cat /etc/foo.txt

> redis-cli -x set foo < /etc/foo.txtOK

> redis-cli 127.0.0.1:6379>"A long long text\nIn multiple lines\n"

get foo

127.0.0.1:6379> set foo "A long long text"

•cat /commands.txt| redis-cli

Things you didn't know

Page 152: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 56

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt

•redis-cli get foo > ~/bar.txt

A long long text In multiple lines

> cat /etc/foo.txt

> redis-cli -x set foo < /etc/foo.txtOK

> redis-cli 127.0.0.1:6379>"A long long text\nIn multiple lines\n"

get foo

127.0.0.1:6379> set foo "A long long text"

> cat /etc/bar.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 153: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 56

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt

•redis-cli get foo > ~/bar.txt

A long long text In multiple lines

> cat /etc/foo.txt

> redis-cli -x set foo < /etc/foo.txtOK

> redis-cli 127.0.0.1:6379>"A long long text\nIn multiple lines\n"

get foo

127.0.0.1:6379> set foo "A long long text"

A long long text

> cat /etc/bar.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 154: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 57

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt

•redis-cli get foo > ~/bar.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 155: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 57

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt

•redis-cli get foo > ~/bar.txt

> cat /commands.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 156: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 57

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt

•redis-cli get foo > ~/bar.txt

set foo 100 incr foo append foo xxx get foo

> cat /commands.txt

•cat /commands.txt| redis-cli

Things you didn't know

Page 157: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 57

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt

•redis-cli get foo > ~/bar.txt

set foo 100 incr foo append foo xxx get foo

> cat /commands.txt

> cat /commands.txt| redis-cli

•cat /commands.txt| redis-cli

Things you didn't know

Page 158: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 57

redis-cli

•redis-cli --bigkeys

•redis-cli monitor

•redis-cli --scan --pattern '*foo*'

•redis-cli --stat

•redis-cli -x set foo < /etc/foo.txt

•redis-cli get foo > ~/bar.txt

set foo 100 incr foo append foo xxx get foo

> cat /commands.txt

OK (integer) 101 (integer) 6 "101xxx"

> cat /commands.txt| redis-cli

•cat /commands.txt| redis-cli

Things you didn't know

Page 159: Redis: Need for speed

REDIS: Need for speed

@elena_kolevska

Elena Kolevska 58

Tips and best practices

Thank you!@elena_kolevska