Este documento presenta Redis como una alternativa al almacenamiento de datos relacional para acelerar aplicaciones Symfony 2. Explica las principales características y tipos de datos de Redis, como cadenas, listas, conjuntos y hashes. Luego detalla varios casos de uso comunes de Redis como almacenamiento de sesiones, registro, encolamiento de correo y enrutamiento dinámico en Symfony 2. Finalmente, brinda ejemplos de cómo integrar Redis en aplicaciones Symfony 2.
Guia Basica para bachillerato de Circuitos Basicos
Redis–symfony–barcelona–31 05-2012
1. Acelerando
aplicaciones Symfony 2
con
Ronny López
@ronnylt
Thursday, May 31, 12
2. ¿Quién soy?
Ronny López
@ronnylt
Desarrollador @pricebets
Usando Redis+Symfony2 desde abril 2011
Thursday, May 31, 12
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 preguntas
Thursday, May 31, 12
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. 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 bien
Thursday, May 31, 12
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. Características
principales
• Alto rendimiento en escritura y lectura
• Soporte de operaciones atómicas
• Soporte de transacciones
• Persistencia !
Thursday, May 31, 12
8. Características
Simplicidad
• Fácil instalación
• Curva de aprendizaje relativamente baja
• Lenguage de comandos fácil de utilizar y
aprender
Thursday, May 31, 12
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á documentada
Thursday, May 31, 12
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 esclavo
Thursday, May 31, 12
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 todo
Thursday, May 31, 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 hashes
Thursday, May 31, 12
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. 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 persistencia
Thursday, May 31, 12
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. Tipos de datos
Integers
• Ideal para contadores atómicos
INCR count
> 1
INCR count
> 2
INCRBY count 5
> 7
Thursday, May 31, 12
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 problemas
Thursday, May 31, 12
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. 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 rango
Thursday, May 31, 12
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/
mensajes
Thursday, May 31, 12
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 rendimiento
Thursday, May 31, 12
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 60
Thursday, May 31, 12
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 relacional
Thursday, May 31, 12
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 conjunto
Thursday, May 31, 12
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 hash
Thursday, May 31, 12
31. Data caching
• Redis como motor primario de cache
compartida
• Compartir datos cacheados entre múltiples
aplicaciones
• Como un memcached pero persistente
Thursday, May 31, 12
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 escalar
Thursday, May 31, 12
35. Casos de uso
Presencia
¿Quién está online?
Thursday, May 31, 12
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 123
Thursday, May 31, 12
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) 345
Thursday, May 31, 12
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:friends
Thursday, May 31, 12
39. Casos de uso
Dymanic tracking
Thursday, May 31, 12
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 collections
Thursday, May 31, 12
42. Casos de uso
Tabla de posiciones
Real time data sorting
Thursday, May 31, 12
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 10
Thursday, May 31, 12
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 9
Thursday, May 31, 12
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 9
Thursday, May 31, 12
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 elementos
Thursday, May 31, 12
48. Casos de uso
URL Routing
Data dictionary
Thursday, May 31, 12
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
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 /futbol
Thursday, May 31, 12
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/SncRedisBundle
Thursday, May 31, 12
56. Clientes para PHP
• Predis
https://github.com/nrk/predis
• PhpRedis
https://github.com/nicolasff/phpredis
Thursday, May 31, 12
57. Predis
https://github.com/nrk/predis
• Escrito en PHP
• Diferentes server profiles (versions)
https://github.com/nrk/predis#main-features
Thursday, May 31, 12
58. PhpRedis
https://github.com/nicolasff/phpredis
• PHP Extension
• Ligeramente más rápido
• No sporta todas las versiones
Thursday, May 31, 12
59. Conexiones
• Configuración de las conexiones a través de
los archivos de configuración de la aplicación
Thursday, May 31, 12
60. Session storage
• Redis como almacenamiento primario de
sessiones de Symfony2
• Persistente
• Rápido
• Replicable
• Escalable
Thursday, May 31, 12
61. Session storage
RedisSessionHandler implementation
Thursday, May 31, 12
62. Session storage
Configurando el handler de session
Thursday, May 31, 12
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. 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ón
Thursday, May 31, 12
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 correos
Thursday, May 31, 12
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 FileProfilerStorage
Thursday, May 31, 12
68. Doctrine Caching
• Usado como almacenamiento primario para la
cache de metadatos, resultados, y query de
Doctrine
• Alternativa al APC cache que se usa
generalmente
Thursday, May 31, 12
69. Data Collector
• LtRedisBundle implementa un DataCollector
de los comandos enviados a Redis a través de
su cliente
Thursday, May 31, 12
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