SlideShare a Scribd company logo
Redis and Python

    by Josiah Carlson
        @dr_josiah
 dr-josiah.blogspot.com
  bit.ly/redis-in-action
Redis and Python;
 It's PB & J time
     by Josiah Carlson
         @dr_josiah
  dr-josiah.blogspot.com
   bit.ly/redis-in-action
What will be covered
•   Who am I?
•   What is Redis?
•   Why Redis with Python?
•   Cool stuff you can do by combining them
Who am I?
•   A Python user for 12+ years
•   Former python-dev bike-shedder
•   Former maintainer of Python async sockets libraries
•   Author of a few small OS projects
    o   rpqueue, parse-crontab, async_http, timezone-utils, PyPE

•   Worked at some cool places you've never heard of
    (Networks In Motion, Ad.ly)
•   Cool places you have (Google)
•   And cool places you will (ChowNow)
•   Heavy user of Redis
•   Author of upcoming Redis in Action
What is Redis?
•   In-memory database/data structure server
     o Limited to main memory; vm and diskstore defunct
•   Persistence via snapshot or append-only file
•   Support for master/slave replication (multiple slaves
    and slave chaining supported)
     o No master-master, don't even try
     o Client-side sharding
     o Cluster is in-progress
•   Five data structures + publish/subscribe
     o Strings, Lists, Sets, Hashes, Sorted Sets (ZSETs)
•   Server-side scripting with Lua in Redis 2.6
What is Redis? (compared to other
databases/caches)
• Memcached
  o in-memory, no-persistence, counters, strings, very fast, multi-threaded

• Redis
  o in-memory, optionally persisted, data structures, very fast, server-side
    scripting, single-threaded
• MongoDB
  o on-disk, speed inversely related to data integrity, bson, master/slave,
    sharding, multi-master, server-side mapreduce, database-level locking
• Riak
  o on-disk, pluggable data stores, multi-master sharding, RESTful API,
    server-side map-reduce, (Erlang + C)
• MySQL/PostgreSQL
  o on-disk/in-memory, pluggable data stores, master/slave, sharding,
    stored procedures, ...
What is Redis? (Strings)
•   Really scalars of a few different types
    o   Character strings
          concatenate values to the end
          get/set individual bits
          get/set byte ranges
    o   Integers (platform long int)
          increment/decrement
          auto "casting"
    o   Floats (IEEE 754 FP Double)
          increment/decrement
          auto "casting"
What is Redis? (Lists)
•   Doubly-linked list of character strings
    o   Push/pop from both ends
    o   [Blocking] pop from multiple lists
    o   [Blocking] pop from one list, push on another
    o   Get/set/search for item in a list
    o   Sortable
What is Redis? (Sets)
•   Unique unordered sequence of character
    strings
    o   Backed by a hash table
    o   Add, remove, check membership, pop, random pop
    o   Set intersection, union, difference
    o   Sortable
What is Redis? (Hashes)
•   Key-value mapping inside a key
    o   Get/Set/Delete single/multiple
    o   Increment values by ints/floats
    o   Bulk fetch of Keys/Values/Both
    o   Sort-of like a small version of Redis that only
        supports strings/ints/floats
What is Redis? (Sorted Sets -
ZSETs)
•   Like a Hash, with 'members' and 'scores',
    scores limited to float values
    o   Get, set, delete, increment
    o   Can be accessed by the sorted order of the
        (score,member) pair
          By score
          By index
What is Redis? (Publish/Subscribe)
•   Readers subscribe to "channels" (exact
    strings or patterns)
•   Writers publish to channels, broadcasting to
    all subscribers
•   Messages are transient
Why Redis with Python?
•   The power of Python lies in:
    o   Reasonably sane syntax/semantics
    o   Easy manipulation of data and data structures
    o   Large and growing community
•   Redis also has:
    o   Reasonably sane syntax/semantics
    o   Easy manipulation of data and data structures
    o   Medium-sized and growing community
    o   Available as remote server
         Like a remote IPython, only for data
         So useful, people have asked for a library version
