... INNER JOIN bets ON ... INNER JOIN markets ON ... ... WHERE ... ORDER BY ... Ronny López @ronnylt Desarrollador @pricebets Descubrí Redis cuando una consulta como esta hacia que una página demorara +15 segundos en cargar:
cola de trabajos (resque) • guardian.co.uk: servidor de estructuras de datos persistente • disqus.com: sistema estádistico desarrollado sobre Redis • stackoverflow.com: capa de cache para toda su red • flickr.com: lista de trabajos • pricebets.es: almacenamiento primario (conjuntos, listas, hashes, etc...), routing, cache, sessions
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
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
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
de almacenamiento clave-valor • Es un servidor de estructuras de datos que incluye varios tipos de datos predefinidos (strings, lists, sets, sorted sets, hashes)
grandes (memoria, localización en el keyspace) • Tampoco es recomendable que las claves sean demasiado cortas por cuestiones de legibilidad Ejemplo: u:123:pw
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
cronológico de los comentarios publicados en un blog • Es posible paginar usando LRANGE de forma trivial $ redis-cli RPOP post:123:comments 456 $ redis-cli RPOP post:123:comments 789 $ redis-cli LRANGE post:123:comments 50 60
• Permite operaciones típicas sobre conjuntos como unión, intersección, diferencia, etc... • Estas operaciones son difíciles de implementar en un modelo relacional
HSET event:1 date 2012-01-17 $ redis-cli HSET event:1 where Barcelona $ redis-cli HGETALL event:1 1) name 2) betabeers 3) date 4) 2012-01-17 5) where 6) Barcelona
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
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
otro con los alias $ redis-cli HSET routing /futbol /sport/1 $ redis-cli HSET alias /sport/1 /futbol • Tiempo constante O(1) para cualquier número de rutas/alias
(Redis 2.6) • High resolution expires (Redis 2.6) • Mejoras en el rendimiento de la escritura/lectura de grandes objetos (Redis 2.6) • Redis Cluster (Redis 3.0)
second PING: 89766.61 requests per second MSET (10 keys): 48053.82 requests per second SET: 80064.05 requests per second GET: 87108.02 requests per second INCR: 82644.62 requests per second LPUSH: 82169.27 requests per second LPOP: 78802.20 requests per second SADD: 71890.73 requests per second SPOP: 93283.58 requests per second LPUSH (again, in order to bench LRANGE): 86880.97 requests per second LRANGE (first 100 elements): 64061.50 requests per second LRANGE (first 300 elements): 40064.10 requests per second LRANGE (first 450 elements): 30478.51 requests per second LRANGE (first 600 elements): 25873.22 requests per second Processor 2.2 GHz Intel Core i7 Memory 8 GB 1333 MHz DDR3