redisnoelherrick.com
History of database technology 70s - Database access is hard and
depends on the app 80s – Relational databases come on
the scene 90s – Object oriented programming
and DBs 00s – Interpreted languages, Agile
Web scale
Means an app that supports millions of users
Represents relationships Variable usage (viral apps) Data that is important aggregated,
not by itself Time-to-market vs. proper design Uptime (availability) vs. correctness Ease of management vs.
customization
NoSQL
Rejection of RDBMS as one-size-fits-all
Minimal functions and minimal admin
BASE Basically available, Soft state, Eventually
consistent ACID
Atomic, Consistent, Isolation, Durable
Basics of Redis
Written in C Open-source and free (no royalties) New BSD license By Salvatore Sanfilippo Created for a Web analytics project Sponsored by VMWare Used by various projects: github,
craigslist, stackoverflow, digg
Architecture
Key-value dictionary with sets, lists Single-threaded Delayed writes Data needs to be kept in-memory Simple protocol Lack of table, schema, or database Very basic security
Potential Uses
Session store One (or more) sessions per user Many reads, few writes Throw-away data Timeouts
Potential Uses
Logging Rapid, low latency writes Data you don’t care that much about Not that much data (must be in-
memory)
Transaction store
Low-latency write Many reads throughout transaction Short (less than a day) Think a shopping cart or a file upload
General Cases
Data that you don’t mind losing Records that can be accessed by a
single primary key Schema that that is either a single
value or is a serialized object
Clients
Java Jedis (github)
.NET ServiceStack (Google Code)
Ruby redis-rb (github)
Basic functions
SET k v GET k MSET k v [k2 v2] MGET k [k2 …] GETSET k v
Returns value before set, sets new value SETNX k v (only sets if does not
exist) SETEX k n v (expires a key after n
seconds)
Advanced Functionality - Sets Set is unordered grouping of values SADD k v SCARD k – counts set SISMEMBER k v – checks to see if v is
in set SUNION k [k2 …] – adds sets SINTER k [k2 …] – intersects sets SDIFF k [k2 …] – subtracts sets
Advanced Functionality - Lists Ordered group LPUSH k v – prepends LPOP k v – removes 1st element LINSERT k BEFORE || AFTER n v – inserts
v before or after the nth element RPUSH kv – appends RPOP k v – removes last element LLEN k – number of elements LRANGE k n m – gets range n to m
inclusive
Adv Functionality - Replication SLAVEOF host port Asynchronous Can chain together pub -> slave ->
slave Cannot chain together pub <-> pub
Advanced Functionality - Misc Sorted sets (indexed but with set
operations, higher big-O complexity) Hashes (many values for one key)
HSET k field v – sets v for field for k HGET k field
MULTI / EXEC / DISCARD / WATCH – xactions
Message queues (Pub/Sub)
Troubleshooting - Logs
Startup info Client logins Databases and number of keys Background saves and time Replication
Troubleshooting - IO Patterns Bottleneck on memory Low CPU Disk only on flush
Big O Costs
Amortized SET, GET, etc – O(1) KEYS – O(N) ZADD, ZREM, etc – O(log(n))
Place in the Database Jungle General Types of Databases
Relational Databases – Oracle, Postgres, MySQL
Object Stores – Objectivity, Cache, db4o Key Value Stores – Berkelely DB, Riak,
Cassandra Document Stores – Mongo, Lotus, Couch Graph Databases – Neo4j, InfoGrid
Redis is a key value store
Comparisons - Cassandra Intentionally made for clustering Replicas are not consistent Written in Java Much more robust organization Often called a column-store, though
this is a misnomer Imitates Dynamo
Comparisons - Riak
Written in Erlang Robust organization REST Api Made for clustering, similar to
Cassandra Imitates Dynamo
Comparisons - MongoDB
Document store – can represent objects natively – understands its data
Can access by values Much more advanced architecture Auto-sharding