SlideShare a Scribd company logo
1 of 138
Indexing Thousands of
  Writes per Second
      with Redis
          Paul Dix
      paul@pauldix.net
          @pauldix
      http://pauldix.net
I’m Paul Dix
I wrote this
   book
Benchmark Solutions*
                                         who I work for




* we’re hiring, duh! email: paul@benchmarksolutions.com
had a spiel about the
suit..




Before we get to the
       talk...
That bastard stole my
      thunder!
You don’t think of suit
                   wearing badass




Señor Software Engineer
I work
Finance
the janitors, cleaning
          staff, and the 18 year
          old intern get this title
          too...




Vice President
How could I wear
               anything but a suit?




Finance + VP + Suit =
     douchebag
Distraction




http://www.flickr.com/photos/33562486@N07/4288275204/
Bet




http://www.flickr.com/photos/11448492@N07/2825781502/
Bar
http://www.flickr.com/photos/11448492@N07/2825781502/
@flavorjones coauthor
        of Nokogiri




credit: @ebiltwin
JSON vs. XML
XML Sucks Hard
JSON is teh awesome
XML parsing S-L-O-W
10x slower
Mike called BS
A bet!
and I was like: “sure, for
        a beer”
and Mike was all like:
“ok, but that’s lame”
“let’s make it
interesting. Loser wears
   my daughter’s fairy
 wings during your talk”
Sure, that’ll be funny
   and original...
Dr. Nic in fairy wings
That bastard stole my
      thunder!
Nic may have done it as
       part of the talk, but he
       didn’t lose a bet...

       put wings on in red-faced
       shame.




So who won?
credit: @jonathanpberger
Nokogiri ~ 6.8x slower
REXML
(ActiveRecord.from_xml)
      ~ 400x slower
Lesson:
Always use JSON
Lesson:
Don’t make bar bets
However, the bet said
nothing about my slides
Aaron Patterson

 father of nokogiri

 3 slides with
 @tenderlove’s picture?
 wtf?!!
Called Mike:
“Nokogiri’s mother”
Fairy Godmother?
Lesson:
     Learn Photoshop
(this shit is embarrassing)
Anyway, the point of
    the suit...
take me seriously,
dammit!
On to the actual talk...
it’s about...
Redis
Sustained write load of
   ~ 5k per second
Redis + other data
stores = bad assery
@flavorjones

   and maybe about Mike
   being some kind of virgin
   mother




credit: @ebiltwin
Lesson:
   Be specific about the
      terms of a bet
(because at least someone
   can use Photoshop)
Who’s used Redis?
NoSQL
Key/Value Store
Created by
Salvatore Sanfilippo
     @antirez
Data structure store
Basics
Keys
require 'redis'
redis = Redis.new

redis.set("mike", "grants wishes") # => OK
redis.get("mike")   # => "grants wishes"
Counters

redis.incr("fairy_references") # => 1
redis.decr("dignity") # => -1
redis.incrby("fairy_references", 23) # => 24
redis.decrby("dignity", 56) # => 57
Expiration

redis.expire("mike", 120)
redis.expireat("mike",
  1.day.from_now.midnight)
Hashes
redis.hset("paul", "has_wings", true)
redis.hget("paul", "has_wings") # => "true"
redis.hmset("paul",
  :location, "Baltimore",
  :twitter, "@pauldix")
redis.hvals("paul") # => {
#   "has_wings"=>"true",
#   "location"=>"Baltimore",
#   "twitter"=>"@pauldix" }
redis.hlen("paul") # => 3
Lists
redis.lpush("events", "first") # => 1
redis.lpush("events", "second") # => 2
redis.lrange("events", 0, -1) #
  => ["second", "first"]
redis.rpush("events", "third") # => 3
redis.lrange("events", 0, -1) #
  => ["second", "first", "third"]
redis.lpop("events") # => "second"
redis.lrange("events", 0, -1) #
  => ["first", "third"]
redis.rpoplpush("events", "fourth") #
  => "third"
