Pon tus aplicaciones a 100 con Redis

Daniel Mazzini

Arquitecto @Tokiota
Acerca de ..
• Esposo y padre
• Arquitecto en @tokiota (estrenando Gold Partner)

東京‘

TOKIOTA
NOSQL … el porque
• Base de datos relacionales:
• Gran cantidad de datos
• Concurrencia / bloqueo
• Schemas vs Agile
• Coste de licenciamientos

• Modelos de NoSQL
• Key – Value
¿Qué es redis?
SET nombre “Daniel”
• REmote DIrectory Server
• 20k líneas en C++ de Salvatore Sanfilippo GET nombre
=> “Daniel”
• Open source
• Actualmente patrocinado por VMware
• Servidor de estructuras de datos en memoria
en memoria…

Pero configurándolo
puede persistir a disco…
¿Por qué redis?
• Es realmente muy rápida
• Single Thread
• Muchos clientes
•
•
•
•

Java
Ruby
Python
Y como no … .Net

redis-benchmark -r 1000000 -q

Los ejemplos están con ServiceStack.Redis

install-package servicestack.redis
Sobre servicestack.redis

• Tienes al menos 3 interfaz para el servicio de Redis

• IRedisNativeClient tienes los mismos nombres de métodos que
Redis
• Puedes usar la documentación de los comandos del propio sitio de redis

+ abstracto -

IRedisTypedClient<TPoco> >
IRedisClient (string) >
IRedisNativeClient (raw byte[])
¿Quién usa redis?

http://redis.io/topics/whos-using-redis
Tipos de datos de valor
Las claves
• Son simple string
• Deben ser únicas
• Seudo nomenclatura

• “objeto-tipo:id:campo”
• “nivelMayornivelInferior”

• Sin caracteres especiales
• Pueden expirar
String

key

string

Operaciones
Get
Set

• Tipo de dato simple
• {Json} u otro formato serializado

Append
Lista
Operaciones
RPush
key

LRange
LIndex
LPop
Lista
Operaciones
RPush
key

LRange
A

B

C

LIndex
LPop
Lista
Operaciones
RPush
key

LRange
C

A

B

C

LIndex
LPop
Lista
Operaciones
RPush
key

LRange
C

A

B

C

LIndex
LPop

LPop
Lista
Operaciones
RPush
key

LRange
C

A

B

C

LIndex
LPop

LPop

RPop
Set

Operaciones

B

SAdd
key

A

SRem
C

SMembers
SIsMember
Order Set
Operaciones
ZAdd
C:1

ZRange
ZRangeByScore

key

A:3
X:3
B:5

ZRem
Hash
key

Operaciones

Sub-clave 1

valor

Sub-clave 2

valor

HGet

Sub-clave 3

valor

HGetAll

HSet

HDel
Contador
• Contadores atómicos
• INCR “user:id”
Publicador / suscriptor
Transacción
Caso #1 Cache

cache
Caso #2 Page Counter
• ActionFilter de MVC

pageCounter

Controller : Action

100
Caso #2 Page Counter
• ActionFilter de MVC

pageCounter

Controller : Action

100

Home : Index

5
Caso #3 ¿Quien esta en línea?

Usuarios online
Caso #3 ¿Quien esta en línea?

Usuarios online

Mis amigos
Caso #3 ¿Quien esta en línea?

Usuarios online

Amigos online

Mis amigos
Caso #3 ¿Quien esta en línea?

Usuarios online

Amigos online

Mis amigos

userLive:201311081630
userLive:201311081631
userLive:201311081632

Por cada minuto, una clave
Caso #4 ReadModel en un CQRS

Batch
Updater

while(true)
{
calcularView();
}
Caso #4 ReadModel en un CQRS

Batch
Updater
Read
Model

while(true)
{
calcularView();
}
Caso #4 ReadModel en un CQRS

Batch
Updater

leer
Read
Model

while(true)
{
calcularView();
}
Caso #4 ReadModel en un CQRS

Quick
Updater

escribir

Batch
Updater

leer
Read
Model

while(true)
{
calcularView();
}
Caso #4 ReadModel en un CQRS

Quick
Updater

escribir

escribir

Pub/sub
Batch
Updater

leer
Read
Model

while(true)
{
calcularView();
}
Caso #4 ReadModel en un CQRS

Quick
Updater

escribir

escribir

Pub/sub
Batch
Updater

leer
Read
Model

Power by redis 

while(true)
{
calcularView();
}
Caso #5 Autocomplete
ZADD “P” 0
ZADD “PL” 0
ZADD “PLA” 0
ZADD “PLAN” 0
ZADD “PLAN*” 0
ZADD “PLANE” 0
ZADD “PLANET” 0
ZADD “PLANETA*” 0
ZADD “PLANI” 0
ZADD “PLANIF” 0
ZADD “PLANIFI” 0
ZADD “PLANIFIC” 0
ZADD “PLANIFICA” 0
ZADD “PLANIFICAD” 0
ZADD “PLANIFICADO” 0
ZADD “PLANIFICADOR*” 0
Conclusión
• Redis = Rápido
• Redis = Mas que Key-Value
• El código de la sesión esta en:
https://github.com/tokiota/BcnDevConRedis
Preguntas?
MERCI
GRACIAS
THANKS

Resum Executiu

東京‘

TOKIOTA

Pon tus aplicaciones a 100 con redis