Brewing Beer with Windows Azure

Get more than a cache back!
The Microsoft Azure (Redis) Cache
Maarten Balliauw
@maartenballiauw
Who am I?
Maarten Balliauw
Antwerp, Belgium
Software Engineer, Microsoft
Founder, MyGet
AZUG
Focus on web
ASP.NET MVC, Azure, SignalR, ...
Former MVP Azure & ASPInsider
Big passion: Azure
http://blog.maartenballiauw.be
@maartenballiauw
Shameless self promotion: Pro NuGet http://amzn.to/pronuget2
Agenda
Azure Cache
Redis
Data types
Transactions
Pub/sub
Scripting
Sharding/partitioning
Patterns
Azure Cache
Caching on Azure
A bit of history...
Windows Server: AppFabric (“Velocity”) (2009-2010)
Azure
(ASP.NET cache)
“Shared Cache” (AppFabric cache, multi-tenant)
Self-Hosted Dedicated Cache
Managed Cache (the above, but managed by Microsoft and with an SLA)
Caching on Azure
New ways to develop applications
1920: Cache used to be a cache
2012: Cache became the go-to datastore
Twitter stores 800 tweets / timeline in Redis
New application types on Azure: PHP, Node, Java, ...
Too much work to write AppFabric clients for all!
http://www.redis.io/clients
Way easier: just make it work on Windows and Azure
Redis
Redis
“Redis is an open source, BSD licensed,
networked, single-threaded, in-memory keyvalue cache and store. It is often referred to as a data
structure server since keys can contain strings, hashes, lists, sets,
sorted sets, bitmaps and hyperloglogs.”
Redis
Things to remember
Key-value cache and store (value can be a couple of things)
In-memory (no persistence, but you can)
Single-threaded (atomic operations & transactions)
Networked (it’s a server and it does master/slave)
Some other stuff (scripting, pub/sub, Sentinel, snapshot, …)
So no persistence?
Possible using a lot of I/O
AOF (append-only files)
RDB (Redis DB snapshots)
With or without: all your data must fit in memory
Redis 101
demo
The Little Redis Book
By Karl Seguin
http://openmymind.net/redis.pdf
Data types
Type
Example Key
Example value
String
cache:/home
<html><head><title>Home page</title>
Hash
categories:1
Field
name
description
numproducts
Set
categories:1:products
20 11 56 89 32 4
List
products:20:comments
[0] -> “...”
[1] -> “...”
[2] -> “...”
Sorted set
products:bestsellers
Field
Eye Patch
Parrot
+ Bitmap, Hyperloglog
Member
Books
Books for sale
50000
Score
84632
82120
Data types
demo
Data types
Type
Example Key
Example value
String
cache:/home
user:nextid
<html><head><title>Home page</title>
2
Hash
user:1
Field
name
handle
Set
user:1:followers
10 42 99 85
List
user:1:timeline
[0] -> “...”
[1] -> “...”
[2] -> “...”
Sorted set
trending:se:tags
Field
#sdc
#redis
+ Bitmap, Hyperloglog
Member
Maarten
@maartenballiauw
Score
84632
82120
Keys
Good practice: use a pattern for keys
E.g. users:1:maarten
Get by id:
KEYS users:1:*
GET ......
Get by name:
KEYS users:*:maarten
GET ......
O(N) operation – use with caution! (SCAN)
But... .NET?
Lots of options! http://www.redis.io/clients
NuGet:
ServiceStack.Redis
StackExchange.Redis
RedisAspNetProviders
Connecting to Redis
from .NET
demo
But... Azure?
“It’s just Redis!”
Main differences: auth mechanism and SSL support
Use local for development from GitHub or NuGet
(Redis-32 or Redis-64)
Azure Redis Cache
demo
Azure Redis Cache
Redis + Auth + SSL
Monitoring
Alerts
Awesome tool: www.redsmin.com
Transactions
MULTI, EXEC, DISCARD, WATCH
No rollbacks (just discard queue)
Failures are because of you, not Redis
Optimistic locking with WATCH
Only execute transaction queue if watched keys did not change
Transactions
demo
Pub/Sub
(P)SUBSCRIBE, UNSUBSCRIBE, PUBLISH
Subscribe to a queue
SUBSCRIBE news (or PSUBSCRIBE news:*)
Send data to a queue
PUBLISH news “This just in!”
(optional) Keyspace notifications
http://www.redis.io/topics/notifications
CONFIG SET notify-keyspace-events KEA
PSUBSCRIBE '__key*__:*' (or __keyspace@0__:foo)
Pub/Sub
demo
Scripting
Run Lua scripts on Redis
http://www.redis.io/commands/eval
EVAL ‘return “Hello, World!”’ 0
Scripts are cached (SCRIPT FLUSH)
Scripts can be used as functions
Although we must pass the body all the time (or use SCRIPT LOAD +
EVALSHA)
Helper functions available!
Base, table, string, math, debug, struct, cjson, cmsgpack, redis.sha1hex
Scripting
demo
What if I need more memory?
Sharding!
On client (consistent hashing)
On server (Redis Cluster, not on Azure)
Using a proxy (Twemproxy - https://github.com/twitter/twemproxy)
var options = new ConfigurationOptions
{
EndPoints = { "my-server" },
Proxy = Proxy.Twemproxy
};
Patterns
When can I use Redis?
ASP.NET Output Caching (RedisAspNetProviders)
ASP.NET Session State
General-purpose cache
Table Storage secondary index
“Cache with benefits”
Pub/sub
Generally: when use case maps and data fits in RAM
When should I avoid Redis?
More data than can fit in RAM
Can use multiple, but even then: SUM(RAM) == max. data size
Data and query model fits well in a relational model
Materialize certain queries in Redis if needed
Avoid Redis for large objects
Especially with lots of concurrent read/write operations
Counting stuff
How would you count “likes” if you were Facebook?
Table Storage
1 entity per likeable entity + per server instance for writes, sum entities for read
I/O and CPU time...
SQL
UPDATE ...
Locking...
Redis
INCR post:12345
(Every once in a while, check keys to persist)
Counting stuff (2)
How would you count “likes” if you were Facebook?
And how would you get the 5 most popular posts?
Use a sorted set
Elements are scored (= # of likes)
We can use ZREVRANGE to get the top X posts
ZREVRANGE posts:likes 0 5 withscores
Get the latest 5 product reviews
No need to go to the database
Use a Redis List, truncated at 5 items
Need more? Query the database
Rate limiting
API should only allows 5 requests per 60 seconds
Redis List
1
2
3
4
5
12:20:25
12:20:22
12:20:21
12:20:18
12:19:50
Record 5 latest requests
If we’re at 5, check the leftmost item versus current time
What’sUp?
Sending short messages between parties, how to
implement?
Pub/Sub:
Every user gets a subscription, others can end to that subscription
Server listens on all subscriptions to archive/persist messages
When user comes online, server can publish messages since last visit from
archive/a Redis list
Autocompletion
How to provide autocompletion over our millionrecords product catalog?
SQL “LIKE”
Lucene.NET / ElasticSearch
Redis Sorted Set
Intersecting collections
“Which friends do we have in common?”
Algorithm could be:
Find friends that we have in common
Find friends they have in common
Score the # of connections
Sort
We have a series of bugs
Priority, Status, Title, ...
A user follows a few of these bugs
How to store?
How to query? (give me my top 5 bugs by priority)
Conclusion
Conclusion
Azure Cache
Redis is not just a cache
Data types
Transactions
Pub/sub
Scripting
Sharding/partitioning
Patterns
1 thing to remember: http://openmymind.net/redis.pdf
Thank you!
http://blog.maartenballiauw.be
@maartenballiauw
http://amzn.to/pronuget2