Redis
Redis
Integrantes:
1
ndice
1. Problematizacin.3
2. Historia.4
3. Descripcin Sistmica de la DB NoSQL Redis.5
4. Descripcin de las Estructuras o Metadata11
5. Aplicacin Prctica.13
6. Bibliografa..19
2
Qu es redis?
1. Problematizacin
Redis resuelve de manera sencilla y eficiente problemas que no necesitan la
complejidad de las bases de datos relacionales, como lo es en la mayora de los casos de
usos el almacn y gestin de estructuras de datos temporales, por lo cual redis es
mayoritariamente usado para incorporar soluciones sofisticadas de cache de datos o
como backend de operaciones en lnea en escenarios de alta demanda. Redis no pierde
tiempo pensando en relaciones, restricciones ni tipos de datos, se enfoca en hacer
eficientemente su trabajo que es establecer y recuperar (set y get) datos sobre las
estructuras con las que cuenta.
Ahora bien, todo esto suena excelente, pero para que querra alguien usar esto en la
vida real?
Su compleja y mimada base de datos relacional que soporta toda la carga de sus
operaciones, recientemente se le incorporo mensajera instantnea (si sus
usuarios chatean entre s, con clientes y pblico en general) a la aplicacin que
hace uso de ella, se dio cuenta que esto que no es lo ms importante en su
modelo de negocios, le est colapsando su servicio. Pues transfiera la gestin de
chat a Redis y luego totaliza la mensajera del da y la manda como histrico a
su base de datos principal.
3
Suponga que tiene un portal web con mucha trayectoria y miles de millones de
contenidos, as como millones de visitas diarias, cuya pgina de inicio abarca el
90% de las visitas de su web, su pgina de inicio solo son 30 contenidos y otros
elementos, pues en vez de recorrer su base de datos tradicional con los millones
de contenidos en busca de los 30, simplemente los pone a disposicin de la
manera ms rpida posible.
Para anlisis y procesamiento en tiempo real. Su pas necesita implementar un
sistema integral de atencin a sus ciudadanos, ideal sera que la carga de
consultas de los tickets vigentes resida en una solucin como redis, y que el
anlisis y monitoreo del comportamiento de los usuarios en lnea en el sistema
tambin.
Gestin de sesiones de usuarios y soluciones de cache, entre muchas otras.
2. Un poco de historia
El desarrollo de Redis fue iniciado por Salvatore Sanfilippo a principios del 2009, para
acelerar los tiempos de respuesta de un producto llamado LLOGG. Pronto fue ganando
popularidad, hasta que en Marzo del 2012 la empresa VMWare contrat a Salvatore
para trabajar a tiempo completo en Redis. Poco despus VMWare contrat tambin a
uno de los principales desarrolladores de Redis, Pieter Noordhuis. Desde entonces Redis
ha evolucionado muy rpidamente, incluyendo funcionalidades que le hacen tan til.
Adems es una base de datos en memoria pero persistente en disco, a diferencia de otros
sistemas como memcached que el reinicio de la mquina supone la prdida de toda la
informacin.
Versiones:
4.0.0.rc1- July , 2017 (80 KB)
3.3.3 - January 23, 2017 (90 KB)
3.3.2 - November 17, 2016 (90 KB)
3.3.1 - July 18, 2016 (90 KB)
3.3.0 - April 18, 2016 (90 KB)
3.2.2 - November 16, 2015 (70 KB)
3.2.1 - February 11, 2015 (70 KB)
3.2.0 - December 11, 2014 (70 KB)
3.1.0 - June 06, 2014 (70 KB)
3.0.7 - January 21, 2014 (70 KB)
3.0.6 - November 07, 2013 (60 KB)
3.0.5 - October 02, 2013 (60 KB)
4
3.0.4 - April 23, 2013 (60 KB)
3.0.3 - March 01, 2013 (60 KB)
3.0.2 - October 05, 2012 (60 KB)
3.0.1 - June 02, 2012 (60 KB)
3.0.0 - May 23, 2012 (60 KB)
3.0.0.rc2 - May 15, 2012 (50 KB)
3.0.0.rc1 - March 10, 2012 (50 KB)
2.2.2 - August 04, 2011 (40 KB)
2.2.1 - June 08, 2011 (40 KB)
2.2.0 - March 29, 2011 (40 KB)
2.1.1 - November 05, 2010 (20 KB)
2.1.0 - November 05, 2010 (20 KB)
2.1.0.beta - November 04, 2010 (20 KB)
2.0.13 - November 01, 2010 (20 KB)
2.0.12 - October 27, 2010 (20 KB)
2.0.11 - October 14, 2010 (10 KB)
2.0.10 - September 20, 2010 (10 KB)
2.0.9 - September 17, 2010 (20 KB)
2.0.8 - September 14, 2010 (20 KB)
2.0.7 - September 13, 2010 (10 KB)
2.0.6 - September 07, 2010 (10 KB)
2.0.5 - July 30, 2010 (10 KB)
2.0.4 - July 22, 2010 (20 KB)
2.0.3 - June 22, 2010 (10 KB)
2.0.2 - June 21, 2010 (10 KB)
2.0.1 - May 29, 2010 (10 KB)
2.0.0 - May 14, 2010 (10 KB)
2.0.0.rc3 - May 06, 2010 (20 KB)
2.0.0.rc2 - April 28, 2010 (10 KB)
2.0.0.rc1 - April 26, 2010 (10 KB)
1.0.7 - April 28, 2010 (10 KB)
1.0.6 - April 26, 2010 (10 KB)
1.0.5 - April 21, 2010 (10 KB)
1.0.4 - April 05, 2010 (10 KB)
1.0.3 - April 03, 2010 (10 KB)
1.0.2 - April 02, 2010 (10 KB)
1.0.1 - April 02, 2010 (10 KB)
1.0.0 - April 02, 2010 (10 KB)
0.2.0 - March 23, 2010 (20 KB)
0.1.2 - January 27, 2010 (20 KB)
0.1.1 - December 03, 2009 (20 KB)
0.1 - October 28, 2009 (10 KB)
0.0.1 - June 10, 2009 (3 KB)
ltima version
L ltima versin fue lanzada en Julio del 2017, contiene varias mejoras
importantes:
Soporte Raspberry Pi como plataforma principal.
Creacin de claves Redis Cluster mucho ms rpida.
5
3. Descripcin Sistmica de la DB NoSQL
Estudiada
Modelo de datos
El modelo de datos de Redis se basa en la estructura de datos del tipo diccionario o tabla
de hashes que relaciona una llave a un contenido almacenado en un ndice. La principal
diferencia entre Redis y otros sistemas similares es que los valores no estn limitados a
ser de tipo string, otros tipos de datos estn soportados:
Listas
Sets
Hashes
El tipo de valor determina las operaciones (los comandos) que son disponibles. Redis
soporta operaciones atmicas de alto nivel del lado del servidor, como inserciones,
unions, y diferencias entre sets y listas ordenadas. Desde la versin 2.6, liberada a
finales de octubre de 2012, se introduce una funcionalidad clave, la posibilidad de
ejecutar Scripts en el servidor Redis, escritos en lenguaje Lua.
Funcionalidad
6
Estructuras de datos en memoria
Redis permite a los usuarios almacenar claves que se corresponden con diversos tipos
de datos. El tipo de datos fundamental es una cadena, que puede componerse de texto o
datos binarios y tener un tamao de hasta 512 MB. Redis tambin admite listas de
cadenas en el orden en el que se han agregado, conjuntos de cadenas sin ordenar,
conjuntos clasificados ordenados por puntuacin, hashes que almacenan una lista de
campos y valores, e HyperLogLogs que cuentan los elementos nicos de un conjunto de
datos. Con Redis, se puede almacenar en la memoria prcticamente cualquier tipo de
datos.
Replicacin y persistencia
7
Para proporcionar durabilidad, Redis admite las snapshots de un momento determinado
(copiando el conjunto de datos de Redis en un disco) y la creacin de un archivo de solo
anexos (AOF) para almacenar cada uno de los cambios a los datos en un disco a medida
que se producen. Ambos mtodos facilitan la recuperacin rpida de los datos de Redis
si se produce un fallo.
Desventajas
No es eficiente (y probablemente no es eficaz) al trabajar con demasiadas relaciones
entre los datos.
Ms lento que gestores SQL en la lectura de datos (para bases de datos grandes).
Podemos usar Redis como cach de pginas HTML, o fragmentos de estas, lo que
acelerar el acceso a las mismas, a la vez que evitamos llegar a los servidores web o de
aplicaciones, reduciendo la carga en estos y en los sistemas de bases de datos a los que
los mismos accedan. Adems de un incremento en la velocidad, esto puede suponer un
importante ahorro econmico en trminos de hardware y licencias de software.
Podemos usar Redis como un almacn de sesiones de muy rpido acceso, en el que
mantengamos el identificador de sesin junto con toda la informacin asociada a la
misma. Adems de reducir los tiempos de latencia de nuestra solucin, igual que en el
caso anterior evitaremos una vez ms accesos a otras bases de datos. Adems Redis
permite asociar un tiempo de expiracin a cada clave, con lo que las sesiones finalizarn
automticamente sin tener que gestionarlo en el cdigo de la aplicacin.
8
Almacenamiento de carritos de la compra
Limitacin de la velocidad
Redis puede medir y, cuando sea necesario, limitar la velocidad de los eventos. Al
utilizar un contador de Redis asociado con la clave de la API de un cliente, puede contar
la cantidad de solicitudes de acceso dentro de un periodo de tiempo y tomar accin si se
excede un lmite. Los limitadores de velocidad se utilizan con frecuencia para limitar la
cantidad de publicaciones de un foro, el uso de recursos y el impacto de los spammers.
Es muy habitual mostrar listas en las que aparecen las ltimas actualizaciones de algn
elemento hechas por los usuarios. Por ejemplo, los ltimos comentarios sobre un post,
las ltimas imgenes subidas, los artculos de un catlogo vistos recientemente, etc. Este
tipo de operaciones suele ser muy costoso para las bases de datos relacionales, sobre
todo cuando el volumen de informacin se va haciendo mayor, pero Redis es capaz de
resolver esta operacin con independencia del volumen.
Colas
Chat y mensajera
9
Base de datos principal
Para determinados casos, Redis se puede usar como almacenamiento principal gracias a
la potencia de modelado que permiten sus avanzados tipos de datos. Destaca su uso en
casos como los microservicios, en los que podemos aprovechar la velocidad de Redis
para construir soluciones especializadas, simples de implementar y mantener, que a la
vez ofrecen un alto rendimiento.
10
4. Descripcin de las Estructuras o Metadata
Aunque puede parecer una lista muy corta, slo con estos cinco tipos de estructuras se
pueden modelar infinitud de procesos y aplicaciones complejas, hasta el punto que
11
muchos de los usuarios de Redis han terminado por sustituir completamente las bases de
datos relacionales.
Strings:
La informacin almacenada es opaca para la BBDD, lo que significa que sta no tiene
nocin de la estructura de la informacin, ni tiene capacidad para operar sobre ella. Una
excepcin notable a esto ltimo es que Redis es capaz de interpretar valores numricos
y puede llevar a cabo operaciones de incremento/decremento de manera atmica sobre
los mismos. Esto nos permite utilizarlo para generar identificadores nicos desde
mltiples clientes, o en general para casos de uso en los que se requieran contadores,
como contabilizar votos de usuarios, visualizaciones de productos, cantidades
compradas de un artculo, visitas a una pgina, etc.
En resumen, podemos usar los strings para almacenar y recuperar informacin como
sesiones de usuario, carritos de la compra, contadores, cach de HTML, cach de
consultas a BBDD o llamadas a un API, y en general objetos serializados en XML,
JSON o cualquier otro formato.
Listas:
Las listas permiten casos de uso del tipo mustrame las ltimas n actualizaciones de
algo. Las listas en Redis tambin se usan para implementar sistemas del tipo
productor-consumidor, en los que un proceso aade tareas a la lista, y uno o ms
procesos sacan dichas tareas de la lista para llevarlas a cabo. Disponemos adems de la
capacidad de limitar el nmero de elementos de una lista.
Sets:
Los sets son colecciones de strings, sin ningn orden particular, en los que se garantiza
que los elementos del mismo son nicos y no pueden estar duplicados. Podemos aadir
el mismo elemento 10 veces, pero Redis garantiza que slo existir una vez, lo que nos
permite poder aadir elementos sin tener que preocuparnos previamente de si ya existen
o no.
12
Sorted Sets:
Son conjuntos agrupados con las propiedades de estos sets, que adems permiten la
ordenacin de los elementos en base a un valor (score) numrico asociado a cada uno de
ellos. Es importante aclarar que la unicidad de los elementos se hace slo teniendo en
cuenta los datos almacenados, y no el valor del score. Si se aade el mismo elemento
varias veces con distintos valores del score, el elemento slo existir una vez, y el score
ser el de la ltima actualizacin.
Otro caso de uso que quizs no sea tan conocido, es utilizar este tipo de dato como un
ndice para otras estructuras que tengamos almacenadas en Redis. Si por ejemplo
tenemos un hash de usuarios con la informacin de los mismos, podremos recuperar la
informacin de un usuario de manera muy rpida por la clave asociada al hash, pero no
por cualquier otro atributo del usuario. Para remediar esto, podemos utilizar un set
ordenado como ndice secundario en el que mantengamos el atributo que queremos
indexar. Se suele utilizar para generar ndices invertidos para sistemas de bsqueda con
autocompletado.
Hashes:
Un hash permite asociar a una clave una coleccin de pares clave-valor, habitualmente
usado para representar objetos.
Con un hash podemos almacenar cualquier entidad con sus atributos asociados (como
una especie de tabla o diccionario), de forma que podamos recuperar nicamente el
atributo de inters en cada momento. Adems, Redis almacena los hashes de forma muy
eficiente, lo que nos permitir sacar el mximo partido a la memoria disponible.
13
5. Aplicacin Prctica
Ejemplo de Aplicacin
Modelo de Datos
En este apartado se analizarn especficamente los 5 tipos de datos que maneja Redis, y
que le confieren ciertas ventajas en comparacin con otros sistemas de base de datos
que no realizan estas distinciones.
Cadenas de texto
Las cadenas de texto son el tipo de datos ms sencillo que se puede manejar en Redis.
Adems, existen mltiples comandos para facilitar el manejo y la gestin de datos de
tipo String, como los que permiten incrementar nmeros, aadir otras cadenas de texto
al final de otro texto, sacar longitudes, etc.
Ejemplo de uso y comandos:
> set mykey somevalue
OK
> get mykey
somevalue
Set y get son comandos de asignan y obtienen valores respectivamente de los pares
clave valor del sistema.
Diccionarios
Los diccionarios (o hashes) son otro de los tipos bsicos de Redis. Este es el tipo de
datos ideales para representar objetos, entre otras cosas, dentro de la base de datos,
puesto
que ms que pares clave valor, lo que este tipo de objeto almacena es conjuntos de pares
clave valor.
14
As, se podra mantener una base de datos de usuarios para una aplicacin, que contenga
informacin como apellidos, edad, fecha de nacimiento, etc.
Ejemplo de uso y comandos:
> hmset user:1000 username antirez birthyear 1977 verified
1
OK
Listas
Las listas en Redis se utilizan para asignar varios valores asociados a una misma clave.
Las funciones que nos proporciona Redis para la gestin de listas son mltiples y
variadas. Se podr, por ejemplo, insertar al inicio o al final de la lista, recuperar un valor
por posicin, obtener el tamao total, obtener los valores comprendidos dentro de un
rango, etc.
Adems, en las listas se pueden alojar referencias a otras claves, de modo que desde
dentro de la propia lista se puede acceder a los valores de otros objetos de la base de
datos.
Ejemplo de uso y comandos:
> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
Rpush y lpush son comandos que insertan elementos en la lista por la derecha y por
la izquierda, respectivamente, y lrange es un comando que lista los elementos de una
determinada lista especificando los rangos deseados.
Conjuntos
Los conjuntos son colecciones de cadenas de texto. Los conjuntos han de cumplir una
serie de requisitos referente a los elementos que contiene. Por ejemplo, los elementos de
unos conjuntos no se pueden repetir, y no estn ordenador por ningn criterio.
Un ejemplo de uso para este tipo de datos es una lista de personas o de contactos. Otros
ejemplos seran la implementacin de bsquedas de las IPs que visitan un sitio web,
para llevar contabilizados el nmero de tags que se generan en un blog,
15
Ejemplo de uso y comandos:
> sadd myset 1 2 3
(integer) 3
> smembers myset
1. 3
2. 1
3. 2
Sadd es un comando que aade elementos aun conjunto determinado. Smembers
obtiene todos los miembros del conjunto especificado.
Conjuntos ordenados
Los conjuntos ordenados de Redis son similares a los conjuntos normales explicados
anteriormente, pero adems aaden un campo por cada elemento en el que almacenan
un peso asociado al campo. De esta manera, el conjunto puede ser ordenado por pesos.
Al tener ordenados todos los elementos se pueden realizar una serie de consultas que
antes no se poda, como obtener rangos de elementos que cumplen una serie de
requisitos en sus pesos.
Se podra, por ejemplo, crear un ranking con la clasificacin de una carrera, o de un
juego con puntuaciones.
Ejemplo de uso y comandos:
> zadd hackers 1940 "Alan Kay"
(integer) 1
> zadd hackers 1957 "Sophie Wilson"
(integer) 1
> zadd hackers 1953 "Richard Stallman"
(integer) 1
> zadd hackers 1949 "Anita Borg"
(integer) 1
> zrange hackers 0 -1
1) "Alan Kay"
2) "Anita Borg"
3) "Richard Stallman"
4) "Sophie Wilson"
1) "Alan Kay"
2) "1940"
3) "Anita Borg"
4) "1949"
5) "Richard Stallman"
6) "1953"
7) "Sophie Wilson"
8) "1957"
> zrangebyscore hackers -inf 1950
4) "Alan Kay"
5) "Anita Borg"
El comando utilizado por los conjuntos ordenados para aadir elementos es zadd. Por
otro lado, zrange se utiliza para obtener los datos ordenados mediante algn criterio. Por
16
ejemplo, zrangebyscore, devuelve los datos ordenados por valor, de menor a mayor.
Adems, permite especificar un rango de valores de forma que solo se muestren los que
cumplen con esos rangos.
Bases de datos
Redis utiliza bases de datos de forma similar a los sistemas relacionales, alojando los
datos en su interior.
Pero en Redis el nombrado de estas bases de datos es distinto. Redis utiliza nmeros
para identificar las distintas bases de datos que tiene creadas en el sistema. As, la base
de datos por defecto ser la nmero 0, y a cada base de datos que se cree en adelante se
le asignar un nmero natural creciente superior al ltimo que se haya asignado.
A continuacin, se darn una serie de ejemplos reales en los que empresas muy
importantes en el mundo de internet utilizan Redis en entornos de produccin.
Pinterest es una red social que permite a sus usuarios colgar imgenes, vdeos, textos,
etc., y compartirlo con el resto de la comunidad, permitiendo tambin crear tablones
temticos donde poder colgar y clasificar ms fcilmente el contenido.
Para llevar a cabo esta tarea, Pinterest mantiene un modelo de datos al que ellos llaman
el Follower Graph (el grafo de seguidores).
Pinterest permite que sus usuarios sigan a otros usuarios, lo que significa que, por
extensin, seguirn todos los tablones que haya creado ese usuario. Pero tambin
permite que los usuarios sigan tablones concretos de usuarios.
17
Segn dicen en Pinterest, el tamao del grafo no es excesivo, por lo que almacenarlo
totalmente en memoria es una posibilidad. Para esta tarea, utilizan Redis. El grafo est
particionado por UserID, y adems persiste a disco cada segundo para reducir la
posibilidad de prdida de informacin. Cada instancia de Redis mantiene una particin
diferente, lo que facilita la divisin y el reparto de particiones cuando las mquinas
alcanzan sobrecargas.
Twitter es una de las redes sociales ms utilizadas y por tanto con ms carga de del
mundo.
Los usuarios de Twitter tienen pueden seguir a otros usuarios, y por cada usuario
Twitter mantiene un timeline con todos los tweets que ha escrito la gente a la que sigue
ese usuario.
Cada vez que el usuario accede a Twitter a travs de la web o de una aplicacin externa,
el timeline suele ser la primera pantalla que se muestra. Este timeline tiene mucho que
ver con Redis.
Twitter mantiene en un clster de Redis en el que se mantienen los timelines de los
usuarios del sitio en memoria, de forma que, cada vez que un usuario escribe un nuevo
tweet, un proceso lee los seguidores de ese usuario y escribe en sus timelines una
referencia al tweet que acaba de ser escrito.
18
19
Es decir, cada vez que un usuario escribe un tweet, se realiza una insercin en Redis en
los timelines de cada uno de sus followers. Twitter recibe un promedio escrituras de
5.000 tweets/s, con picos de 12.000, y un ratio de lecturas de 300.000 tweets/s.
Adems, el rendimiento es an ms impactante si se piensa en personalidades como
Katy Perry, Justin Bieber o Barack Obama, que cuentan con decenas de millones de
seguidores cada uno. Cada tweet que escribe una de estas personas, provoca unos 50
millones de actualizaciones en Redis, una por cada seguidor.
6. Bibliografa
http://manuelpereiragonzalez.blogspot.pe/2013/01/que-es-redis.html
https://prezi.com/okioikvy5viy/redis/
https://leninmhs.wordpress.com/2013/08/18/redis-tu-base-de-datos-libre-en-memoria/
https://www.paradigmadigital.com/techbiz/no-solo-clave-valor-redis-te-da-alas/
https://luisperis.com/redis/
https://es.wikipedia.org/wiki/Redis
https://Redis.io/documentation
20