Sets
redis.sadd("user_ids", 1)    #   =>   true
redis.scard("user_ids")      #   =>   1
redis.smembers("user_ids")   #   =>   ["1"]
redis.sismember(1)           #   =>   true
redis.srem("user_ids", 1)    #   =>   true
Sets Continued
# know_paul ["1", "3", "4"]
# know_mike ["3", "5"]
redis.sinter("know_paul", "know_mike")   # =>
["3"]
redis.sdiff("know_paul", "know_mike")    # =>
["1", "4"]
redis.sdiff("know_mike", "know_paul")    # =>
["5"]
redis.sunion("know_paul", "know_mike")   # =>
["1", "3", "4", "5"]
Sorted Sets
redis.zadd("wish_counts", 2, "paul") # =>
  true
redis.zcard("wish_counts") # => 1
redis.zismember("paul") # => true
redis.zrem("wish_counts", "paul") # => true
Sorted Sets Continued
redis.zadd("wish_counts", 12, "rubyland")
redis.zrange("wish_counts", 0, -1) # =>
  ["paul", "rubyland"]
redis.zrange("wish_counts", 0, -1,
  :with_scores => true) # =>
    ["paul", "2", "rubyland", "12"]
redis.zrevrange("wish_counts", 0, -1) # =>
  ["rubyland", "paul"]
Sorted Sets Continued
redis.zrevrangebyscore("wish_counts",
  "+inf", "-inf") # =>
  ["rubyland", "paul"]
redis.zrevrangebyscore("wish_counts",
  "+inf", "10") # => ["rubyland"]
redis.zrevrangebyscore("wish_counts",
  "+inf", "-inf", :limit => [0, 1]) # =>
  ["rubyland"]
Lesson:
Keeping examples consistent
 with a stupid story is hard
pubsub, transactions,
more commadnds.

not covered here, leave me
alone




                 There’s more
Crazy Fast
Faster than a greased
       cheetah
or a Delorean with 1.21
       gigawatts
OMG Scaling Sprinkles!
No Wishes Granted

f-you, f-ball!
Lesson:
Getting someone to pose
          is easier
 (also, learn Photoshop)
Still monolithic
not horizontally
scalable, oh noes!
Can shard in client like
          memcached
I know haters, you can
do this
Still not highly available
Still susceptible to
      partitions
However, it’s wicked
      cool
Why Index with Redis?
Don’t



you probably don’t need
it




                          http://www.flickr.com/photos/34353483@N00/205467442/
and you’re all like,
“Paul, ...”




      But I have to SCALE!
No you don’t
Trust me, I’m wearing a
          suit
that means I have
authority and...




                    I know shit
and still you cry:




                     But no, really...
Sad SQL is Sad
thousands of
writes per
second? No me
gusto!
ok, fine.
My Use Cases
40k unique things
Updating every 10
    seconds
Plus other updates...
Average write load of
  3k-5k writes per
      second
LVC
redis.hset("bonds|1", "bid_price",   96.01)
redis.hset("bonds|1", "ask_price",   97.53)
redis.hset("bonds|2", "bid_price",   90.50)
redis.hset("bonds|2", "ask_price",   92.25)
redis.sadd("bond_ids", 1)
redis.sadd("bond_ids", 2)
Index on the fly
SORT
redis.sort("bond_ids",
  :get => "bonds|*->bid_price") # =>
["96.01", "90.5"]

redis.sort("bond_ids",
  :get => "bonds|*->bid_price",
  :get => "#") # => ["1", "2"]

redis.sort("bond_ids",
  :get => "bonds|*->bid_price",
  :get => "#", :limit => [0, 1]) # => ["1"]
SORT Continued
redis.sort("bond_ids",
  :get => "bonds|*->bid_price",
  :get => "#", :order => "desc") # =>
["2", "1"]
                                 redis gem returns the
redis.sort("bond_ids",           results in reverse order.
                                 wha?!

  :get => "bonds|*->ask_price",
  :get => "#") # => ["2", "1"]
redis.sort("bond_ids",
  :get => "bonds|*->ask_price",
  :get => "#",
  :store => "bond_ids_sorted_by_ask_price",
  :expire => 300) # => 2
Getting Records
ids = redis_sort_results.map {|id| id.to_i}
bonds = Bond.find(ids)           note that prices (high
                                 write volume data) come
