SlideShare uma empresa Scribd logo
1 de 48
Aplicaciones web
ultraescalables con
       Redis
          Alberto Gimeno
            @gimenete

          18 Febrero 2011
¿Qué es Redis?
• Base de datos clave-valor
• Soporta tipos de datos ¡y transacciones!
• Muuuuuuuuuy rápida. ~100k op/s
• Esponsorizada por VMWare
NoSQL buzzzzzzzz
¿RDBMS suficiente?
• 640K - of memory - ought to be enough for
  anybody - Bill Gates?
• Who the hell knew how much address space
  we needed? - Vint Cerf
¿Hasta cuánto
        necesitaré escalar?
• ¿Cuántos usuarios tienes? ¿Cuál es tu máximo de
  usuarios? Tu país, todos los smartphones del mundo,
  el mundo entero?
• ¿Cuántas peticiones/s hace cada usuario de media?
• Elasticidad: ¿tienes picos?
¿Quién necesita escalar
  mucho? Ejemplos:
• Juegos. Especialmente multijugador.
• Aplicaciones sociales. Ej: Facebook apps
• Web services. Ej: pasarelas de pago.
• ¿Tú? Depende, claro.
Escalar es...
• Escalar es poder atender más peticiones / s
• Podemos escalar:
 • Con software más óptimo. ¡Ahorro de costes!
   Ejemplo: http://bit.ly/ibdi20
 • Con hardware:
  • Verticalmente: mejor hardware en 1 máquina
  • Horizontalmente: más máquinas
RDMBS to the limit
SQL ¿rápido?

