Slide 1

Slide 1 text

101

Slide 2

Slide 2 text

What’s Redis? key / value store

Slide 3

Slide 3 text

Why Redis? It’s fast Add it, don’t switch Open source Great Ruby support

Slide 4

Slide 4 text

Who uses Redis?

Slide 5

Slide 5 text

Who uses Redis?

Slide 6

Slide 6 text

What’s Redis? key / value store

Slide 7

Slide 7 text

What’s Redis? key / string key / hash key / list key / set key / sorted set

Slide 8

Slide 8 text

key / string What can we do? ● Store any data we like (up to 512MB)

Slide 9

Slide 9 text

key / string

Slide 10

Slide 10 text

Setup require "redis" redis = Redis.new(host: "192.168.0.1", port: 6380, db: 1)

Slide 11

Slide 11 text

key / string Example redis.set(key, value) redis.set "meetup:5", "Great Western Rails - May 18" => "OK" redis.get "meetup:5" => "Great Western Rails - May 18"

Slide 12

Slide 12 text

key / string Use case: Analytics redis.set request.fullpath, 0 => "OK" 10_400.times { redis.incr request.fullpath } redis.get request.fullpath => "10400"

Slide 13

Slide 13 text

key / string Rails class ApplicationController before_action :count_visit private def count_visit redis.incr(request.fullpath) end end class ProductsController < ApplicationController def show @hits = redis.get(request.fullpath) end end

Slide 14

Slide 14 text

key / hash What can we do? ● Store a hash ● Basically unlimited ● Get specific fields ● Get all fields ● Increment value key: { "field1"=>"value", "field2"=>"value" }

Slide 15

Slide 15 text

key / hash Use case: Comments with voting

Slide 16

Slide 16 text

key / hash Use case: Comments with voting redis.mapped_hmset "comment:1", { body: "Wow. Great post. ", upvotes: 1, downvotes: 0 } => "OK"

Slide 17

Slide 17 text

key / hash Use case: Comments with voting redis.mapped_hmset "comment:1", { body: "Wow. Great post. ", upvotes: 1, downvotes: 0 } => "OK" redis.hincrby "comment:1", "upvotes", 1 => 2

Slide 18

Slide 18 text

key / hash Use case: Comments with voting redis.mapped_hmset "comment:1", { body: "Wow. Great post. ", upvotes: 1, downvotes: 0 } => "OK" redis.hincrby "comment:1", "upvotes", 1 => 2 upvotes = redis.hget("comment:1", "upvotes").to_i downvotes = redis.hget("comment:1", "downvotes").to_i score = upvotes - downvotes => 1

Slide 19

Slide 19 text

key / list What can we do? ● Store a list (Array) ● Order is maintained ● Maximum length 4294967295 ● Add to beginning or end, trim, get range of values

Slide 20

Slide 20 text

key / list Use case: Social media feed

Slide 21

Slide 21 text

key / list Use case: Social media feed Jane follows Tweet.where(author: current_user.following).order(created_at: :desc)

Slide 22

Slide 22 text

key / list Use case: Social media feed Jane

Slide 23

Slide 23 text

key / list Example tweet = Tweet.create(author: current_user, body: "Hello, world") tweet.author.followers.each do |follower| redis.lpush "user:#{follower.id}:feed", "tweet:#{tweet.id}" end

Slide 24

Slide 24 text

key / list Example: Most recent tweets # LRANGE key, start, stop redis.lrange "user:2:feed", 0, 9

Slide 25

Slide 25 text

key / set What can we do? ● Store a unique list of members ● Order not guaranteed ● Check difference and intersection ● Check if set contains member

Slide 26

Slide 26 text

key / set Example: Follower / Following

Slide 27

Slide 27 text

key / set Example redis.sadd "user:2:following", ["user:5", "user:1", "user:10"] => 3 redis.sadd "users:2:following", "user:10" => false redis.smembers "user:2:following" => ["user:10", "user:5", "user:1"]

Slide 28

Slide 28 text

key / set Example # Is user 2 following user 10? redis.sismember "user:2:following", "user:10" => true # Is user 2 following user 11? redis.sismember "user:2:following", "user:11" => false

Slide 29

Slide 29 text

key / set Example redis.sadd "user:10:following", ["user:4", "user:19", "user:1", "user:12"] redis.sadd "user:2:following", ["user:5", "user:1", "user:10"] # Who are both users following? redis.sinter "user:2:following", "user:10:following" => ["user:1"]

Slide 30

Slide 30 text

key / sorted set What can we do? ● Similar to a set ● Score for each item ● Sorted! ● Fetch by score

Slide 31

Slide 31 text

key / sorted set Use case: Leaderboard

Slide 32

Slide 32 text

key / sorted set Example redis.zadd "eurovision", 500, "Australia" redis.zadd "eurovision", 529, "Israel" redis.zadd "eurovision", 170, "Moldova" redis.zadd "eurovision", 0, "United Kingdom"

Slide 33

Slide 33 text

key / sorted set Example redis.zadd "eurovision", 500, "Australia" redis.zadd "eurovision", 529, "Israel" redis.zadd "eurovision", 170, "Moldova" redis.zadd "eurovision", 0, "United Kingdom" redis.zrevrange "eurovision", 0, -1, with_scores: true => [["Israel", 529.0], ["Australia", 500.0], ["Moldova", 170.0], ["United Kingdom", 0.0]]

Slide 34

Slide 34 text

Combine key / string key / hash key / list key / set key / sorted set

Slide 35

Slide 35 text

Thank you Lewis Buckley @lewispb