bond_ids_to_bond = {}            from elsewhere (not the
                                 SQL db)




bonds.each do |bond|
  bond_ids_to_bond[bond.id] = bond
end

results = ids.map do |id|
  bond_ids_to_bond[id]
end
Getting From Redis
redis.hset("bonds|2", "values", data.to_json)

raw_json = redis.sort("bond_ids",    However, then you have
                                     to worry about keeping
                                     the t wo data stores in
  :get => "bonds|*->bid_price",      sync. We’ll talk about it
                                     later

  :get => "bonds|*->values")

results = raw_json.map do |json|
  DataObject.new(JSON.parse(json))
end
Pre-Indexing
Rolling Index
Last n Events
Activity Log
News Feed
Use a List
                                       O(1) constant time
                                       complexity to add

                                       O(start + n) for reading




N = 500
size = redis.lpush("bond_trades|1", trade_id)

# roll the index
redis.rpop("bond_trades|1") if size > N

# get results
redis.lrange("bond_trades|1", 0, 49)
Indexing Events Since
       Time T
Using a List
redis.lpush("bond_trades|1|2011-05-19-10",
  trade_id)

redis.lrange("bond_trades|1|2011-05-19-10",
  0, -1)
results = redis.pipelined do
  redis.lrange("bond_trades|1|2011-05-19-10",
    0, -1)
  redis.lrange("bond_trades|1|2011-05-19-09",
    0, -1)
end.flatten
Rolling the Index
# when something trades
redis.sadd("bonds_traded|2011-05-19-10",
  bond_id)

# cron task to remove old data
traded_ids = redis.smembers(
  "bonds_traded|2011-05-19-10")
keys = traded_ids.map do |id|
  "bond_trades|#{id}|2011-05-19-10"
end
keys << "bonds_traded|2011-05-19-10"
redis.del(*keys)
Using a Sorted Set
# Time based Rolling Index using sorted set
redis.zadd("bond_trades|1",      O(log(n)) writes


  Time.now.to_i, trade_id)       O(log(n) + M) reads




# last 20 trades
redis.zrevrange("bond_trades|1", 0, 20)

# trades in the last hour
redis.zrevrangebyscore("bond_trades|1",
  "+inf", 1.hour.ago.to_i)
Rolling the Index
# cron task to roll the index
bond_ids = redis.smembers("bond_ids")
remove_since_time = 24.hours.ago.to_i

redis.pipelined do
  bond_ids.each do |id|
    redis.zremrangebyscore(
      "bond_trades|#{id}", "-inf",
      remove_since_time)
  end
end
Or roll on read or
           write
redis.zadd("bond_trades|1",
  Time.now.to_i, trade_id)

redis.zremrangebyscore("bond_trades|1",
  "-inf", 24.hours.ago)
Indexing N Values
redis.zadd("highest_follower_counts", 2300, 20)
redis.zadd("lowest_follower_counts", 2300, 20)
# rolling the indexes
# keep the lowest
size = redis.zcard("lowest_follower_counts")
redis.zremrangebyrank("lowest_follower_counts",
  N, -1) if size > N

# keep the highest
size = redis.zcard("highest_follower_counts")
redis.zremrangebyrank("highest_follower_counts",
  0, size - N) if size > N
rolling requires more
roundtrips




           2 roundtrips
        (only with complex
             pipelining)
Roll indexes with only
       one trip
Tweet to @antirez that
  you want scripting
Keeping it Consistent
create/update/destroy
database transactions
          can’t help you here, you’ll
          have to put them into
          your application logic




No transactions,
application logic
Disaster Recovery
Two failure scenarios
Web app dies
Redis server dies
Could result in index
   inconsistency
Simple recovery script
Write Index Times

redis.set("last_bond_trade_indexed",
  trade.created_at.to_i)
Restore Each Index
time_int = redis.get("last_bond_trade_indexed").to_i
index_time = Time.at(time_int)
trades = Trade.where(
  "created_at > :index_time AND created_at <= :now",
  {:index_time => index_time, :now => Time.now})

trades.each do |trade|       list you have to run while
                             not writing new data.
  trade.index_in_redis       Set can be made to run