Per-hour and Per-day hit counters
from itertools import imap
import redis
def process_lines(prefix, logfile):
   conn = redis.Redis()
   for log in imap(parse_line, open(logfile, 'rb')):
       time = log.timestamp.isoformat()
       hour = time.partition(':')[0]
       day = time.partition('T')[0]
       conn.zincrby(prefix + hour, log.path)
       conn.zincrby(prefix + day, log.path)
       conn.expire(prefix + hour, 7*86400)
       conn.expire(prefix + day, 30*86400)
Per-hour and Per-day hit counters
(with pipelines for speed)
from itertools import imap
import redis
def process_lines(prefix, logfile):
    pipe = redis.Redis().pipeline(False)
    for i, log in enumerate(imap(parse_line, open(logfile, 'rb'))):
        time = log.timestamp.isoformat()
        hour = time.partition(':')[0]
        day = time.partition('T')[0]
        pipe.zincrby(prefix + hour, log.path)
        pipe.zincrby(prefix + day, log.path)
        pipe.expire(prefix + hour, 7*86400)
        pipe.expire(prefix + day, 30*86400)
        if not i % 1000:
               pipe.execute()
    pipe.execute()
Simple task queue - add/run items
import json
import redis


def add_item(queue, name, *args, **kwargs):
   redis.Redis().rpush(queue,
       json.dumps([name, args, kwargs]))


def execute_one(queues):
   item = redis.Redis().blpop(queues, 30)
   name, args, kwargs = json.loads(item)
   REGISTRY[name](*args, **kwargs)
Simple task queue - register tasks
REGISTRY = {}
def task(queue):
    def wrapper(function):
        def defer(*args, **kwargs):
            add_item(queue, name, *args, **kwargs)
        name = function.__name__
        if name in REGISTRY:
            raise Exception(
                   "Duplicate callback %s"%(name,))
        REGISTRY[name] = function
        return defer
    if isinstance(queue, str):
        return wrapper
    function, queue = queue, 'default'
    return wrapper(function)
Simple task queue – register tasks
@task('high')
def do_something(arg):
    pass


@task
def do_something_else(arg):
    pass
Cool stuff to do...
•    Reddit                •   Publish/Subscribe
•    Caching               •   Messaging
•    Cookies               •   Search engines
•    Analytics             •   Ad targeting
•    Configuration         •   Twitter
     management            •   Chat rooms
•    Autocomplete          •   Job search
•    Distributed locks     •   ...
•    Counting Semaphores
•    Task queues
Thank you
      @dr_josiah
dr-josiah.blogspot.com
 bit.ly/redis-in-action



     Questions?
Ad

Recommended

Vancouver AWS Meetup Slides 11-20-2018 Apache Spark with Amazon EMR
Vancouver AWS Meetup Slides 11-20-2018 Apache Spark with Amazon EMR
Allice Shandler
 
