Acelerando                       aplicaciones Symfony 2                                 con                               ...
¿Quién soy?                Ronny López                @ronnylt                Desarrollador @pricebets                Usan...
Sumario              1. Introducción a Redis advanced key-value store              2. Principales características y tipos ...
¿Por qué Redis?                Descubrí Redis cuando una consulta como esta                hacia que una página demorara +...
Problemas                       • Hay tareas que no necesitan tanta                         complejidad                   ...
¿Qué es Redis?                       • Remote dictionary server                       • Motor de almacenamiento clave-valo...
Características                               principales                       • Alto rendimiento en escritura y lectura ...
Características                               Simplicidad                       • Fácil instalación                       ...
Características                                Previsibilidad                       • La memoria es rápida, y permite a Re...
Características                               Confiabilidad                       • Todos los datos residen en memoria, y s...
Características                               Persistencia                       • RDB, Point-in-time snapshots en interva...
Características                               Versatilidad                       • Adaptable a varios tipos de aplicacione...
Tipos de datos                       • Redis NO es simplemente un motor de                         almacenamiento clave-va...
Tipos de datos                                  Strings                       • Es el tipo de dato más simple             ...
Operaciones                                  Strings                       • Comandos SET/GET para escribir/leer          ...
Tipos de datos                                 Integers                       • Ideal para contadores atómicos            ...
Tipos de datos                                   Lists                       • Secuencia de elementos ordenados           ...
Tipos de datos                                   Lists                       • Listas doblemente enlazadas garantizan la  ...
Operaciones                                   Lists                       • LPUSH agrega un elemento en el extremo        ...
Operaciones                                   Lists                       • LPUSH, RPUSH, LPOP, RPOP, ...                 ...
Variantes “blocking”                       • BLPOP, BRPOP, BRPOPLPUSH                       • Bloquean la conexión (del cl...
Usos de las listas                       • Utilice listas cada vez que requiera acceder                         a los dato...
Ejemplos de uso de las                               listas      •       Mantener un listado cronológico de los comentario...
Tipos de datos                                   Sets                       • Colección NO–ordenada de datos (conjuntos)  ...
Operaciones                                   Sets                       • SADD, SREM, SCARD, SMEMBERS,                   ...
Tipos de datos                               Sorted Sets             • Un conjunto ordenado es un conjunto donde a        ...
Operaciones                                Sorted Sets                       • ZADD, ZREM, ZCARD, ZCOUNT,                 ...
Tipos de datos                                 Hashes                       • Permiten que objetos compuestos se          ...
Operaciones                                 Hashes                       • HSET, HGET, HDEL, HEXIST, ...                  ...
Casos de uso                          Data cachingThursday, May 31, 12
Data caching                       • Redis como motor primario de cache                         compartida                ...
Casos de uso                          ContadoresThursday, May 31, 12
Contadores                       • Gran cantidad de escrituras/lecturas                       • Datos valiosos, pero NO cr...
Contadores               $       INCR active:sports:spain               >       0               $       INCR active:sports...
Casos de uso                             Presencia                         ¿Quién está online?Thursday, May 31, 12
Presencia                       • Mantener en un conjunto los usuarios que se                         han detectado online...
Presencia                       • El conjunto de usuarios online se puede                         obtener de la UNION de l...
Presencia                       • El conjunto de “amigos” online de cierto                         usuario es otra operaci...
Casos de uso                         Dymanic trackingThursday, May 31, 12
Dymamic Tracking                       • Queremos mantener un listado de las                         últimas 100 páginas v...
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 puntuac...
Tabla de posiciones       • Mantener un conjunto ordenado (sorted set) con               los elementos y su score         ...
Tabla de posiciones       • Mantener un conjunto ordenado (sorted set) con               los elementos y su score         ...
Casos de uso                           LoggingThursday, May 31, 12
Loggin                       • Redis como motor de almacenamiento de                         logs                       • ...
Casos de uso                           URL Routing                          Data dictionaryThursday, May 31, 12
URL Routing                       • Convertir alias de URL a paths internos de                         la aplicación      ...
URL Routing                       • Convertir paths internos a friendly URLs                         Ejemplo:             ...
URL Routing                       • Mantener un hash con el routing y otro con                         los alias          ...
URL Generation                                       Dictionary          alias:example.com                  Path (internal...
URL Matching                                   Dictionary       routes:example.com                             URL        ...
Integración con                          Symfony2Thursday, May 31, 12
Integración con                                Symfony2                       • Construye tu propia integración           ...
Clientes para PHP                       • Predis                         https://github.com/nrk/predis                    ...
Predis                                https://github.com/nrk/predis                       • Escrito en PHP                ...
PhpRedis                            https://github.com/nicolasff/phpredis                       • PHP Extension           ...
Conexiones                       • Configuración de las conexiones a través de                         los archivos de confi...
Session storage                       • Redis como almacenamiento primario de                         sessiones de Symfony...
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:cv1dnt9ar...
Monolog handler                       • Redis como almacenamiento para logs                        • Muy útil cuando se ne...
Monolog handler          • Se implementa un servicio que actúe como un                  custom Monolog Handler y utilice u...
SwiftMailer spooling                       • Unsando una lista de Redis para hacer el mail                         spoolin...
Profiler storage                       • Agregado al HttpKernel Component en la 2.1                         https://github....
Doctrine Caching                       • Usado como almacenamiento primario para la                         cache de metad...
Data Collector                       • LtRedisBundle implementa un DataCollector                         de los comandos e...
Data CollectorThursday, May 31, 12
Dynamic Routing                • Necesitamos convertir URLs amigables a rutas                       internas de Symfony2  ...
Dynamic RoutingThursday, May 31, 12
Muchas gracias...Thursday, May 31, 12
Próxima SlideShare
Cargando en…5
×

Redis–symfony–barcelona–31 05-2012

1.811 visualizaciones

Publicado el

Publicado en: Tecnología
0 comentarios
3 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

Sin descargas
Visualizaciones
Visualizaciones totales
1.811
En SlideShare
0
De insertados
0
Número de insertados
123
Acciones
Compartido
0
Descargas
21
Comentarios
0
Recomendaciones
3
Insertados 0
No insertados

No hay notas en la diapositiva.

Redis–symfony–barcelona–31 05-2012

  1. 1. Acelerando aplicaciones Symfony 2 con Ronny López @ronnyltThursday, May 31, 12
  2. 2. ¿Quién soy? Ronny López @ronnylt Desarrollador @pricebets Usando Redis+Symfony2 desde abril 2011Thursday, May 31, 12
  3. 3. 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
  4. 4. ¿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
  5. 5. 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
  6. 6. ¿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
  7. 7. Características principales • Alto rendimiento en escritura y lectura • Soporte de operaciones atómicas • Soporte de transacciones • Persistencia !Thursday, May 31, 12
  8. 8. Características Simplicidad • Fácil instalación • Curva de aprendizaje relativamente baja • Lenguage de comandos fácil de utilizar y aprenderThursday, May 31, 12
  9. 9. 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
  10. 10. 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
  11. 11. 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
  12. 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
  13. 13. 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
  14. 14. 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
  15. 15. 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
  16. 16. Tipos de datos Integers • Ideal para contadores atómicos INCR count > 1 INCR count > 2 INCRBY count 5 > 7Thursday, May 31, 12
  17. 17. 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
  18. 18. 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
  19. 19. 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
  20. 20. Operaciones Lists • LPUSH, RPUSH, LPOP, RPOP, ... • LINDEX, LINSERT, LLEN, ... • LTRIM, LREM, ... • http://redis.io/commands#listThursday, May 31, 12
  21. 21. 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
  22. 22. 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
  23. 23. 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
  24. 24. 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
  25. 25. Operaciones Sets • SADD, SREM, SCARD, SMEMBERS, SISMEMBER, ... • SUNION, SDIFF, SINTER, ... • SPOP, SRAND, .... O(1) • http://redis.io/commands#setThursday, May 31, 12
  26. 26. 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
  27. 27. Operaciones Sorted Sets • ZADD, ZREM, ZCARD, ZCOUNT, ZINCR, ... • ZSCORE, ZINCRBY, ZRANK, ... • ZCOUNT, .... • http://redis.io/commands#sorted_setThursday, May 31, 12
  28. 28. 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
  29. 29. Operaciones Hashes • HSET, HGET, HDEL, HEXIST, ... • HKEYS, HGETALL, HVALS, ... • HMGET, HMSET, ... • http://redis.io/commands#hashThursday, May 31, 12
  30. 30. Casos de uso Data cachingThursday, May 31, 12
  31. 31. Data caching • Redis como motor primario de cache compartida • Compartir datos cacheados entre múltiples aplicaciones • Como un memcached pero persistenteThursday, May 31, 12
  32. 32. Casos de uso ContadoresThursday, May 31, 12
  33. 33. 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
  34. 34. Contadores $ INCR active:sports:spain > 0 $ INCR active:sports:spain > 2 $ INCR active:sports:italy > ...Thursday, May 31, 12
  35. 35. Casos de uso Presencia ¿Quién está online?Thursday, May 31, 12
  36. 36. 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
  37. 37. 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
  38. 38. 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
  39. 39. Casos de uso Dymanic trackingThursday, May 31, 12
  40. 40. 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
  41. 41. Dynamic Tracking LPUSH mylist somedata LTRIM mylist 0 99Thursday, May 31, 12
  42. 42. Casos de uso Tabla de posiciones Real time data sortingThursday, May 31, 12
  43. 43. 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
  44. 44. 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
  45. 45. 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
  46. 46. Casos de uso LoggingThursday, May 31, 12
  47. 47. 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
  48. 48. Casos de uso URL Routing Data dictionaryThursday, May 31, 12
  49. 49. 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
  50. 50. 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
  51. 51. 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
  52. 52. 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
  53. 53. 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
  54. 54. Integración con Symfony2Thursday, May 31, 12
  55. 55. 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
  56. 56. Clientes para PHP • Predis https://github.com/nrk/predis • PhpRedis https://github.com/nicolasff/phpredisThursday, May 31, 12
  57. 57. Predis https://github.com/nrk/predis • Escrito en PHP • Diferentes server profiles (versions) https://github.com/nrk/predis#main-featuresThursday, May 31, 12
  58. 58. PhpRedis https://github.com/nicolasff/phpredis • PHP Extension • Ligeramente más rápido • No sporta todas las versionesThursday, May 31, 12
  59. 59. Conexiones • Configuración de las conexiones a través de los archivos de configuración de la aplicaciónThursday, May 31, 12
  60. 60. Session storage • Redis como almacenamiento primario de sessiones de Symfony2 • Persistente • Rápido • Replicable • EscalableThursday, May 31, 12
  61. 61. Session storage RedisSessionHandler implementationThursday, May 31, 12
  62. 62. Session storage Configurando el handler de sessionThursday, May 31, 12
  63. 63. 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
  64. 64. 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
  65. 65. 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
  66. 66. 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
  67. 67. 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
  68. 68. 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
  69. 69. Data Collector • LtRedisBundle implementa un DataCollector de los comandos enviados a Redis a través de su clienteThursday, May 31, 12
  70. 70. Data CollectorThursday, May 31, 12
  71. 71. 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
  72. 72. Dynamic RoutingThursday, May 31, 12
  73. 73. Muchas gracias...Thursday, May 31, 12

×