end                          while writing new data
Our scale
Single Process
Sets don’t work with
intersection, union, or
diff.

SORT won’t work unless
all those keys fall on the
same server




            Easy to Scale
         (consistent hashing)
Works like a champ
Final Thoughts
Use Only if you have
        to!
Index the minimum to
keep memory footprint
         down
 use rolling indexes, don’t
 keep more shit in
 memory than you need.
 Users won’t page through
 20 pages of results, so
 don’t store that many
Plan for disaster and
consistency checking
Finally...
Look at my circle, bitches!
Lesson:
Never trust a guy in a suit
not pull a fast one on you
Thanks!
    Paul Dix
paul@pauldix.net
    @pauldix
http://pauldix.net

More Related Content

What's hot

Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with GroovyArturo Herrero
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applicationsSkills Matter
 
JavaScript Fundamentals with Angular and Lodash
JavaScript Fundamentals with Angular and LodashJavaScript Fundamentals with Angular and Lodash
JavaScript Fundamentals with Angular and LodashBret Little
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Domenic Denicola
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Jonas Bonér
 
Synapse india complain sharing info about php chaptr 26
Synapse india complain sharing info about php chaptr 26Synapse india complain sharing info about php chaptr 26
Synapse india complain sharing info about php chaptr 26SynapseindiaComplaints
 
Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...go_oh
 
Design Patterns Reconsidered
Design Patterns ReconsideredDesign Patterns Reconsidered
Design Patterns ReconsideredAlex Miller
 
Powerful JavaScript Tips and Best Practices
Powerful JavaScript Tips and Best PracticesPowerful JavaScript Tips and Best Practices
Powerful JavaScript Tips and Best PracticesDragos Ionita
 
Introduction to julia
Introduction to juliaIntroduction to julia
Introduction to julia岳華 杜
 
Chaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreChaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreNicolas Carlo
 
Programmation fonctionnelle en JavaScript
Programmation fonctionnelle en JavaScriptProgrammation fonctionnelle en JavaScript
Programmation fonctionnelle en JavaScriptLoïc Knuchel
 

What's hot (20)

Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with Groovy
 
Why Haskell
Why HaskellWhy Haskell
Why Haskell
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applications
 
JavaScript Fundamentals with Angular and Lodash
JavaScript Fundamentals with Angular and LodashJavaScript Fundamentals with Angular and Lodash
JavaScript Fundamentals with Angular and Lodash
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)
 
Synapse india complain sharing info about php chaptr 26
Synapse india complain sharing info about php chaptr 26Synapse india complain sharing info about php chaptr 26
Synapse india complain sharing info about php chaptr 26
 
Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...
 
Into Clojure
Into ClojureInto Clojure
Into Clojure
 
Lodash js
Lodash jsLodash js
Lodash js
 
Design Patterns Reconsidered
Design Patterns ReconsideredDesign Patterns Reconsidered
Design Patterns Reconsidered
 
Sneaking inside Kotlin features
Sneaking inside Kotlin featuresSneaking inside Kotlin features
Sneaking inside Kotlin features
 
Powerful JavaScript Tips and Best Practices
Powerful JavaScript Tips and Best PracticesPowerful JavaScript Tips and Best Practices
Powerful JavaScript Tips and Best Practices
 
Introduction to julia
Introduction to juliaIntroduction to julia
Introduction to julia
 
Chaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscoreChaining and function composition with lodash / underscore
Chaining and function composition with lodash / underscore
 
Scala introduction
Scala introductionScala introduction
Scala introduction
 
C++ L09-Classes Part2
C++ L09-Classes Part2C++ L09-Classes Part2
C++ L09-Classes Part2
 
C# 7
C# 7C# 7
C# 7
 
PDBC
PDBCPDBC
PDBC
 
Programmation fonctionnelle en JavaScript
Programmation fonctionnelle en JavaScriptProgrammation fonctionnelle en JavaScript
Programmation fonctionnelle en JavaScript
 

Viewers also liked

Redis persistence in practice
Redis persistence in practiceRedis persistence in practice
Redis persistence in practiceEugene Fidelin
 