1. Parsear SQL          6. Acceder a los datos
2. Planificar consulta   7. Álgebra relacional
3. Optimizar consulta   8. Cerrar tablas
4. Abrir tablas         9. Devolver resultado
SQL ¿rápido?
•   Muchos pasos
•   Difícil de optimizar
•   Perdemos control
•   Difícil de escalar
Ejemplo: menéame.net
Join, join, join, join
Join, join, join, join
SELECT link_id AS id, link_author AS author, link_blog AS blog, /* muc

 FROM links

 INNER JOIN users ON (user_id = link_author)

 LEFT JOIN (categories AS cat, categories AS meta) ON (cat.category_i

 LEFT JOIN votes ON (link_date > @enabled_votes AND vote_type='links'

 LEFT JOIN favorites ON (@user_id > 0 AND favorite_user_id =  @user_i

 LEFT JOIN link_clicks AS clicks ON (clicks.id = links.link_id)

 INNER JOIN (SELECT link_id FROM links $from WHERE $where $order_by L



                  Fuente: http://bit.ly/fLf0MK
Menéame.net
Creo que sería muy complicado encontrar una consulta más
eficiente que la anterior para la base de datos del
Menéame. Pero no ha sido una idea que se me ocurrió de
un día para otro, ni siquiera en semanas. Fue la evolución y
el resultado de 5 años de experiencia directa, a veces
dolorosa, y de aprender muchas cosas en el proceso.

- Ricardo Galli


             Fuente: http://bit.ly/fLf0MK
Back to basics
Clave => valor
• DNI => persona
• Matrícula => coche   • PK => fila
• Puntero => dato
Get / Set
redis> set foo bar
OK
redis> get foo
"bar"
Incr
redis> incr usuarios
(integer) 1
redis> get usuarios
"1"
Ventajas
• Fácil de escalar, como veremos.
• Rendimiento predecible. Sólo operaciones
  eficientes: optimizado por defecto
• Operaciones atómicas
¿Cómo escalar?

• Escalar lecturas: replicación
• Escalar escrituras: particionamiento
Particionamiento
• Los datos están en varios nodos
• A partir de la clave sabemos el nodo donde
  está el dato.
• Particionamiento manual. Ej: claves con fechas
• Ejemplo particionamiento “automático”:
 • nodo
=
hash(clave)
%
nodos
Particionamiento
• nodo
=
hash(clave)
%
nodos
• Problema: resharding. Al añadir o quitar
  nodos. ¡Hay que mover casi todos los datos!
• Solución: consistent hashing => método para
  que los datos a mover sean los menos
  posibles.
Para no hacerlo
              nosotros...
• redis-cluster
 • En desarrollo.Versión experimental en Marzo
 • RC prevista para Junio
 • http://bit.ly/c4XyyZ
• redis-sharding
 • Sustituto temporal hasta que redis-cluster esté listo
 • https://github.com/kni/redis-sharding
Datos estructurados
¿get/set/incr suficiente?
• Objetos:
 • claves “usuario:1”, “usuario:2”,...
 • valores: serialización, json, xml,...
• ¿Consultas?
 • Índices manuales: listas, sets que guardan ids
 • También serializados
Pero Redis nos lo hace
      más fácil
   • Soporta datos estructurados:
    • Hashes
    • Listas
    • Sets y sets ordenados
Hashes
redis> hset usuario:1 nombre Antonio
(integer) 1
redis> hset usuario:1 apellido Gonzalo
(integer) 1
redis> hgetall usuario:1
1. "nombre"
2. "Antonio"
3. "apellido"
4. "Gonzalo"
Hashes
redis> hincrby usuario:1 followers
(integer) 1


•Nos ahorramos leer-calcular-modificar
•Siguen siendo operaciones atómicas
Listas
redis> lpush mensajes mundo
(integer) 1
redis> lpush mensajes hola
(integer) 2
redis> lrange mensajes 0 -1
1. "hola"
2. "mundo"
Sets y sets ordenados
redis> zincrby superheroes 1 batman
"1"
redis> zincrby superheroes 10 kickass
"10"
redis> zincrby superheroes 3 spiderman
"3"
redis> zrevrange superheroes 0 -1 withscores
1. "kickass"
2. "10"
3. "spiderman"
4. "3"
5. "batman"
6. "1"
Modelado de datos
Modelado de datos
• Objetos → hashes
• Consultas → Listas, sets y sets ordenados
 • Guardar sólo el id
 • Son índices manuales
APIs bajo nivel
• Muchas en muchos lenguajes.
• En Java por ejemplo: Jedis
• Spring Data
APIs de alto nivel

  • GORM Redis
  • ¿Hacemos la nuestra?
Do it yourself

   public static IntegerValue users = new IntegerValue("users");

   public static ObjectValue<User> user
                     = new ObjectValue<User>(User.class, "user");




                    Integer n = users.incr();
                    
 
                    User u = new User("Pepe");
                    user.withKey(n.toString()).set(u);
Do it yourself
• Clases que abstraen los valores soportados
  en Redis:
 • IntegerValue
 • ObjectValue
con generics
 • ListValue

 • SetValue

 • SortedSetValue.
Do it yourself

• withKey(String...params)
 • Construye una clave con un prefijo y los
    params separados por “:”.
 • Devuelve un objeto con métodos
    apropiados para el tipo de dato
Transacciones
Transacciones
• MULTI. Inicia transación.
• EXEC. Ejecuta transacción.
• DISCARD. Cancela transación.
• WATCH / UNWATCH. Bloquea /
  desbloquea valores de ser modificados
  durante la transacción
PUB/SUB
PUB/SUB
redis> SUBSCRIBE canal1
Reading messages... (press Ctrl-c to quit)
1. "subscribe"
2. "canal1"
3. (integer) 1

redis> PUBLISH canal1 Hola
(integer) 1

                                       DEMO
1. "message"
2. "canal1"
3. "Hola"
Configurar Redis
Todo en memoria
• Comportamiento por defecto
• La BD debe caber en RAM
• Persistencia:
 • Snapshotting. Con fork
 • Append-only file. Log binario
Virtual Memory (VM)
• Guarda las claves en memoria
• Los valores se guardan en disco a partir de
  cierto máximo de memoria usado.
• Desaconsejado
Diskstore
• Permite guardar claves y valores en disco
• Permite tener replicados en memoria los
  datos más usados
• A partir de la versión 2.2
Cuándo usar Redis
Cuándo usar Redis

• Como caché. Un memcache con datos estructurados
    y persistente. También soporta expiración.
• Como base de datos auxiliar cuando se necesite
    mucha velocidad.              Que sea persistente tiene
•                                 una ventaja importante: si
    Como base de datos principal. se cae la caché, al volver a
                                  arrancarla no está vacía.
                                  Así que no habrá un aluvión
                                  de peticiones a la fuente de
                                  datos principal.
¿Preguntas?

Thanks for attending!

    @gimenete

   http://redis.io

Mais conteúdo relacionado

Mais procurados

Node.js - Eventos para Todos
Node.js - Eventos para TodosNode.js - Eventos para Todos
Node.js - Eventos para Todos
Mariano Iglesias
 

Mais procurados (20)

Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?Así que pusiste MongoDB. Dime ¿cómo lo administras?
Así que pusiste MongoDB. Dime ¿cómo lo administras?
 
Bd nosql clave valor
Bd nosql clave valorBd nosql clave valor
Bd nosql clave valor
 
Introducción a Apache HBase
Introducción a Apache HBaseIntroducción a Apache HBase
Introducción a Apache HBase
 
Dbdeployer
DbdeployerDbdeployer
Dbdeployer
 
NOSQL: Primeros Pasos en MongoDB
NOSQL: Primeros Pasos en MongoDBNOSQL: Primeros Pasos en MongoDB
NOSQL: Primeros Pasos en MongoDB
 
Maricela poaquiza
Maricela poaquizaMaricela poaquiza
Maricela poaquiza
 
Node.js - Eventos para Todos
Node.js - Eventos para TodosNode.js - Eventos para Todos
Node.js - Eventos para Todos
 
SqueakDBX
SqueakDBXSqueakDBX
SqueakDBX
 
Meetup spark + kerberos
Meetup spark + kerberosMeetup spark + kerberos
Meetup spark + kerberos
 
Bulma 441
Bulma 441Bulma 441
Bulma 441
 
Sistemas de Operacion - Presentación Servidor LDAP
Sistemas de Operacion - Presentación Servidor LDAPSistemas de Operacion - Presentación Servidor LDAP
Sistemas de Operacion - Presentación Servidor LDAP
 
trabajo numero 3
trabajo numero 3trabajo numero 3
trabajo numero 3
 
Servidor web apache
Servidor web apacheServidor web apache
Servidor web apache
 
Webcast hyperv trabajando con discos de red
Webcast   hyperv trabajando con discos de redWebcast   hyperv trabajando con discos de red
Webcast hyperv trabajando con discos de red
 
Mejores Prácticas Administración de Base de Datos Oracle
Mejores Prácticas Administración de Base de Datos OracleMejores Prácticas Administración de Base de Datos Oracle
Mejores Prácticas Administración de Base de Datos Oracle
 
Hydra
HydraHydra
Hydra
 
Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop
Herramientas y ejemplos de trabajos MapReduce con Apache HadoopHerramientas y ejemplos de trabajos MapReduce con Apache Hadoop
Herramientas y ejemplos de trabajos MapReduce con Apache Hadoop
 
Organizando un datacenter virtual
Organizando un datacenter virtualOrganizando un datacenter virtual
Organizando un datacenter virtual
 
Arquitectura Multitenant en Oracle 12c
Arquitectura Multitenant en Oracle 12cArquitectura Multitenant en Oracle 12c
Arquitectura Multitenant en Oracle 12c
 
Requerimientos de PostgreSQL
Requerimientos de PostgreSQLRequerimientos de PostgreSQL
Requerimientos de PostgreSQL
 

Semelhante a Aplicaciones web altamente escalables con Redis

Gestores de Base de Datos en Linux: Un vistazo a MySQL y PostgreSQL
Gestores de Base de Datos en Linux:  Un vistazo a MySQL y PostgreSQLGestores de Base de Datos en Linux:  Un vistazo a MySQL y PostgreSQL
Gestores de Base de Datos en Linux: Un vistazo a MySQL y PostgreSQL
Juan Percy Rojas Cruz
 
Conferencia MySQL, NoSQL & Cloud: Construyendo una infraestructura de big dat...
Conferencia MySQL, NoSQL & Cloud: Construyendo una infraestructura de big dat...Conferencia MySQL, NoSQL & Cloud: Construyendo una infraestructura de big dat...
Conferencia MySQL, NoSQL & Cloud: Construyendo una infraestructura de big dat...
Socialmetrix
 

Semelhante a Aplicaciones web altamente escalables con Redis (20)

Mongo Mapper
Mongo MapperMongo Mapper
Mongo Mapper
 
Git: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativoGit: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativo
 
Introducción mongodb y desarrollo
Introducción mongodb y desarrolloIntroducción mongodb y desarrollo
Introducción mongodb y desarrollo
 
Gestores de Base de Datos en Linux: Un vistazo a MySQL y PostgreSQL
Gestores de Base de Datos en Linux:  Un vistazo a MySQL y PostgreSQLGestores de Base de Datos en Linux:  Un vistazo a MySQL y PostgreSQL
Gestores de Base de Datos en Linux: Un vistazo a MySQL y PostgreSQL
 
Social Erlang
Social ErlangSocial Erlang
Social Erlang
 
Polybase
PolybasePolybase
Polybase
 
El futuro de Big Data: La calidad del análisis. Modelos efectivos y casos de uso
El futuro de Big Data: La calidad del análisis. Modelos efectivos y casos de usoEl futuro de Big Data: La calidad del análisis. Modelos efectivos y casos de uso
El futuro de Big Data: La calidad del análisis. Modelos efectivos y casos de uso
 
Grails, opción real y escalable para sitios web de alta carga
Grails, opción real y escalable para sitios web de alta cargaGrails, opción real y escalable para sitios web de alta carga
Grails, opción real y escalable para sitios web de alta carga
 
Introducción a NoSQL
Introducción a NoSQLIntroducción a NoSQL
Introducción a NoSQL
 
Actividad de aprendizaje 4
Actividad de aprendizaje 4Actividad de aprendizaje 4
Actividad de aprendizaje 4
 
"Al rico" PHP
"Al rico" PHP"Al rico" PHP
"Al rico" PHP
 
S8-DAW-2022S1.pptx
S8-DAW-2022S1.pptxS8-DAW-2022S1.pptx
S8-DAW-2022S1.pptx
 
Conferencia MySQL, NoSQL & Cloud: Construyendo una infraestructura de big dat...
Conferencia MySQL, NoSQL & Cloud: Construyendo una infraestructura de big dat...Conferencia MySQL, NoSQL & Cloud: Construyendo una infraestructura de big dat...
Conferencia MySQL, NoSQL & Cloud: Construyendo una infraestructura de big dat...
 
Pon tus aplicaciones a 100 con redis
Pon tus aplicaciones a 100 con redisPon tus aplicaciones a 100 con redis
Pon tus aplicaciones a 100 con redis
 
SpringIO 2012 Madrid-Escalabilidad con Grails
SpringIO 2012 Madrid-Escalabilidad con GrailsSpringIO 2012 Madrid-Escalabilidad con Grails
SpringIO 2012 Madrid-Escalabilidad con Grails
 
Integración de Oracle Data Integrator con Oracle GoldenGate 12c
Integración de Oracle Data Integrator  con Oracle GoldenGate 12cIntegración de Oracle Data Integrator  con Oracle GoldenGate 12c
Integración de Oracle Data Integrator con Oracle GoldenGate 12c
 
Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2
 
Desayuno de arquitectos: Big data en azure
Desayuno de arquitectos: Big data en azureDesayuno de arquitectos: Big data en azure
Desayuno de arquitectos: Big data en azure
 
Java script para desarrolladores SharePoint
Java script para desarrolladores SharePointJava script para desarrolladores SharePoint
Java script para desarrolladores SharePoint
 
Sergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | DevelopersSergio arroyo | TAPTAP Networks | Developers
Sergio arroyo | TAPTAP Networks | Developers
 

Aplicaciones web altamente escalables con Redis

  • 1. Aplicaciones web ultraescalables con Redis Alberto Gimeno @gimenete 18 Febrero 2011
  • 2. ¿Qué es Redis? • Base de datos clave-valor • Soporta tipos de datos ¡y transacciones! • Muuuuuuuuuy rápida. ~100k op/s • Esponsorizada por VMWare
  • 4. ¿RDBMS suficiente? • 640K - of memory - ought to be enough for anybody - Bill Gates? • Who the hell knew how much address space we needed? - Vint Cerf
  • 5. ¿Hasta cuánto necesitaré escalar? • ¿Cuántos usuarios tienes? ¿Cuál es tu máximo de usuarios? Tu país, todos los smartphones del mundo, el mundo entero? • ¿Cuántas peticiones/s hace cada usuario de media? • Elasticidad: ¿tienes picos?
  • 6. ¿Quién necesita escalar mucho? Ejemplos: • Juegos. Especialmente multijugador. • Aplicaciones sociales. Ej: Facebook apps • Web services. Ej: pasarelas de pago. • ¿Tú? Depende, claro.
  • 7. Escalar es... • Escalar es poder atender más peticiones / s • Podemos escalar: • Con software más óptimo. ¡Ahorro de costes! Ejemplo: http://bit.ly/ibdi20 • Con hardware: • Verticalmente: mejor hardware en 1 máquina • Horizontalmente: más máquinas
  • 8. RDMBS to the limit
  • 9. SQL ¿rápido? 1. Parsear SQL 6. Acceder a los datos 2. Planificar consulta 7. Álgebra relacional 3. Optimizar consulta 8. Cerrar tablas 4. Abrir tablas 9. Devolver resultado
  • 10. SQL ¿rápido? • Muchos pasos • Difícil de optimizar • Perdemos control • Difícil de escalar
  • 13. Join, join, join, join SELECT link_id AS id, link_author AS author, link_blog AS blog, /* muc FROM links INNER JOIN users ON (user_id = link_author) LEFT JOIN (categories AS cat, categories AS meta) ON (cat.category_i LEFT JOIN votes ON (link_date > @enabled_votes AND vote_type='links' LEFT JOIN favorites ON (@user_id > 0 AND favorite_user_id =  @user_i LEFT JOIN link_clicks AS clicks ON (clicks.id = links.link_id) INNER JOIN (SELECT link_id FROM links $from WHERE $where $order_by L Fuente: http://bit.ly/fLf0MK
  • 14. Menéame.net Creo que sería muy complicado encontrar una consulta más eficiente que la anterior para la base de datos del Menéame. Pero no ha sido una idea que se me ocurrió de un día para otro, ni siquiera en semanas. Fue la evolución y el resultado de 5 años de experiencia directa, a veces dolorosa, y de aprender muchas cosas en el proceso. - Ricardo Galli Fuente: http://bit.ly/fLf0MK
  • 16. Clave => valor • DNI => persona • Matrícula => coche • PK => fila • Puntero => dato
  • 17. Get / Set redis> set foo bar OK redis> get foo "bar"
  • 18. Incr redis> incr usuarios (integer) 1 redis> get usuarios "1"
  • 19. Ventajas • Fácil de escalar, como veremos. • Rendimiento predecible. Sólo operaciones eficientes: optimizado por defecto • Operaciones atómicas
  • 20. ¿Cómo escalar? • Escalar lecturas: replicación • Escalar escrituras: particionamiento
  • 21. Particionamiento • Los datos están en varios nodos • A partir de la clave sabemos el nodo donde está el dato. • Particionamiento manual. Ej: claves con fechas • Ejemplo particionamiento “automático”: • nodo
=
hash(clave)
%
nodos
  • 22. Particionamiento • nodo
=
hash(clave)
%
nodos • Problema: resharding. Al añadir o quitar nodos. ¡Hay que mover casi todos los datos! • Solución: consistent hashing => método para que los datos a mover sean los menos posibles.
  • 23. Para no hacerlo nosotros... • redis-cluster • En desarrollo.Versión experimental en Marzo • RC prevista para Junio • http://bit.ly/c4XyyZ • redis-sharding • Sustituto temporal hasta que redis-cluster esté listo • https://github.com/kni/redis-sharding
  • 25. ¿get/set/incr suficiente? • Objetos: • claves “usuario:1”, “usuario:2”,... • valores: serialización, json, xml,... • ¿Consultas? • Índices manuales: listas, sets que guardan ids • También serializados
  • 26. Pero Redis nos lo hace más fácil • Soporta datos estructurados: • Hashes • Listas • Sets y sets ordenados
  • 27. Hashes redis> hset usuario:1 nombre Antonio (integer) 1 redis> hset usuario:1 apellido Gonzalo (integer) 1 redis> hgetall usuario:1 1. "nombre" 2. "Antonio" 3. "apellido" 4. "Gonzalo"
  • 28. Hashes redis> hincrby usuario:1 followers (integer) 1 •Nos ahorramos leer-calcular-modificar •Siguen siendo operaciones atómicas
  • 29. Listas redis> lpush mensajes mundo (integer) 1 redis> lpush mensajes hola (integer) 2 redis> lrange mensajes 0 -1 1. "hola" 2. "mundo"
  • 30. Sets y sets ordenados redis> zincrby superheroes 1 batman "1" redis> zincrby superheroes 10 kickass "10" redis> zincrby superheroes 3 spiderman "3" redis> zrevrange superheroes 0 -1 withscores 1. "kickass" 2. "10" 3. "spiderman" 4. "3" 5. "batman" 6. "1"
  • 32. Modelado de datos • Objetos → hashes • Consultas → Listas, sets y sets ordenados • Guardar sólo el id • Son índices manuales
  • 33. APIs bajo nivel • Muchas en muchos lenguajes. • En Java por ejemplo: Jedis • Spring Data
  • 34. APIs de alto nivel • GORM Redis • ¿Hacemos la nuestra?
  • 35. Do it yourself public static IntegerValue users = new IntegerValue("users"); public static ObjectValue<User> user = new ObjectValue<User>(User.class, "user"); Integer n = users.incr(); User u = new User("Pepe"); user.withKey(n.toString()).set(u);
  • 36. Do it yourself • Clases que abstraen los valores soportados en Redis: • IntegerValue • ObjectValue
con generics • ListValue • SetValue • SortedSetValue.
  • 37. Do it yourself • withKey(String...params) • Construye una clave con un prefijo y los params separados por “:”. • Devuelve un objeto con métodos apropiados para el tipo de dato
  • 39. Transacciones • MULTI. Inicia transación. • EXEC. Ejecuta transacción. • DISCARD. Cancela transación. • WATCH / UNWATCH. Bloquea / desbloquea valores de ser modificados durante la transacción
  • 41. PUB/SUB redis> SUBSCRIBE canal1 Reading messages... (press Ctrl-c to quit) 1. "subscribe" 2. "canal1" 3. (integer) 1 redis> PUBLISH canal1 Hola (integer) 1 DEMO 1. "message" 2. "canal1" 3. "Hola"
  • 43. Todo en memoria • Comportamiento por defecto • La BD debe caber en RAM • Persistencia: • Snapshotting. Con fork • Append-only file. Log binario
  • 44. Virtual Memory (VM) • Guarda las claves en memoria • Los valores se guardan en disco a partir de cierto máximo de memoria usado. • Desaconsejado
  • 45. Diskstore • Permite guardar claves y valores en disco • Permite tener replicados en memoria los datos más usados • A partir de la versión 2.2
  • 47. Cuándo usar Redis • Como caché. Un memcache con datos estructurados y persistente. También soporta expiración. • Como base de datos auxiliar cuando se necesite mucha velocidad. Que sea persistente tiene • una ventaja importante: si Como base de datos principal. se cae la caché, al volver a arrancarla no está vacía. Así que no habrá un aluvión de peticiones a la fuente de datos principal.
  • 48. ¿Preguntas? Thanks for attending! @gimenete http://redis.io

Notas do Editor

  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