Una introducción a Redis, un servidor de estructuras de datos en red que actua como una base de datos no-relacional con almacenamiento principal en memoria RAM y estrategias de almacenamiento persistente basadas en disco.
1. Servidor de estructuras de datos básicas (NoSQL)
Antonio Ognio
@gnrfan
Saturday, March 24, 12
2. • ReDIS = Remote Dictionary Server
• Diccionario ~= Array de PHP, Objeto Javascript, etc
• Servidor de sockets TCP/IP (Puerto 6379 - Prot. texto plano)
• Escrito en C (23+ Kloc)
• Fácil compilación e instalación (pocas dependencias)
• Programado para entornos UNIX (Linux, BSD, Mac OS X)
• Empaquetado para mayoría de distribuciones
Saturday, March 24, 12
3. • Creado en Sicilia (Italia) por Salvatore Sanfilippo
• Iniciado a principios del 2009
• Licencia BSD (Código abierto)
• Desarrollado inicialmente para LLOOGG
• Co-desarrollado por Pieter Noordhuis (Holanda)
• Sponsoring de VMware
Saturday, March 24, 12
4. Tipos de datos
• Cadenas de texto
• Listas
• Conjuntos
• Conjuntos ordenados
• Hashes (Diccionarios)
• Canales (Pub/Sub)
Saturday, March 24, 12
5. API
http://redis.io/commands
Saturday, March 24, 12
7. API
$ redis-cli zrange hackers 0 -1
1. Alan Turing
2. Claude Shannon
3. Alan Kay
4. Richard Stallman
5. Yukihiro Matsumoto
6. Linus Torvalds
$ redis-cli zrevrange hackers 0 -1
1. Linus Torvalds
2. Yukihiro Matsumoto
3. Richard Stallman
4. Alan Kay
5. Claude Shannon
6. Alan Turing
Saturday, March 24, 12
8. Persistencia
• El conjunto de datos debe entrar en la RAM
• Snapshots en disco cada cierto tiempo
• Ventana de tiempo configurable
• Compacto (en uso de disco)
• Append-only file (AOF)
• Registra cada cambio en tiempo real
• Usa más espacio de disco pero puede ser compactado
Saturday, March 24, 12
9. Librerías cliente
• Existentes para virtualmente cualquier
lenguaje popular de la actualidad
• En muchos casos más de una librería
disponible
• Algunas de ellas: http://redis.io/clients
• redis-py (Python) • hiredis (C)
• redis-rb (Ruby) • ObjCHiredis (Objective-C)
• Jedis (Java) • redis_node (Node.js)
Saturday, March 24, 12
10. Clustering
• Por el momento soporta
replicación master-slave
• Librerías cliente implementan
sharding
• Algoritmo de consistent
hashing
• Redis Cluster
• Rama de Redis en desarrollo
activo
• Se basa en el concepto de
“slots” o “virtual buckets”
Saturday, March 24, 12
11. Comunidad
• Early-adopters en las comunidades de Ruby y Python
principalmente
• Muy popular con las startups
• Meetup groups (San Francisco, Londres)
• Seguir a @antirez en Twitter y buscar el hashtag
#redis
• Canal IRC muy activo y amigable:
#redis en Freenode.net
Saturday, March 24, 12
12. Comparativa
• MySQL (o cualquier otra base SQL)
• El almacenamiento principal es en disco, la RAM se usa
como caché - Redis toma el camino opuesto
• El parsing de SQL es un cuello de botella
• Por eso les conviene usar Prepared Statements
• El modelo relacional y el lenguaje SQL es mucho más
flexible si no se conoce de antemano el uso que se le va
a dar a los datos
Saturday, March 24, 12
13. Comparativa
• Memcached
• Muy popular en sitios web grandes
• No soporta persistencia directamente
• Existe memcachedb como un proyecto aparte
• Solo permite almacenar cadenas o BLOBs
• Estrategia de expiración basada en tiempo (TTL)
• No soporta clustering directamente
• Las librerías deben implementar una estrategia como
round robin o consistent hashing.
Saturday, March 24, 12
14. Modelamiento
• ¿Cómo modelamos un blog?
• ID de post (un contador)
• Datos de cada post (un hash)
• Tags de cada post (un conjunto)
• Listado de posts ordenados por fecha (un sorted set)
• Posts por meses, posts por tags, etc (más sorted sets)
https://bitbucket.org/nosqldemos/redis-blog-demo
Saturday, March 24, 12
15. Código de ejemplo
• Lamer News (un clone de Reddit)
• Escrito por Salvatore, el autor de Redis
• Código bastante simple usando Sinatra (Ruby)
• Demuestra el uso de Redis como base de datos
principal
• Hay un port en Python en Github
http://lamernews.com/
Saturday, March 24, 12
16. Ideas de uso
• Contadores rápidos para sitios web
• Colas de trabajos (Ej. Resque de Github)
• Lista de últimos usuarios que han visitado un portal
• Caché de objetos más visitados (Ej. Noticias de la portada)
• Servidor de chat usando canales (pub/sub)
http://rediscookbook.com/
Saturday, March 24, 12
17. Estrategias de despliegue
• YouPorn, uno de los sitios con más tráfico de Internet depende
de Redis para indexar y servir su contenido
• Uso extensivo de Sorted Sets para cada tag o listado de videos
independiente
• Decenas de servidores Redis en replicación master-
• Redis resultó más rápido que las tarjetas de red que tenían,
tuvieron que cambiarlas
• Aún se guardan los datos en MySQL para regenerar conjuntos
http://mundogeek.net/archivos/2012/02/16/el-porno-prefiere-redis/
Saturday, March 24, 12
19. Conclusiones
• Servidor de estructuras de datos básicas en red
(listas, conjuntos, diccionarios, contadores)
• Aplicable virtualmente a cualquier sitio web ya
existente como parte de una estrategia de caché
o acelaración
• Exige un tipo de modelamiento orientado al
dominio del problema que ofrece un alto
rendimiento a la hora de hacer consultas pero no
es flexible como estrategia de almacenamiento a
largo plazo
Saturday, March 24, 12