Scaling Crashlytics: Building Analytics on Redis 2.6
Scaling Crashlytics: Building Analytics on Redis 2.6Scaling Crashlytics: Building Analytics on Redis 2.6
Scaling Crashlytics: Building Analytics on Redis 2.6Crashlytics
 
Scaling up with Cisco Big Data: Data + Science = Data Science
Scaling up with Cisco Big Data: Data + Science = Data ScienceScaling up with Cisco Big Data: Data + Science = Data Science
Scaling up with Cisco Big Data: Data + Science = Data ScienceeRic Choo
 
Greenplum- an opensource
Greenplum- an opensourceGreenplum- an opensource
Greenplum- an opensourceRosy Mani
 
Open Source Framework for Deploying Data Science Models and Cloud Based Appli...
Open Source Framework for Deploying Data Science Models and Cloud Based Appli...Open Source Framework for Deploying Data Science Models and Cloud Based Appli...
Open Source Framework for Deploying Data Science Models and Cloud Based Appli...ETCenter
 
Data science
Data scienceData science
Data science9diov
 
Creating a contemporary risk management system using python (dc)
Creating a contemporary risk management system using python (dc)Creating a contemporary risk management system using python (dc)
Creating a contemporary risk management system using python (dc)Piero Ferrante
 
DataScience and BigData Cebu 1st meetup
DataScience and BigData Cebu 1st meetupDataScience and BigData Cebu 1st meetup
DataScience and BigData Cebu 1st meetupFrancisco Liwa
 
International Collaboration Networks in the Emerging (Big) Data Science
International Collaboration Networks in the Emerging (Big) Data ScienceInternational Collaboration Networks in the Emerging (Big) Data Science
International Collaboration Networks in the Emerging (Big) Data Sciencedatasciencekorea
 
Fiche Produit Verteego Data Suite, mars 2017
Fiche Produit Verteego Data Suite, mars 2017Fiche Produit Verteego Data Suite, mars 2017
Fiche Produit Verteego Data Suite, mars 2017Jeremy Fain
 
The Role of Data Science in Enterprise Risk Management, Presented by John Liu
The Role of Data Science in Enterprise Risk Management, Presented by John LiuThe Role of Data Science in Enterprise Risk Management, Presented by John Liu
The Role of Data Science in Enterprise Risk Management, Presented by John LiuNashvilleTechCouncil
 
Redis to the Rescue?
Redis to the Rescue?Redis to the Rescue?
Redis to the Rescue?Wooga
 
High-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using RedisHigh-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using Rediscacois
 
Realtime Risk Management Using Kafka, Python, and Spark Streaming by Nick Evans
Realtime Risk Management Using Kafka, Python, and Spark Streaming by Nick EvansRealtime Risk Management Using Kafka, Python, and Spark Streaming by Nick Evans
Realtime Risk Management Using Kafka, Python, and Spark Streaming by Nick EvansSpark Summit
 
Redis Use Patterns (DevconTLV June 2014)
Redis Use Patterns (DevconTLV June 2014)Redis Use Patterns (DevconTLV June 2014)
Redis Use Patterns (DevconTLV June 2014)Itamar Haber
 
Building Realtime Data Pipelines with Kafka Connect and Spark Streaming by Ew...
Building Realtime Data Pipelines with Kafka Connect and Spark Streaming by Ew...Building Realtime Data Pipelines with Kafka Connect and Spark Streaming by Ew...
Building Realtime Data Pipelines with Kafka Connect and Spark Streaming by Ew...Spark Summit
 
Indexing or dividing_head
Indexing or dividing_headIndexing or dividing_head
Indexing or dividing_headJavaria Chiragh
 
Data Visualisation for Data Science
Data Visualisation for Data ScienceData Visualisation for Data Science
Data Visualisation for Data ScienceChristophe Bontemps
 
Introduction to Data Science and Large-scale Machine Learning
Introduction to Data Science and Large-scale Machine LearningIntroduction to Data Science and Large-scale Machine Learning
Introduction to Data Science and Large-scale Machine LearningNik Spirin
 

Viewers also liked (20)

Redis persistence in practice
Redis persistence in practiceRedis persistence in practice
Redis persistence in practice
 
