Redis–symfony–barcelona–31 05-2012
Upcoming SlideShare
Loading in...5
×
 

Redis–symfony–barcelona–31 05-2012

on

  • 1,454 views

 

Statistics

Views

Total Views
1,454
Views on SlideShare
1,334
Embed Views
120

Actions

Likes
2
Downloads
15
Comments
0

3 Embeds 120

http://www.symfony-barcelona.es 78
http://symfony-barcelona.es 37
http://www.sfexception.com 5

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Redis–symfony–barcelona–31 05-2012 Redis–symfony–barcelona–31 05-2012 Presentation Transcript

  • Acelerando aplicaciones Symfony 2 con Ronny López @ronnyltThursday, May 31, 12
  • ¿Quién soy? Ronny López @ronnylt Desarrollador @pricebets Usando Redis+Symfony2 desde abril 2011Thursday, May 31, 12
  • Sumario 1. Introducción a Redis advanced key-value store 2. Principales características y tipos de datos 3. Casos de uso generales 4. Integración con Symfony2 ◦ Session storage ◦ Monolog logging handlers ◦ SwiftMailer spooling ◦ Profiler storage ◦ Doctrine caching ◦ Data Collector for Symfony2 Profiler ◦ Dynamic routing 5. Ejemplos y preguntasThursday, May 31, 12
  • ¿Por qué Redis? Descubrí Redis cuando una consulta como esta hacia que una página demorara +15 segundos en cargar: SELECT value FROM odds INNER JOIN outcomes ON ... INNER JOIN bets ON ... INNER JOIN markets ON ... WHERE ... ORDER BY ...Thursday, May 31, 12
  • Problemas • Hay tareas que no necesitan tanta complejidad • El modelo relacional actual es difícil de escalar horizontalmente • No se pueden modelar problemas comunes lo suficientemente bienThursday, May 31, 12
  • ¿Qué es Redis? • Remote dictionary server • Motor de almacenamiento clave-valor avanzado, rápido y persistente • Servidor de estructuras de datos • NoSQL (Not-only SQL) • Open source (patrocinado por VMWare)Thursday, May 31, 12
  • Características principales • Alto rendimiento en escritura y lectura • Soporte de operaciones atómicas • Soporte de transacciones • Persistencia !Thursday, May 31, 12
  • Características Simplicidad • Fácil instalación • Curva de aprendizaje relativamente baja • Lenguage de comandos fácil de utilizar y aprenderThursday, May 31, 12
  • Características Previsibilidad • La memoria es rápida, y permite a Redis tener un redimiento muy fiable • Operaciones sobre datasets de 10 mil claves tendrán el mismo rendimiento que sobre datasets de 50 millones de claves • La complejidad algorítmica de todos los comandos está documentadaThursday, May 31, 12
  • Características Confiabilidad • Todos los datos residen en memoria, y son persistidos a disco eventualmente (snapshots, append-only log) • Replication system (master-slave) , pueden configurarse múltiples esclavos. Un esclavo puede ser el master de otro esclavoThursday, May 31, 12
  • Características Persistencia • RDB, Point-in-time snapshots en intervalos configurados • AOF (append-only file) cada operación de escritura • Es posible combinar RDB y AOF en la misma instancia • Se puede deshabilitar la persistencia del todoThursday, May 31, 12
  • Características Versatilidad • Adaptable a varios tipos de aplicaciones • Modelado de los datos a partir de estructuras de datos como listas, conjuntos, conjuntos ordenados y hashesThursday, May 31, 12
  • Tipos de datos • Redis NO es simplemente un motor de almacenamiento clave-valor • Es un servidor de estructuras de datos que incluye varios tipos de datos predefinidos (strings, lists, sets, sorted sets, hashes)Thursday, May 31, 12
  • Tipos de datos Strings • Es el tipo de dato más simple • Si solamente usa este tipo de dato es similar a usar un servidor memcached pero con persistenciaThursday, May 31, 12
  • Operaciones Strings • Comandos SET/GET para escribir/leer • Los valores pueden ser cualquier string no mayor que 1 GB • Si necesita almacenar algo más grande, Redis is NOT for you ;)Thursday, May 31, 12
  • Tipos de datos Integers • Ideal para contadores atómicos INCR count > 1 INCR count > 2 INCRBY count 5 > 7Thursday, May 31, 12
  • Tipos de datos Lists • Secuencia de elementos ordenados • Uno de los tipos de datos más usados • Encaja perfectamente como estructura de datos ideal para resolver varios problemasThursday, May 31, 12
  • Tipos de datos Lists • Listas doblemente enlazadas garantizan la inserción en cualquier extremo en un tiempo constante O(1) • Con estas caterísticas puede usarse para modelar una “cola”Thursday, May 31, 12
  • Operaciones Lists • LPUSH agrega un elemento en el extremo izquierdo de la lista • RPUSH en el extremo derecho • LRANGE extrae elementos de la lista en cierto rangoThursday, May 31, 12
  • Operaciones Lists • LPUSH, RPUSH, LPOP, RPOP, ... • LINDEX, LINSERT, LLEN, ... • LTRIM, LREM, ... • http://redis.io/commands#listThursday, May 31, 12
  • Variantes “blocking” • BLPOP, BRPOP, BRPOPLPUSH • Bloquean la conexión (del cliente) cuando no hay elementos en la lista • Ideal para implementar colas de trabajos/ mensajesThursday, May 31, 12
  • Usos de las listas • Utilice listas cada vez que requiera acceder a los datos en el mismo orden en que se agregan • Ideal para casos en los que se requiere un ORDER BY de SQL • Escalable a millones de elementos manteniendo el mismo rendimientoThursday, May 31, 12
  • Ejemplos de uso de las listas • Mantener un listado cronológico de los comentarios publicados en un blog • Es posible paginar usando LRANGE de forma trivial $redis-cli RPOP post:123:comments c1 $redis-cli RPOP post:123:comments cn $redis-cli LRANGE post:123:comments 50 60Thursday, May 31, 12
  • Tipos de datos Sets • Colección NO–ordenada de datos (conjuntos) • Permite operaciones típicas sobre conjuntos como unión, intersección, diferencia, etc... • Estas operaciones son difíciles de implementar en un modelo relacionalThursday, May 31, 12
  • Operaciones Sets • SADD, SREM, SCARD, SMEMBERS, SISMEMBER, ... • SUNION, SDIFF, SINTER, ... • SPOP, SRAND, .... O(1) • http://redis.io/commands#setThursday, May 31, 12
  • Tipos de datos Sorted Sets • Un conjunto ordenado es un conjunto donde a cada elemento se le asocia una puntuación (score) • Este valor (score) determina el orden de los elementos dentro del conjuntoThursday, May 31, 12
  • Operaciones Sorted Sets • ZADD, ZREM, ZCARD, ZCOUNT, ZINCR, ... • ZSCORE, ZINCRBY, ZRANK, ... • ZCOUNT, .... • http://redis.io/commands#sorted_setThursday, May 31, 12
  • Tipos de datos Hashes • Permiten que objetos compuestos se almacenen en una clave específica • Tipo de dato ideal para almacenar objetos complejos en Redis, usando los atributos del objeto como claves del hashThursday, May 31, 12
  • Operaciones Hashes • HSET, HGET, HDEL, HEXIST, ... • HKEYS, HGETALL, HVALS, ... • HMGET, HMSET, ... • http://redis.io/commands#hashThursday, May 31, 12
  • Casos de uso Data cachingThursday, May 31, 12
  • Data caching • Redis como motor primario de cache compartida • Compartir datos cacheados entre múltiples aplicaciones • Como un memcached pero persistenteThursday, May 31, 12
  • Casos de uso ContadoresThursday, May 31, 12
  • Contadores • Gran cantidad de escrituras/lecturas • Datos valiosos, pero NO críticos • No encajan en el modelo relacional • Insertar una fila en MySQL o actualizar un contador en cada petición será sin dudas difícil de escalarThursday, May 31, 12
  • Contadores $ INCR active:sports:spain > 0 $ INCR active:sports:spain > 2 $ INCR active:sports:italy > ...Thursday, May 31, 12
  • Casos de uso Presencia ¿Quién está online?Thursday, May 31, 12
  • Presencia • Mantener en un conjunto los usuarios que se han detectado online en cada minuto $ redis-cli SADD online:15:01 123 $ redis-cli SADD online:15:01 456 $ redis-cli SADD online:15:02 123Thursday, May 31, 12
  • Presencia • El conjunto de usuarios online se puede obtener de la UNION de los conjuntos relativos a los últimos ¿5? minutos. A las 15:05 $ redis-cli SUNION online:15:01 online:15:02 online:15:03 online: 15:04 online:15:05 1) 123 2) 345Thursday, May 31, 12
  • Presencia • El conjunto de “amigos” online de cierto usuario es otra operación sobre conjuntos redis-cli SINTER online:15:01 online:15:02 online:15:03 online:15:04 online:15:05 user:123:friendsThursday, May 31, 12
  • Casos de uso Dymanic trackingThursday, May 31, 12
  • Dymamic Tracking • Queremos mantener un listado de las últimas 100 páginas visitadas en una web • ¿Qué están leyendo los usuarios ahora? • Mantenemos una lista y la limitamos a que tenga solo 100 elementos • Comparado a MongoDB capped collectionsThursday, May 31, 12
  • Dynamic Tracking LPUSH mylist somedata LTRIM mylist 0 99Thursday, May 31, 12
  • Casos de uso Tabla de posiciones Real time data sortingThursday, May 31, 12
  • Tabla de posiciones • Se necesita listar elementos ordenados por una puntuación • Las puntuaciones se actualizan en tiempo real • Consultas lentas por naturaleza SELECT * FROM ... WHERE ... ORDER BY ... LIMIT 10Thursday, May 31, 12
  • Tabla de posiciones • Mantener un conjunto ordenado (sorted set) con los elementos y su score $ redis-cli ZADD popular:sports 10 football $ redis-cli ZADD popular:sports 6 basketball $ redis-cli ZADD popular:sports 12 football $ redis-cli ZREVRANGE popular:sports 0 9Thursday, May 31, 12
  • Tabla de posiciones • Mantener un conjunto ordenado (sorted set) con los elementos y su score $ redis-cli ZADD popular:sports 10 football $ redis-cli ZADD popular:sports 6 basketball $ redis-cli ZADD popular:sports 12 football $ redis-cli ZREVRANGE popular:sports 0 9Thursday, May 31, 12
  • Casos de uso LoggingThursday, May 31, 12
  • Loggin • Redis como motor de almacenamiento de logs • Escribimos logs en orden en una lista, y la limitamos a que tenga uan cierta cantidad de elementosThursday, May 31, 12
  • Casos de uso URL Routing Data dictionaryThursday, May 31, 12
  • URL Routing • Convertir alias de URL a paths internos de la aplicación Ejemplo: http://www.apuestas.com/futbol => /sport/1 http://www.apuestas.com/futbol/espana/Thursday, May 31, 12
  • URL Routing • Convertir paths internos a friendly URLs Ejemplo: /sport/1 => http://www.apuestas.com/futbol /competition/3120 http://www.apuestas.com/futbol/espana/ copa-del-reyThursday, May 31, 12
  • URL Routing • Mantener un hash con el routing y otro con los alias redis-cli HSET routing /futbol /sport/1 redis-cli HSET alias /sport/1 /futbolThursday, May 31, 12
  • URL Generation Dictionary alias:example.com Path (internal) URL sport/1 /football article/1234 /news/football/very-nice-friendly-url user/345 /users/spain/el-faryThursday, May 31, 12
  • URL Matching Dictionary routes:example.com URL Path (internal) /football sport/1 /news/football/very-nice-friendly-url article/1234 /users/spain/el-fary user/345Thursday, May 31, 12
  • Integración con Symfony2Thursday, May 31, 12
  • Integración con Symfony2 • Construye tu propia integración • Usa algún bundle de 3ras partes • https://github.com/lessthan/LtRedisBundle • https://github.com/snc/SncRedisBundleThursday, May 31, 12
  • Clientes para PHP • Predis https://github.com/nrk/predis • PhpRedis https://github.com/nicolasff/phpredisThursday, May 31, 12
  • Predis https://github.com/nrk/predis • Escrito en PHP • Diferentes server profiles (versions) https://github.com/nrk/predis#main-featuresThursday, May 31, 12
  • PhpRedis https://github.com/nicolasff/phpredis • PHP Extension • Ligeramente más rápido • No sporta todas las versionesThursday, May 31, 12
  • Conexiones • Configuración de las conexiones a través de los archivos de configuración de la aplicaciónThursday, May 31, 12
  • Session storage • Redis como almacenamiento primario de sessiones de Symfony2 • Persistente • Rápido • Replicable • EscalableThursday, May 31, 12
  • Session storage RedisSessionHandler implementationThursday, May 31, 12
  • Session storage Configurando el handler de sessionThursday, May 31, 12
  • Session storage redis 127.0.0.1:6379> keys * 1) "sf2:session:pc5gsvnkap6q1ishmvf7lonba2" 2) "sf2:session:cv1dnt9aradi7c1ehbo12gp410" redis 127.0.0.1:6379> get sf2:session:pc5gsvnkap6q1ishmvf7lonba2 "_sf2_attributes|a:2:{s:4:"test";s:15:"testing session";s: 5:"test1";s:15:"testing session";}_sf2_flashes|a:2:{s: 7:"display";a:0:{}s:3:"new";a:0:{}}_sf2_meta|a:3:{s:1:"u";i: 1338469484;s:1:"c";i:1338469484;s:1:"l";s:1:"0";}" redis 127.0.0.1:6379>Thursday, May 31, 12
  • Monolog handler • Redis como almacenamiento para logs • Muy útil cuando se necesita conservar logs para inspeccionar • El filesystem es muy lento • Fácil de leer desde otras aplicaciones (monitoreo)Thursday, May 31, 12
  • Monolog handler • Se implementa un servicio que actúe como un custom Monolog Handler y utilice una lista de redis para almacenar los logs • ConfiguraciónThursday, May 31, 12
  • SwiftMailer spooling • Unsando una lista de Redis para hacer el mail spooling • La aplicación no ejecuta el envio de los correos durante ningún request • Los correos salientes son puestos en una cola • Otro proceso (en otro nodo, por ejemplo) se encarga de hacer el envio de los correosThursday, May 31, 12
  • Profiler storage • Agregado al HttpKernel Component en la 2.1 https://github.com/symfony/symfony/blob/ master/src/Symfony/Component/HttpKernel/ Profiler/RedisProfilerStorage.php • Usar como alternativa al SquileteProfilerStorage o al FileProfilerStorageThursday, May 31, 12
  • Doctrine Caching • Usado como almacenamiento primario para la cache de metadatos, resultados, y query de Doctrine • Alternativa al APC cache que se usa generalmenteThursday, May 31, 12
  • Data Collector • LtRedisBundle implementa un DataCollector de los comandos enviados a Redis a través de su clienteThursday, May 31, 12
  • Data CollectorThursday, May 31, 12
  • Dynamic Routing • Necesitamos convertir URLs amigables a rutas internas de Symfony2 • No queremos tener que hacer una consulta a una base de datos para generar cada URL amigables de una página (Ej. Doctrine Route)Thursday, May 31, 12
  • Dynamic RoutingThursday, May 31, 12
  • Muchas gracias...Thursday, May 31, 12