Redis Indices (#RedisTLV)
Redis Indices (#RedisTLV)
Itamar Haber
 
How to use Parquet as a basis for ETL and analytics
How to use Parquet as a basis for ETL and analytics
Julien Le Dem
 
Introduction to Pig & Pig Latin | Big Data Hadoop Spark Tutorial | CloudxLab
Introduction to Pig & Pig Latin | Big Data Hadoop Spark Tutorial | CloudxLab
CloudxLab
 
Sep 2012 HUG: Apache Drill for Interactive Analysis
Sep 2012 HUG: Apache Drill for Interactive Analysis
Yahoo Developer Network
 
Parquet - Data I/O - Philadelphia 2013
Parquet - Data I/O - Philadelphia 2013
larsgeorge
 
Database Architectures and Hypertable
Database Architectures and Hypertable
hypertable
 
Hypertable - massively scalable nosql database
Hypertable - massively scalable nosql database
bigdatagurus_meetup
 
Hypertable
Hypertable
betaisao
 
Hadoop Cluster Configuration and Data Loading - Module 2
Hadoop Cluster Configuration and Data Loading - Module 2
Rohit Agrawal
 
SDEC2011 NoSQL concepts and models
SDEC2011 NoSQL concepts and models
Korea Sdec
 
Avro intro
Avro intro
Randy Abernethy
 
PostgreSQL and Sphinx pgcon 2013
PostgreSQL and Sphinx pgcon 2013
Emanuel Calvo
 
Cassandra and Spark, closing the gap between no sql and analytics codemotio...
Cassandra and Spark, closing the gap between no sql and analytics codemotio...
Duyhai Doan
 
Hadoop
Hadoop
Cassell Hsu
 
Introduction to Redis
Introduction to Redis
Rizky Abdilah
 
Practical Hadoop using Pig
Practical Hadoop using Pig
David Wellman
 
PG Day'14 Russia, Работа со слабо-структурированными данными в PostgreSQL, Ол...
PG Day'14 Russia, Работа со слабо-структурированными данными в PostgreSQL, Ол...
pgdayrussia
 
Ruby on hadoop
Ruby on hadoop
Ted O'Meara
 
Scaling php applications with redis
Scaling php applications with redis
jimbojsb
 
OCF.tw's talk about "Introduction to spark"
OCF.tw's talk about "Introduction to spark"
Giivee The
 
Why hadoop map reduce needs scala, an introduction to scoobi and scalding
Why hadoop map reduce needs scala, an introduction to scoobi and scalding
Xebia Nederland BV
 
MongoDB Advanced Topics
MongoDB Advanced Topics
César Rodas
 
Avro Data | Washington DC HUG
Avro Data | Washington DC HUG
Cloudera, Inc.
 
Intro To Cascading
Intro To Cascading
Nate Murray
 
Parquet and impala overview external
Parquet and impala overview external
mattlieber
 
Fast track to getting started with DSE Max @ ING
Fast track to getting started with DSE Max @ ING
Duyhai Doan
 
PostgreSQL FTS Solutions FOSDEM 2013 - PGDAY
PostgreSQL FTS Solutions FOSDEM 2013 - PGDAY
Emanuel Calvo
 
Redis persistence in practice
Redis persistence in practice
Eugene Fidelin
 
Multiprocessing with python
Multiprocessing with python
Patrick Vergain
 

More Related Content

What's hot (20)

Hypertable
Hypertable
betaisao
 
Hadoop Cluster Configuration and Data Loading - Module 2
Hadoop Cluster Configuration and Data Loading - Module 2
Rohit Agrawal
 
SDEC2011 NoSQL concepts and models
SDEC2011 NoSQL concepts and models
Korea Sdec
 
Avro intro
Avro intro
Randy Abernethy
 
PostgreSQL and Sphinx pgcon 2013
PostgreSQL and Sphinx pgcon 2013
Emanuel Calvo
 
Cassandra and Spark, closing the gap between no sql and analytics codemotio...
Cassandra and Spark, closing the gap between no sql and analytics codemotio...
Duyhai Doan
 
Hadoop
Hadoop
Cassell Hsu
 
Introduction to Redis
Introduction to Redis
Rizky Abdilah
 
Practical Hadoop using Pig
Practical Hadoop using Pig
David Wellman
 
PG Day'14 Russia, Работа со слабо-структурированными данными в PostgreSQL, Ол...
PG Day'14 Russia, Работа со слабо-структурированными данными в PostgreSQL, Ол...
pgdayrussia
 
Ruby on hadoop
Ruby on hadoop
Ted O'Meara
 
Scaling php applications with redis
Scaling php applications with redis
jimbojsb
 
OCF.tw's talk about "Introduction to spark"
OCF.tw's talk about "Introduction to spark"
Giivee The
 
Why hadoop map reduce needs scala, an introduction to scoobi and scalding
Why hadoop map reduce needs scala, an introduction to scoobi and scalding
Xebia Nederland BV
 
MongoDB Advanced Topics
MongoDB Advanced Topics
César Rodas
 
Avro Data | Washington DC HUG
Avro Data | Washington DC HUG
Cloudera, Inc.
 
Intro To Cascading
Intro To Cascading
Nate Murray
 
Parquet and impala overview external
Parquet and impala overview external
mattlieber
 
Fast track to getting started with DSE Max @ ING
Fast track to getting started with DSE Max @ ING
Duyhai Doan
 
PostgreSQL FTS Solutions FOSDEM 2013 - PGDAY
PostgreSQL FTS Solutions FOSDEM 2013 - PGDAY
Emanuel Calvo
 
Hypertable
Hypertable
betaisao
 
Hadoop Cluster Configuration and Data Loading - Module 2
Hadoop Cluster Configuration and Data Loading - Module 2
Rohit Agrawal
 
SDEC2011 NoSQL concepts and models
SDEC2011 NoSQL concepts and models
Korea Sdec
 
PostgreSQL and Sphinx pgcon 2013
PostgreSQL and Sphinx pgcon 2013
Emanuel Calvo
 
Cassandra and Spark, closing the gap between no sql and analytics codemotio...
Cassandra and Spark, closing the gap between no sql and analytics codemotio...
Duyhai Doan
 
Introduction to Redis
Introduction to Redis
Rizky Abdilah
 
Practical Hadoop using Pig
Practical Hadoop using Pig
David Wellman
 
PG Day'14 Russia, Работа со слабо-структурированными данными в PostgreSQL, Ол...
PG Day'14 Russia, Работа со слабо-структурированными данными в PostgreSQL, Ол...
pgdayrussia
 
Scaling php applications with redis
Scaling php applications with redis
jimbojsb
 
OCF.tw's talk about "Introduction to spark"
OCF.tw's talk about "Introduction to spark"
Giivee The
 
Why hadoop map reduce needs scala, an introduction to scoobi and scalding
Why hadoop map reduce needs scala, an introduction to scoobi and scalding
Xebia Nederland BV
 
MongoDB Advanced Topics
MongoDB Advanced Topics
César Rodas
 
Avro Data | Washington DC HUG
Avro Data | Washington DC HUG
Cloudera, Inc.
 
Intro To Cascading
Intro To Cascading
Nate Murray
 
Parquet and impala overview external
Parquet and impala overview external
mattlieber
 
Fast track to getting started with DSE Max @ ING
Fast track to getting started with DSE Max @ ING
Duyhai Doan
 
PostgreSQL FTS Solutions FOSDEM 2013 - PGDAY
PostgreSQL FTS Solutions FOSDEM 2013 - PGDAY
Emanuel Calvo
 

Viewers also liked (7)

Redis persistence in practice
Redis persistence in practice
Eugene Fidelin
 
Multiprocessing with python
Multiprocessing with python
Patrick Vergain
 
Python in Action (Part 2)
Python in Action (Part 2)
David Beazley (Dabeaz LLC)
 
Redis for the Everyday Developer
Redis for the Everyday Developer
Ross Tuck
 
Python in Action (Part 1)
Python in Action (Part 1)
David Beazley (Dabeaz LLC)
 
Generators: The Final Frontier
Generators: The Final Frontier
David Beazley (Dabeaz LLC)
 
An Introduction to Python Concurrency
An Introduction to Python Concurrency
David Beazley (Dabeaz LLC)
 
Ad

Similar to Python redis talk (20)

Redis And python at pycon_2011
Redis And python at pycon_2011
sunilar0ra
 
Introduction to redis - version 2
Introduction to redis - version 2
Dvir Volk
 
Introduction to Redis
Introduction to Redis
Dvir Volk
 
Redispresentation apac2012
Redispresentation apac2012
Ankur Gupta
 
Speed up your Symfony2 application and build awesome features with Redis
Speed up your Symfony2 application and build awesome features with Redis
Ricard Clau
 
Redis
Redis
Socialmetrix
 
Redis - N✮SQL Berlin
Redis - N✮SQL Berlin
mattmatt
 
Paris Redis Meetup Introduction
Paris Redis Meetup Introduction
Gregory Boissinot
 
Redis - Usability and Use Cases
Redis - Usability and Use Cases
Fabrizio Farinacci
 
Redis — The AK-47 of Post-relational Databases
Redis — The AK-47 of Post-relational Databases
Karel Minarik
 
Introduction to Redis - LA Hacker News
Introduction to Redis - LA Hacker News
Michael Parker
 
Redis Everywhere - Sunshine PHP
Redis Everywhere - Sunshine PHP
Ricard Clau
 
Tuga IT 2017 - Redis
Tuga IT 2017 - Redis
Nuno Caneco
 
Mini-Training: Redis
Mini-Training: Redis
Betclic Everest Group Tech Team
 
Redis: REmote DIctionary Server
Redis: REmote DIctionary Server
Ezra Zygmuntowicz
 
Introduction to Redis
Introduction to Redis
Maarten Smeets
 
Redis SoCraTes 2014
Redis SoCraTes 2014
steffenbauer
 
Fun with Ruby and Redis
Fun with Ruby and Redis
javier ramirez
 
Advanced Redis data structures
Advanced Redis data structures
amix3k
 
Building Scalable, Distributed Job Queues with Redis and Redis::Client
Building Scalable, Distributed Job Queues with Redis and Redis::Client
Mike Friedman
 
Redis And python at pycon_2011
Redis And python at pycon_2011
sunilar0ra
 
Introduction to redis - version 2
Introduction to redis - version 2
Dvir Volk
 
Introduction to Redis
Introduction to Redis
Dvir Volk
 
Redispresentation apac2012
Redispresentation apac2012
Ankur Gupta
 
Speed up your Symfony2 application and build awesome features with Redis
Speed up your Symfony2 application and build awesome features with Redis
Ricard Clau
 
Redis - N✮SQL Berlin
Redis - N✮SQL Berlin
mattmatt
 
Paris Redis Meetup Introduction
Paris Redis Meetup Introduction
Gregory Boissinot
 
Redis - Usability and Use Cases
Redis - Usability and Use Cases
Fabrizio Farinacci
 
Redis — The AK-47 of Post-relational Databases
Redis — The AK-47 of Post-relational Databases
Karel Minarik
 
Introduction to Redis - LA Hacker News
Introduction to Redis - LA Hacker News
Michael Parker
 
Redis Everywhere - Sunshine PHP
Redis Everywhere - Sunshine PHP
Ricard Clau
 
Tuga IT 2017 - Redis
Tuga IT 2017 - Redis
Nuno Caneco
 
Redis: REmote DIctionary Server
Redis: REmote DIctionary Server
Ezra Zygmuntowicz
 
Redis SoCraTes 2014
Redis SoCraTes 2014
steffenbauer
 
Fun with Ruby and Redis
Fun with Ruby and Redis
javier ramirez
 
Advanced Redis data structures
Advanced Redis data structures
amix3k
 
Building Scalable, Distributed Job Queues with Redis and Redis::Client
Building Scalable, Distributed Job Queues with Redis and Redis::Client
Mike Friedman
 
Ad

Recently uploaded (20)

Daily Lesson Log MATATAG ICT TEchnology 8
Daily Lesson Log MATATAG ICT TEchnology 8
LOIDAALMAZAN3
 
Hyderabad MuleSoft In-Person Meetup (June 21, 2025) Slides
Hyderabad MuleSoft In-Person Meetup (June 21, 2025) Slides
Ravi Tamada
 
From Manual to Auto Searching- FME in the Driver's Seat
From Manual to Auto Searching- FME in the Driver's Seat
Safe Software
 
“MPU+: A Transformative Solution for Next-Gen AI at the Edge,” a Presentation...
“MPU+: A Transformative Solution for Next-Gen AI at the Edge,” a Presentation...
Edge AI and Vision Alliance
 
Mastering AI Workflows with FME by Mark Döring
Mastering AI Workflows with FME by Mark Döring
Safe Software
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Nilesh Gule
 
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
pcprocore
 
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Priyanka Aash
 
Curietech AI in action - Accelerate MuleSoft development
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 
Wenn alles versagt - IBM Tape schützt, was zählt! Und besonders mit dem neust...
Wenn alles versagt - IBM Tape schützt, was zählt! Und besonders mit dem neust...
Josef Weingand
 
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
digitaljignect
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC
 
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
Fwdays
 
Agentic AI for Developers and Data Scientists Build an AI Agent in 10 Lines o...
Agentic AI for Developers and Data Scientists Build an AI Agent in 10 Lines o...
All Things Open
 
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
Fwdays
 
The Growing Value and Application of FME & GenAI
The Growing Value and Application of FME & GenAI
Safe Software
 
Securing Account Lifecycles in the Age of Deepfakes.pptx
Securing Account Lifecycles in the Age of Deepfakes.pptx
FIDO Alliance
 
Daily Lesson Log MATATAG ICT TEchnology 8
Daily Lesson Log MATATAG ICT TEchnology 8
LOIDAALMAZAN3
 
Hyderabad MuleSoft In-Person Meetup (June 21, 2025) Slides
Hyderabad MuleSoft In-Person Meetup (June 21, 2025) Slides
Ravi Tamada
 
From Manual to Auto Searching- FME in the Driver's Seat
From Manual to Auto Searching- FME in the Driver's Seat
Safe Software
 
“MPU+: A Transformative Solution for Next-Gen AI at the Edge,” a Presentation...
“MPU+: A Transformative Solution for Next-Gen AI at the Edge,” a Presentation...
Edge AI and Vision Alliance
 
Mastering AI Workflows with FME by Mark Döring
Mastering AI Workflows with FME by Mark Döring
Safe Software
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Nilesh Gule
 
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
pcprocore
 
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Priyanka Aash
 
Curietech AI in action - Accelerate MuleSoft development
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 
Wenn alles versagt - IBM Tape schützt, was zählt! Und besonders mit dem neust...
Wenn alles versagt - IBM Tape schützt, was zählt! Und besonders mit dem neust...
Josef Weingand
 
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
WebdriverIO & JavaScript: The Perfect Duo for Web Automation
digitaljignect
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC
 
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
Fwdays
 
Agentic AI for Developers and Data Scientists Build an AI Agent in 10 Lines o...
Agentic AI for Developers and Data Scientists Build an AI Agent in 10 Lines o...
All Things Open
 
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
"How to survive Black Friday: preparing e-commerce for a peak season", Yurii ...
Fwdays
 
The Growing Value and Application of FME & GenAI
The Growing Value and Application of FME & GenAI
Safe Software
 
Securing Account Lifecycles in the Age of Deepfakes.pptx
Securing Account Lifecycles in the Age of Deepfakes.pptx
FIDO Alliance
 

Python redis talk

  • 1. Redis and Python by Josiah Carlson @dr_josiah dr-josiah.blogspot.com bit.ly/redis-in-action
  • 2. Redis and Python; It's PB & J time by Josiah Carlson @dr_josiah dr-josiah.blogspot.com bit.ly/redis-in-action
  • 3. What will be covered • Who am I? • What is Redis? • Why Redis with Python? • Cool stuff you can do by combining them
  • 4. Who am I? • A Python user for 12+ years • Former python-dev bike-shedder • Former maintainer of Python async sockets libraries • Author of a few small OS projects o rpqueue, parse-crontab, async_http, timezone-utils, PyPE • Worked at some cool places you've never heard of (Networks In Motion, Ad.ly) • Cool places you have (Google) • And cool places you will (ChowNow) • Heavy user of Redis • Author of upcoming Redis in Action
  • 5. What is Redis? • In-memory database/data structure server o Limited to main memory; vm and diskstore defunct • Persistence via snapshot or append-only file • Support for master/slave replication (multiple slaves and slave chaining supported) o No master-master, don't even try o Client-side sharding o Cluster is in-progress • Five data structures + publish/subscribe o Strings, Lists, Sets, Hashes, Sorted Sets (ZSETs) • Server-side scripting with Lua in Redis 2.6
  • 6. What is Redis? (compared to other databases/caches) • Memcached o in-memory, no-persistence, counters, strings, very fast, multi-threaded • Redis o in-memory, optionally persisted, data structures, very fast, server-side scripting, single-threaded • MongoDB o on-disk, speed inversely related to data integrity, bson, master/slave, sharding, multi-master, server-side mapreduce, database-level locking • Riak o on-disk, pluggable data stores, multi-master sharding, RESTful API, server-side map-reduce, (Erlang + C) • MySQL/PostgreSQL o on-disk/in-memory, pluggable data stores, master/slave, sharding, stored procedures, ...
  • 7. What is Redis? (Strings) • Really scalars of a few different types o Character strings  concatenate values to the end  get/set individual bits  get/set byte ranges o Integers (platform long int)  increment/decrement  auto "casting" o Floats (IEEE 754 FP Double)  increment/decrement  auto "casting"
  • 8. What is Redis? (Lists) • Doubly-linked list of character strings o Push/pop from both ends o [Blocking] pop from multiple lists o [Blocking] pop from one list, push on another o Get/set/search for item in a list o Sortable
  • 9. What is Redis? (Sets) • Unique unordered sequence of character strings o Backed by a hash table o Add, remove, check membership, pop, random pop o Set intersection, union, difference o Sortable
  • 10. What is Redis? (Hashes) • Key-value mapping inside a key o Get/Set/Delete single/multiple o Increment values by ints/floats o Bulk fetch of Keys/Values/Both o Sort-of like a small version of Redis that only supports strings/ints/floats
  • 11. What is Redis? (Sorted Sets - ZSETs) • Like a Hash, with 'members' and 'scores', scores limited to float values o Get, set, delete, increment o Can be accessed by the sorted order of the (score,member) pair  By score  By index
  • 12. What is Redis? (Publish/Subscribe) • Readers subscribe to "channels" (exact strings or patterns) • Writers publish to channels, broadcasting to all subscribers • Messages are transient
  • 13. Why Redis with Python? • The power of Python lies in: o Reasonably sane syntax/semantics o Easy manipulation of data and data structures o Large and growing community • Redis also has: o Reasonably sane syntax/semantics o Easy manipulation of data and data structures o Medium-sized and growing community o Available as remote server  Like a remote IPython, only for data  So useful, people have asked for a library version
  • 14. Per-hour and Per-day hit counters from itertools import imap import redis def process_lines(prefix, logfile): conn = redis.Redis() for log in imap(parse_line, open(logfile, 'rb')): time = log.timestamp.isoformat() hour = time.partition(':')[0] day = time.partition('T')[0] conn.zincrby(prefix + hour, log.path) conn.zincrby(prefix + day, log.path) conn.expire(prefix + hour, 7*86400) conn.expire(prefix + day, 30*86400)
  • 15. Per-hour and Per-day hit counters (with pipelines for speed) from itertools import imap import redis def process_lines(prefix, logfile): pipe = redis.Redis().pipeline(False) for i, log in enumerate(imap(parse_line, open(logfile, 'rb'))): time = log.timestamp.isoformat() hour = time.partition(':')[0] day = time.partition('T')[0] pipe.zincrby(prefix + hour, log.path) pipe.zincrby(prefix + day, log.path) pipe.expire(prefix + hour, 7*86400) pipe.expire(prefix + day, 30*86400) if not i % 1000: pipe.execute() pipe.execute()
  • 16. Simple task queue - add/run items import json import redis def add_item(queue, name, *args, **kwargs): redis.Redis().rpush(queue, json.dumps([name, args, kwargs])) def execute_one(queues): item = redis.Redis().blpop(queues, 30) name, args, kwargs = json.loads(item) REGISTRY[name](*args, **kwargs)
  • 17. Simple task queue - register tasks REGISTRY = {} def task(queue): def wrapper(function): def defer(*args, **kwargs): add_item(queue, name, *args, **kwargs) name = function.__name__ if name in REGISTRY: raise Exception( "Duplicate callback %s"%(name,)) REGISTRY[name] = function return defer if isinstance(queue, str): return wrapper function, queue = queue, 'default' return wrapper(function)
  • 18. Simple task queue – register tasks @task('high') def do_something(arg): pass @task def do_something_else(arg): pass
  • 19. Cool stuff to do... • Reddit • Publish/Subscribe • Caching • Messaging • Cookies • Search engines • Analytics • Ad targeting • Configuration • Twitter management • Chat rooms • Autocomplete • Job search • Distributed locks • ... • Counting Semaphores • Task queues
  • 20. Thank you @dr_josiah dr-josiah.blogspot.com bit.ly/redis-in-action Questions?