Scaling Crashlytics: Building Analytics on Redis 2.6
Scaling Crashlytics: Building Analytics on Redis 2.6Scaling Crashlytics: Building Analytics on Redis 2.6
Scaling Crashlytics: Building Analytics on Redis 2.6
 
Scaling up with Cisco Big Data: Data + Science = Data Science
Scaling up with Cisco Big Data: Data + Science = Data ScienceScaling up with Cisco Big Data: Data + Science = Data Science
Scaling up with Cisco Big Data: Data + Science = Data Science
 
Greenplum- an opensource
Greenplum- an opensourceGreenplum- an opensource
Greenplum- an opensource
 
Open Source Framework for Deploying Data Science Models and Cloud Based Appli...
Open Source Framework for Deploying Data Science Models and Cloud Based Appli...Open Source Framework for Deploying Data Science Models and Cloud Based Appli...
Open Source Framework for Deploying Data Science Models and Cloud Based Appli...
 
Data science
Data scienceData science
Data science
 
Creating a contemporary risk management system using python (dc)
Creating a contemporary risk management system using python (dc)Creating a contemporary risk management system using python (dc)
Creating a contemporary risk management system using python (dc)
 
DataScience and BigData Cebu 1st meetup
DataScience and BigData Cebu 1st meetupDataScience and BigData Cebu 1st meetup
DataScience and BigData Cebu 1st meetup
 
International Collaboration Networks in the Emerging (Big) Data Science
International Collaboration Networks in the Emerging (Big) Data ScienceInternational Collaboration Networks in the Emerging (Big) Data Science
International Collaboration Networks in the Emerging (Big) Data Science
 
Fiche Produit Verteego Data Suite, mars 2017
Fiche Produit Verteego Data Suite, mars 2017Fiche Produit Verteego Data Suite, mars 2017
Fiche Produit Verteego Data Suite, mars 2017
 
The Role of Data Science in Enterprise Risk Management, Presented by John Liu
The Role of Data Science in Enterprise Risk Management, Presented by John LiuThe Role of Data Science in Enterprise Risk Management, Presented by John Liu
The Role of Data Science in Enterprise Risk Management, Presented by John Liu
 
Redis to the Rescue?
Redis to the Rescue?Redis to the Rescue?
Redis to the Rescue?
 
High-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using RedisHigh-Volume Data Collection and Real Time Analytics Using Redis
High-Volume Data Collection and Real Time Analytics Using Redis
 
Realtime Risk Management Using Kafka, Python, and Spark Streaming by Nick Evans
Realtime Risk Management Using Kafka, Python, and Spark Streaming by Nick EvansRealtime Risk Management Using Kafka, Python, and Spark Streaming by Nick Evans
Realtime Risk Management Using Kafka, Python, and Spark Streaming by Nick Evans
 
Redis Use Patterns (DevconTLV June 2014)
Redis Use Patterns (DevconTLV June 2014)Redis Use Patterns (DevconTLV June 2014)
Redis Use Patterns (DevconTLV June 2014)
 
Building Realtime Data Pipelines with Kafka Connect and Spark Streaming by Ew...
Building Realtime Data Pipelines with Kafka Connect and Spark Streaming by Ew...Building Realtime Data Pipelines with Kafka Connect and Spark Streaming by Ew...
Building Realtime Data Pipelines with Kafka Connect and Spark Streaming by Ew...
 
Indexing or dividing_head
Indexing or dividing_headIndexing or dividing_head
Indexing or dividing_head
 
Data Visualisation for Data Science
Data Visualisation for Data ScienceData Visualisation for Data Science
Data Visualisation for Data Science
 
Introduction to Data Science and Large-scale Machine Learning
Introduction to Data Science and Large-scale Machine LearningIntroduction to Data Science and Large-scale Machine Learning
Introduction to Data Science and Large-scale Machine Learning
 
Semi-Detailed Lesson Plan on Reading Letter
Semi-Detailed Lesson Plan on Reading LetterSemi-Detailed Lesson Plan on Reading Letter
Semi-Detailed Lesson Plan on Reading Letter
 

Similar to Indexing thousands of writes per second with redis

Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript Using CoffeeScript, Backbone.js and JasmineRails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript Using CoffeeScript, Backbone.js and JasmineRaimonds Simanovskis
 
Monads in python
Monads in pythonMonads in python
Monads in pythoneldariof
 
Type safe embedded domain-specific languages
Type safe embedded domain-specific languagesType safe embedded domain-specific languages
Type safe embedded domain-specific languagesArthur Xavier
 
Amir Salihefendic: Redis - the hacker's database
Amir Salihefendic: Redis - the hacker's databaseAmir Salihefendic: Redis - the hacker's database
Amir Salihefendic: Redis - the hacker's databaseit-people
 
Redis - Usability and Use Cases
Redis - Usability and Use CasesRedis - Usability and Use Cases
Redis - Usability and Use CasesFabrizio Farinacci
 
Practical Ruby Projects with MongoDB - Ruby Kaigi 2010
Practical Ruby Projects with MongoDB - Ruby Kaigi 2010Practical Ruby Projects with MongoDB - Ruby Kaigi 2010
Practical Ruby Projects with MongoDB - Ruby Kaigi 2010Alex Sharp
 
Advanced Redis data structures
Advanced Redis data structuresAdvanced Redis data structures
Advanced Redis data structuresamix3k
 
Redis the better NoSQL
Redis the better NoSQLRedis the better NoSQL
Redis the better NoSQLOpenFest team
 
Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)bryanbibat
 
A XSSmas carol
A XSSmas carolA XSSmas carol
A XSSmas carolcgvwzq
 
Beyond PHP - It's not (just) about the code
Beyond PHP - It's not (just) about the codeBeyond PHP - It's not (just) about the code
Beyond PHP - It's not (just) about the codeWim Godden
 
Active Record Inheritance in Rails
Active Record Inheritance in RailsActive Record Inheritance in Rails
Active Record Inheritance in RailsSandip Ransing
 
Practical Ruby Projects (Alex Sharp)
Practical Ruby Projects (Alex Sharp)Practical Ruby Projects (Alex Sharp)
Practical Ruby Projects (Alex Sharp)MongoSF
 
Practical Ruby Projects with MongoDB - MongoSF
Practical Ruby Projects with MongoDB - MongoSFPractical Ruby Projects with MongoDB - MongoSF
Practical Ruby Projects with MongoDB - MongoSFAlex Sharp
 
Beware: Sharp Tools
Beware: Sharp ToolsBeware: Sharp Tools
Beware: Sharp Toolschrismdp
 
Redis Indices (#RedisTLV)
Redis Indices (#RedisTLV)Redis Indices (#RedisTLV)
Redis Indices (#RedisTLV)Itamar Haber
 
Practical Ruby Projects With Mongo Db
Practical Ruby Projects With Mongo DbPractical Ruby Projects With Mongo Db
Practical Ruby Projects With Mongo DbAlex Sharp
 
From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)Night Sailer
 

Similar to Indexing thousands of writes per second with redis (20)

Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript Using CoffeeScript, Backbone.js and JasmineRails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript Using CoffeeScript, Backbone.js and Jasmine
 
Monads in python
Monads in pythonMonads in python
Monads in python
 
Type safe embedded domain-specific languages
Type safe embedded domain-specific languagesType safe embedded domain-specific languages
Type safe embedded domain-specific languages
 
Amir Salihefendic: Redis - the hacker's database
Amir Salihefendic: Redis - the hacker's databaseAmir Salihefendic: Redis - the hacker's database
Amir Salihefendic: Redis - the hacker's database
 
Redis - Usability and Use Cases
Redis - Usability and Use CasesRedis - Usability and Use Cases
Redis - Usability and Use Cases
 
Practical Ruby Projects with MongoDB - Ruby Kaigi 2010
Practical Ruby Projects with MongoDB - Ruby Kaigi 2010Practical Ruby Projects with MongoDB - Ruby Kaigi 2010
Practical Ruby Projects with MongoDB - Ruby Kaigi 2010
 
Advanced Redis data structures
Advanced Redis data structuresAdvanced Redis data structures
Advanced Redis data structures
 
Redis the better NoSQL
Redis the better NoSQLRedis the better NoSQL
Redis the better NoSQL
 
Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)Ruby and Rails by Example (GeekCamp edition)
Ruby and Rails by Example (GeekCamp edition)
 
A XSSmas carol
A XSSmas carolA XSSmas carol
A XSSmas carol
 
Beyond PHP - It's not (just) about the code
Beyond PHP - It's not (just) about the codeBeyond PHP - It's not (just) about the code
Beyond PHP - It's not (just) about the code
 
Active Record Inheritance in Rails
Active Record Inheritance in RailsActive Record Inheritance in Rails
Active Record Inheritance in Rails
 
Beware sharp tools
Beware sharp toolsBeware sharp tools
Beware sharp tools
 
Practical Ruby Projects (Alex Sharp)
Practical Ruby Projects (Alex Sharp)Practical Ruby Projects (Alex Sharp)
Practical Ruby Projects (Alex Sharp)
 
Practical Ruby Projects with MongoDB - MongoSF
Practical Ruby Projects with MongoDB - MongoSFPractical Ruby Projects with MongoDB - MongoSF
Practical Ruby Projects with MongoDB - MongoSF
 
Ggplot2 v3
Ggplot2 v3Ggplot2 v3
Ggplot2 v3
 
Beware: Sharp Tools
Beware: Sharp ToolsBeware: Sharp Tools
Beware: Sharp Tools
 
Redis Indices (#RedisTLV)
Redis Indices (#RedisTLV)Redis Indices (#RedisTLV)
Redis Indices (#RedisTLV)
 
Practical Ruby Projects With Mongo Db
Practical Ruby Projects With Mongo DbPractical Ruby Projects With Mongo Db
Practical Ruby Projects With Mongo Db
 
From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)From mysql to MongoDB(MongoDB2011北京交流会)
From mysql to MongoDB(MongoDB2011北京交流会)
 

More from pauldix

An introduction to reinforcement learning (rl)
An introduction to reinforcement learning (rl)An introduction to reinforcement learning (rl)
An introduction to reinforcement learning (rl)pauldix
 
Terascale Learning
Terascale LearningTerascale Learning
Terascale Learningpauldix
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelpauldix
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelpauldix
 
Building Event-Based Systems for the Real-Time Web
Building Event-Based Systems for the Real-Time WebBuilding Event-Based Systems for the Real-Time Web
Building Event-Based Systems for the Real-Time Webpauldix
 
Synchronous Reads Asynchronous Writes RubyConf 2009
Synchronous Reads Asynchronous Writes RubyConf 2009Synchronous Reads Asynchronous Writes RubyConf 2009
Synchronous Reads Asynchronous Writes RubyConf 2009pauldix
 
Machine Learning Techniques for the Semantic Web
Machine Learning Techniques for the Semantic WebMachine Learning Techniques for the Semantic Web
Machine Learning Techniques for the Semantic Webpauldix
 

More from pauldix (7)

An introduction to reinforcement learning (rl)
An introduction to reinforcement learning (rl)An introduction to reinforcement learning (rl)
An introduction to reinforcement learning (rl)
 
Terascale Learning
Terascale LearningTerascale Learning
Terascale Learning
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModel
 
Building Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModelBuilding Web Service Clients with ActiveModel
Building Web Service Clients with ActiveModel
 
Building Event-Based Systems for the Real-Time Web
Building Event-Based Systems for the Real-Time WebBuilding Event-Based Systems for the Real-Time Web
Building Event-Based Systems for the Real-Time Web
 
Synchronous Reads Asynchronous Writes RubyConf 2009
Synchronous Reads Asynchronous Writes RubyConf 2009Synchronous Reads Asynchronous Writes RubyConf 2009
Synchronous Reads Asynchronous Writes RubyConf 2009
 
Machine Learning Techniques for the Semantic Web
Machine Learning Techniques for the Semantic WebMachine Learning Techniques for the Semantic Web
Machine Learning Techniques for the Semantic Web
 

Recently uploaded

Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesManik S Magar
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 

Recently uploaded (20)

Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 

Indexing thousands of writes per second with redis

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n