SlideShare una empresa de Scribd logo
1 de 80
Optimización
de aplicaciones web
con Base de Datos
NoSQL In-Memory
Ing. Gonzalo Chacaltana
gchacaltanab
Julio 2015
Qué entendemos por…
Optimizar
Optimizar
es buscar la
mejor manera
de realizar una
actividad.
Según el diccionario de la RAE:
La pregunta ahora es…
¿Por qué debemos ….
¿Cuándo debemos…
¿Cómo puedo…
¿Quién debe…
optimizar una aplicación web?
Existen múltiples maneras de
optimizar una aplicación web
Arquitectura web tradicional
Servidor web
IP: 200.151.2.90
Servidor
Base de Datos
IP: 200.151.2.201
Navegador webUsuario
TCPHTTP
Request
Response
Tiempos
en conectividad
y procesamiento
3
5
2
4
6
1
7
8
Front-End Back-End
Consejos para optimizar - Front-End
Minimizar HTTP Request
Uso de Content Delivery Network (CDN)
Consejos para optimizar - Front-End
Expiración y control de cache - HTTP Headers
Consejos para optimizar - Front-End
Minimizar CSS y Javascript
Consejos para optimizar - Front-End
Archivos comprimidos GZIP
Consejos para optimizar - Front-End
CSS al inicio del Header
JS al final del Body
Consejos para optimizar - Front-End
Imágenes pesadas = sitio web lento
Optimice sus imágenes
Consejos para optimizar - Front-End
Consejos para optimizar - Back-End
Para optimizar el back-end hay que revisar la
arquitectura de nuestra aplicación
Servidor web
IP: 200.151.2.90
Apache Server
Servidor
Base de Datos
IP: 200.151.2.201
MySQL Server
Navegador webUsuario
TCPHTTP
Request
Response
Consejos para optimizar - Back-End
Servidor Base de Datos
MySQL Server
Servidor web
Apache Server + PHP
 Correcta configuración del httpd.conf
 Utilizar best practices del lenguaje de
programación (PHP).
 Reutilización de código (POO).
 Optimización de código.
 Derivar cálculos matemáticos y/o
fechas a servidor de base de datos.
 Enviar múltiples sentencias SQL en
pocas conexiones a la base de datos.
 En una consulta SQL selecciona los
campos que necesites.
 Utiliza índices para mejorar el tiempo
de respuesta de las consultas SQL.
 Correcta configuración del my.conf
 Utilizar MyISAM si tu prioridad son las
consultas SQL.
¡Para una aplicación tradicional estos consejos son válidos pero
las aplicaciones web han evolucionado!
Revisemos como ha sido evolución
de las aplicaciones web
Evolución de las aplicaciones web
Hace aproximadamente 20 años nacieron las
primeras aplicaciones web
ejecutadas en servidores de PC de
oficina.
Servidores PC de oficina
Estos servidores generaban
mucho calor y requerían
de un ventilador cada vez mayor.
Luego, las aplicaciones fueron aumentando de tamaño
y se necesitaban servidores más potentes y que ocupen
menos espacio.
Así surgió el servidor en forma de caja de pizza.
Servidores Blade
Estas se podrían apilar unas encima de otras.
La infraestructura se veía resuelta, pero a pesar de
tener con muchos servidores, había un problema.
Servidores apilados
Una aplicación solo se ejecutaba desde un servidor.
Servidor N° 1
Servidor N° 2
Servidor N° 3
App N° 1
App N° 2
App N° 3
Esto se convirtió en un gran problema, por que con
el continuo crecimiento de Internet,
estas aplicaciones se volvieron más populares.
Servidores apilados
Servidor N° 1
Servidor N° 2
Servidor N° 3
Servidor N° 4
Servidor N° 5
Servidor N° 6
App N° 1
App N° 2
App N° 3
App N° 4
App N° 5
App N° 6
Y más y más populares.
Servidores apilados
Servidor N° 1
Servidor N° 2
Servidor N° 3
Servidor N° 4
Servidor N° 5
Servidor N° 6
App N° 1
App N° 2
App N° 3
App N° 4
App N° 5
App N° 6
Y como hay un límite en la ejecución de un servidor.
Esta arquitectura no era sostenible y debía ser cambiada.
¿Cuáles son las opciones para aumentar la capacidad
de nuestra aplicación web?
Opción N° 1: ¿Comprar un hardware más poderoso?
Opción N° 2: ¿Optimizar el software?
Opción N° 3: ¿Copiar y ejecutar el software en más servidores?
Opción N° 4: ¿Cambiar el software para ejecutarlo en
más servidores?
¿Cuáles son las opciones para aumentar la capacidad
de nuestra aplicación web?
Al cambiar el software para que se ejecute en
más servidores, comienzas a trabajar con una
arquitectura escalable. Con esto haces que la
capacidad no se limite por el hardware que
utilices o por cuanto optimices tu aplicación.
Cuando necesites crecer, puedes agregar más
servidores.
Opción N° 1: ¿Comprar un hardware más poderoso?.
Opción N° 2: ¿Optimizar el software?
Opción N° 3: ¿Copiar y ejecutar el software en más servidores?
Opción N° 4: ¿Cambiar el software para ejecutarlo en
más servidores?
Desasociar la ejecución
Servidores apilados
Servidor N° 1
Servidor N° 2
Servidor N° 3
Servidor N° 4
Servidor N° 5
Servidor N° N
Desasociar la ejecución de una aplicación convierte a nuestro
diseño en una arquitectura escalable scale-out o también
llamada escalabilidad horizontal.
¿Cuándo una aplicación web es
escalable?
Para que un sistema sea escalable, tiene que
cumplir 3 condiciones:
Condición N°1 :
Tiene que poder adaptarse a un
incremento de números
de usuarios.
Condición N° 2 :
Tiene que poder adaptarse a un
incremento en el tamaño de datos que
maneja.
Condición N° 3 :
Tiene que ser mantenible.
Tipos de escalabilidad
Y que sucede con la
base de datos?
Base de Datos
Replicación de base de
datos
Sincronización on-demand
Sharding de base de datos
Arquitectura Share Nothing
Para que nuestra aplicación web
pueda escalar horizontalmente,
suele utilizarse una arquitectura
“Share Nothing”, es decir que cada
nodo de la aplicación son:
 Independientes
 Auto contenidos
 Autosuficientes
Importante: Estado de la aplicación es compartida por todo el Sistema
Mitos sobre la escalabilidad
2. La escalabilidad no es lo
mismo que el rendimiento
del sistema.
1. La escalabilidad depende del diseño de la
arquitectura, no de la tecnología utilizada.
Con un Internet que crece
rápidamente, la optimización
de una aplicación web
se enfoca en atender
la alta demanda del
objetivo estratégico de
muchas organizaciones
digitales, como es el…
USER
EXPERIENCE
User Experience en una aplicación web
Dependiendo del objetivo
de nuestra aplicación
web, es importante
ofrecerle al usuario:
Velocidad
Usabilidad
Utilidad
Disponibilidad 24x7
Seguridad
¿Cómo podemos mejorar la
velocidad de nuestra aplicación
web?
Motor avanzado de base de datos key-value
Servidor de Base de datos NoSQL de alta velocidad.
Servidor de estructuras de datos escalable.
¿Es mejor cambiar nuestras base de datos relacionales
a una base de datos NoSQL?
REmote Dictionary Server
 Salvattore Sanfilippo @antirez
 Apareció en Diciembre 2009
 Escrito en ANSI C, open source, licencia Free BSD
 Soporte oficial en plataformas UNIX.
 Diseñado para escalar horizontalmente.
 Se ejecuta en un solo proceso de forma asíncrona.
 Transacciones atómicas.
 Conexión TCP / Port Listen 6379
 LUA Scripting
 Redis Cluster
 Memoria RAM
 Página Oficial: http://redis.io
“Memory is the new disk.
Disk is the new Tape”
Jim Gray
Recibió premio Turing en 1998 por
sus contribuciones originales a la
investigación de base de datos y
procesamiento de transacciones.
1. Snapshotting:
La data es transferida asíncronamente desde la
memoria al disco duro.1. Ff
Persistencia en Redis
Arquitectura Master-Slave por replicación.
Persistencia en disco vía snapshots.
10,000 conexiones concurrentes por default.
2. Append Only File (AOF):
• Cada operación de modificación en las estructuras
de datos de Redis es escrito a un archivo.
• Ventaja: Disponibilidad de cambios en los datos
ante una caída de Redis.
• Desventaja: La performance baja al escribir
constantemente al disco.
IMPORTANTE:
Si Redis necesita reiniciar, le tomará entre 10 a 20 segundos
aproximadamente volver a cargar 1 GB de data en memoria RAM.
1. Ff
Persistencia en Redis
Notificaciones en tiempo real con el servicio
Publish / Subscriber
Publish/Subscriber en Redis
Fuente: http://techstacks.io/tech/redis
Quienes usan Redis
Clientes Redis
 Proyectos de analítica en tiempo real.
 Almacenar colas de tareas.
 Memoria compartida por aplicaciones,
servidores, procesos.
 Apps con alta demanda I/O.
 Contadores.
 Notificaciones en tiempo real.
¿Cuándo usar Redis?
¡Manos
al teclado!
Instalando
Apache/MySQL/PHP/Redis
Para el presente taller trabajaremos sobre la distribución Linux CentOS.
1. Instalando herramienta wget
$> yum -y install wget
2. Instalando MySQL-Server
$> yum -y install mysql mysql-server
3. Instalando Apache Server
$> yum -y install httpd
4. Instalando PHP y modulos.
$> yum -y install php
$> yum -y install php-mysql php-devel php-xml php-mbstring php-mcrypt php-soap
5. Descargando RPM e instalando redis.
$> wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$> rpm -Uvh epel-release*rpm
$> yum -y install redis
Instalando PHPRedis
PHPRedis es una extensión que proporciona una API para comunicarnos con Redis
desde PHP.
1. Instalando herramienta git
$> yum -y install git
2. Descargando phpredis
$> git clone https://github.com/gchacaltana/phpredis.git
3. Instalando PHPRedis
$> cd phpredis
$> phpize
$> ./configure
$> make
$> make test
$> make install
$> echo 'extension=redis.so' | tee --append /etc/php.ini
$> touch /var/www/html/info.php
$> echo '<?php phpinfo(); ?> ' | tee --append /var/www/html/info.php
Levantando servicios
1. Iniciando servicio de Apache Server
$> service httpd start
2. Iniciando servicio de MySQL Server
$> service mysqld start
3. Iniciando servicio de Redis Server
$> service redis start
Conociendo Redis
Servidor
> redis-server
Cliente
> redis-cli
Ingresando al cliente de redis.
$> redis-cli
Información de Redis.
$> info
Keys en Redis
Creando un string key-value
redis > SET nombre “Gonzalo”
redis > SET apellido “Chacaltana”
Obteniendo valor de string
redis > GET nombre
“Gonzalo”
redis > GET apellido
“Chacaltana”
El valor de un string puede tener como máximo 512 MB.
Keys en Redis
Creando un string key-value con ORDEN
Esquema:
proyecto:entidad:instancia:atributo
Ejemplo:
redis > SET intranet:alumno:20150201:nombre “Luisa”
redis > SET intranet:alumno:20150201:apellidos “Loo Sang”
redis > GET intranet:alumno:20150201:nombre
“Luisa”
redis > GET intranet:alumno:20150201:apellidos
“Loo Sang”
Keys en Redis
Trabajar con una base de datos NoSQL nos obliga a
pensar menos en modelos relacionales y más en
estructuras key : value
Validar existencia de Key (string)
redis > EXITS sys:cliente:name
0
Concatenar string
redis > SET sys:cliente:name “Mario”
redis > APPEND sys:cliente:name “ Fernando”
redis > GET sys:cliente:name
“Mario Fernando”
Keys en Redis
Visualizar todos los Keys (Llaves)
redis > KEYS *
redis > KEYS intranet:alumno:*
Tener precaución de usarlo en producción.
Eliminar un Key
redis > DEL key
Eliminar todos los Key por patrón de coincidencia
desde consola Linux.
$ > redis-cli KEYS “session:*” | xargs –n 10 redis-cli DEL
Keys en Redis
Cantidad de Keys (Llaves)
redis > DBSIZE
Cantidad de Keys desde la consola de linux
$ > redis-cli KEYS "*" | wc –l
Expirar un Key
redis > SET user:pepito “loged”
redis > EXPIRE user:pepito 25
Visualizar tiempo de expiración
redis > TTL user:pepito
Keys en Redis
Quitar tiempo de expiración
redis > SET user:jaimito “loged”
redis > EXPIRE user:jaimito 50
redis > TTL user:jaimito
redis > PERSIST user:jaimito
redis > GET user:jaimito
Obtener múltiples KEY (string)
redis > SET factura:001543:cliente “Cemento Lima S.A.C”
redis > SET factura:001543:fecha “11/07/2015”
redis > SET factura:001543:importe “25500.50”
redis > MGET factura:001543:cliente factura:001543:fecha
factura:001543:importe
Keys en Redis
Insertar múltiples KEYs
redis > MSET auto:marca “Toyota” auto:modelo “Corola”
Incrementar/Disminuir valor de KEY (número)
redis > SET contador:usuarios “0”
redis > INCR contador:usuarios
1
redis > INCR contador:usuarios
2
redis > GET contador:usuarios
2
redis > DECR contador:usuarios
1
Keys en Redis
Incrementar/Disminuir valor de KEY (número) con valor
fijo.
redis > SET jugadores:vivos “5”
redis > INCRBY jugadores:vivos 4
9
redis > INCRBY jugadores:vivos 2
11
redis > DECRBY jugadores:vivos 6
5
redis > GET jugadores:vivos
5
Obtener valor e inicializar KEY (contador numérico)
redis > GETSET jugadores:vivos
5
Keys en Redis
Tipos de estructuras de
datos avanzadas
Implementando una cola de tareas
redis > LPUSH queue:efact “E001245”
redis > LPUSH queue:efact “E001244”
redis > LRANGE queue:efact 0 -1
“E001244”
“E001245”
redis > RPUSH queue:efact “E001246”
redis > LRANGE queue:efact 0 -1
“E001244”
“E001245”
“E001246”
Sintaxis: LRANGE KEY start stop
List en Redis
Obteniendo y eliminando automáticamente de la cola al
primer elemento. No devolverá hasta que halla un
elemento que devolver. (version bloqueante del LPOP)
Consola 1
redis > BLPOP queue:efact 0
“E001244”
Consola 2
redis > LRANGE queue:efact 0 -1
“E001245”
“E001246
List en Redis
La longitud máxima de una lista es de 4 Billones de elementos.
Eliminar/contar elementos de una lista.
redis > RPUSH lista:alumnos “Ana”
redis > RPUSH lista:alumnos “Camila”
redis > RPUSH lista:alumnos “David”
redis > RPUSH lista:alumnos “Ana”
redis > RPUSH lista:alumnos “Fernando”
redis > LLEN lista:alumnos
5
redis > LREM lista:alumnos -1 “Ana”
Sintaxis: LREM lista count value
• count > 0: Elimina “count” elementos del HEAD a TAIL.
• count < 0: Elimina “count” elementos del TAIL a HEAD.
• count = 0: Elimina todos los elementos igual al valor.
List en Redis
Un Set en Redis es un conjunto desordenado de
strings. Tienen la propiedad de no repetir sus
elementos.
redis > SADD productos “Televisor LG”
redis > SADD productos “Refrigeradora Coldex”
redis > SADD productos “Licuadora Oster”
redis > SADD productos “Televisor LG”
0
redis > SMEMBERS productos
“Televisor LG”
“Refrigedora Coldex”
“Licuadora LG”
redis > SCARD productos
Set en Redis
Validación de existencia de miembro de conjunto (Set).
redis > SADD facturas “F001-005421”
redis > SISMEMBER facturas “F002-9999”
0
redis > SISMEMBER facturas “F001-005421”
1
Cantidad de elementos de una lista.
redis > SCARD productos
Set en Redis
Operaciones entre conjuntos.
redis > SADD simcard:stock "996545212"
redis > SADD simcard:stock "987542155"
redis > SADD simcard:stock "987454454"
redis > SADD simcard:stock "954544545“
redis > SADD simcard:vendidos "987454454"
redis > SADD simcard:vendidos "987542155“
redis > SADD simcard:vendidos "978451500“
redis > SINTER simcard:stock simcard:vendidos
“987454454”
“987542155”
redis > SDIFF simcard:stock simcard:vendidos
“996545212”
“954544545”
Set en Redis
Similares a los Set, a diferencia que cada
miembro tiene asignado un score para ser
ordenado.
redis > ZADD user:followers 250 barackobama
redis > ZADD user:followers 85 ollantahumala
redis > ZADD user:followers 185 paologuerrero
redis > ZINCRBY user:followers 4580 barackobama
redis > ZINCRBY user:followers 398 ollantahumala
redis > ZINCRBY user:followers 3890 paologuerrero
redis > ZRANGE user:followers 0 -1 WITHSCORES
redis > ZRANK user:followers barackobama
redis > ZREVRANGE users:followers 0 -1 WITHSCORES
redis > ZRANGEBYSCORE users:followers –inf 4000
redis > ZRANGEBYSCORE users:followers 3000 5000
Sorted Set en Redis
Son estructuras de datos key-value que
se asemejan más al almacenamiento de
objetos.
redis > HMSET twitter:user:1354 username
“@paolo_guerrero_” name “Paolo Guerrero”
joindate “2008-07-12”
redis > HGETALL twitter:user:1354
redis > HGET twitter:user:1354 name
redis > HEXISTS twitter:user:1354 surname
redis > HEXISTS twitter:user:1354 surname
redis > HKEYS twitter:user:1354
redis > HLEN twitter:user:1354
redis > HMGET twitter:user:1354 name joindate
redis > HVALS twitter:user:1354
Hashes en Redis
Eliminando campos de Hash
redis > HSET twitter:user:1354 fecha “12/02/1988”
redis > HDEL twitter:user:1354 fecha
Contadores en campos de Hash
redis > HINCRBY twitter:user:1354 following 8
redis > HINCRBY twitter:user:1354 following -62
redis > HVALS twitter:user:1354
Hashes en Redis
¿Ya quieren
salir a almorzar?
Verificando PHPInfo
Ingresamos a la URL: http://localhost/phpinfo.php
Creando una librería
Creamos una librería donde centralizar todos los métodos
para acceder al servidor de redis.
Class RedisLibrary
{
private $server;
private $port;
public function __construct($server = NULL, $port = NULL)
{
$this->server = (isset($server)) ? $server : "127.0.0.1";
$this->port = (isset($server)) ? $server : "6379";
}
}
Creando una librería
Dentro de nuestra librería, creamos los métodos.
private function connect()
{
try {
if (!class_exists('Redis')) {
throw new Exception("Redis extension not found.");
}
$connection = new Redis();
$connection->connect($this->server, $this->port);
} catch (Exception $e) {
throw new Exception("There was a problem connecting to redis server.");
}
//validate redis connection
if (isset($connection->socket)) {
return $connection;
} else {
throw new Exception("The redis server is turned off.");
}
}
Creando una librería
Dentro de nuestra librería, creamos los métodos.
public function setSortedSet($set, $key, $value)
{
$redis = $this->connect();
//El metodo zAdd agrega un elemento a una lista ordenada de Redis
$redis->zadd($set, $key, $value);
//cerramos la conexion a Redis.
$redis->close();
return true;
}
public function zIncrBy($set, $value, $member)
{
$redis = $this->connect();
//El metodo zIncrBy incrementa score de un elemento del sorted set
$redis->zIncrBy($set, $value, $member);
//cerramos la conexion a Redis.
$redis->close();
return true;
}
Creando script cliente
require_once 'RedisLibrary.php';
$obj = new RedisLibrary();
$users = array("Marlon", "Fresita", "Angelito", "Winner", "Zylex", "Gatito");
$number_games = 100;
for ($game = 1; $game <= $number_games; $game++) {
$key = mt_rand(0, count($users) - 1);
$score = mt_rand(0, 10);
if ($obj->zIncrBy("players:score", $score, $users[$key])) {
echo sprintf("%s ganó %d punto(s) en la partida %d<br/>",
$users[$key], $score, $game);
}
}
Conclusiones
1. Redis es una poderosa herramienta para almacenar
grandes cantidades de datos en tiempo real.
2. Redis ofrece un rápido servicio de lectura y escritura
concurrente.
3. Podemos realizar monitoreo y detección de eventos
de nuestra colección de datos almacenamos en Redis.
4. Redis nos ofrece estabilidad funcional, escalabilidad,
un sistema de notificaciones real-time usando un
canal publish/suscriber
Referencias
Building Scalable
Web Sites
Cal Henderson
Redis Cookbook
Tiago Macedo
Fred Oliveira
Scaling PHP Applications
Steve Corona
Seven Databases
in Seven Weeks
Eric Redmond
Jim R. Wilson
Optimización
de aplicaciones web
con Base de Datos
NoSQL In-Memory
Gracias
¿PREGUNTAS?
Ing. Gonzalo Chacaltana
gchacaltanab
Julio 2015

Más contenido relacionado

La actualidad más candente

Requerimientos de instalacion
Requerimientos de instalacionRequerimientos de instalacion
Requerimientos de instalacionjosebunbury
 
Introducción mongodb y desarrollo
Introducción mongodb y desarrolloIntroducción mongodb y desarrollo
Introducción mongodb y desarrolloJuan Ladetto
 
Mongodb administración
Mongodb administraciónMongodb administración
Mongodb administraciónJuan Ladetto
 
Instalacion,Configuracion y Creacion de Una Base de Datos en Apache Cassandra...
Instalacion,Configuracion y Creacion de Una Base de Datos en Apache Cassandra...Instalacion,Configuracion y Creacion de Una Base de Datos en Apache Cassandra...
Instalacion,Configuracion y Creacion de Una Base de Datos en Apache Cassandra...Daniel Briian
 
Postgresql Como Funciona Una Dbms Por Dentro
Postgresql Como Funciona Una Dbms Por DentroPostgresql Como Funciona Una Dbms Por Dentro
Postgresql Como Funciona Una Dbms Por DentroEQ SOFT EIRL
 
Cómo aumentar la disponibilidad y el rendimiento utilizando sql server 2012 w...
Cómo aumentar la disponibilidad y el rendimiento utilizando sql server 2012 w...Cómo aumentar la disponibilidad y el rendimiento utilizando sql server 2012 w...
Cómo aumentar la disponibilidad y el rendimiento utilizando sql server 2012 w...Eduardo Castro
 
Big table por Matias tesoriero
Big table por Matias tesorieroBig table por Matias tesoriero
Big table por Matias tesorieromtesoriero
 
Redis: servidor de estructuras de datos
Redis: servidor de estructuras de datosRedis: servidor de estructuras de datos
Redis: servidor de estructuras de datosAntonio Ognio
 
C. comparativo servidores & servicios
C. comparativo servidores & serviciosC. comparativo servidores & servicios
C. comparativo servidores & serviciosKozmo Hernan
 
No sql la nueva era
No sql la nueva eraNo sql la nueva era
No sql la nueva eraJuan Navas
 
Manual apache cassandra y comandos en la shell
Manual apache cassandra y comandos en la shellManual apache cassandra y comandos en la shell
Manual apache cassandra y comandos en la shellKevin López
 
Mejores Prácticas Administración de Base de Datos Oracle
Mejores Prácticas Administración de Base de Datos OracleMejores Prácticas Administración de Base de Datos Oracle
Mejores Prácticas Administración de Base de Datos Oraclejftorres92
 
Actividad de aprendizaje 4
Actividad de aprendizaje 4Actividad de aprendizaje 4
Actividad de aprendizaje 4Sinai Diaz
 

La actualidad más candente (20)

QUÉ ES MySQL
QUÉ ES MySQLQUÉ ES MySQL
QUÉ ES MySQL
 
Requerimientos de instalacion
Requerimientos de instalacionRequerimientos de instalacion
Requerimientos de instalacion
 
Introducción mongodb y desarrollo
Introducción mongodb y desarrolloIntroducción mongodb y desarrollo
Introducción mongodb y desarrollo
 
Mongodb administración
Mongodb administraciónMongodb administración
Mongodb administración
 
Base de dato
Base de  dato Base de  dato
Base de dato
 
SGBD Postgresql
SGBD PostgresqlSGBD Postgresql
SGBD Postgresql
 
Instalacion,Configuracion y Creacion de Una Base de Datos en Apache Cassandra...
Instalacion,Configuracion y Creacion de Una Base de Datos en Apache Cassandra...Instalacion,Configuracion y Creacion de Una Base de Datos en Apache Cassandra...
Instalacion,Configuracion y Creacion de Una Base de Datos en Apache Cassandra...
 
Cuadro comparativo de los diferentes DBMS
Cuadro comparativo de los diferentes DBMSCuadro comparativo de los diferentes DBMS
Cuadro comparativo de los diferentes DBMS
 
Postgresql Como Funciona Una Dbms Por Dentro
Postgresql Como Funciona Una Dbms Por DentroPostgresql Como Funciona Una Dbms Por Dentro
Postgresql Como Funciona Una Dbms Por Dentro
 
Cómo aumentar la disponibilidad y el rendimiento utilizando sql server 2012 w...
Cómo aumentar la disponibilidad y el rendimiento utilizando sql server 2012 w...Cómo aumentar la disponibilidad y el rendimiento utilizando sql server 2012 w...
Cómo aumentar la disponibilidad y el rendimiento utilizando sql server 2012 w...
 
Comparativa SGBDR
Comparativa SGBDRComparativa SGBDR
Comparativa SGBDR
 
Big table por Matias tesoriero
Big table por Matias tesorieroBig table por Matias tesoriero
Big table por Matias tesoriero
 
Redis: servidor de estructuras de datos
Redis: servidor de estructuras de datosRedis: servidor de estructuras de datos
Redis: servidor de estructuras de datos
 
C. comparativo servidores & servicios
C. comparativo servidores & serviciosC. comparativo servidores & servicios
C. comparativo servidores & servicios
 
No sql la nueva era
No sql la nueva eraNo sql la nueva era
No sql la nueva era
 
Manual apache cassandra y comandos en la shell
Manual apache cassandra y comandos en la shellManual apache cassandra y comandos en la shell
Manual apache cassandra y comandos en la shell
 
Gestores de base de datos
Gestores de base de datosGestores de base de datos
Gestores de base de datos
 
My sql clase_1
My sql clase_1My sql clase_1
My sql clase_1
 
Mejores Prácticas Administración de Base de Datos Oracle
Mejores Prácticas Administración de Base de Datos OracleMejores Prácticas Administración de Base de Datos Oracle
Mejores Prácticas Administración de Base de Datos Oracle
 
Actividad de aprendizaje 4
Actividad de aprendizaje 4Actividad de aprendizaje 4
Actividad de aprendizaje 4
 

Destacado

Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)
Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)
Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)Micael Gallego
 
Optimización JavaScript y CSS
Optimización JavaScript y CSSOptimización JavaScript y CSS
Optimización JavaScript y CSSlucascepeda
 
Sintesis de la pelicula Un Buen Año
Sintesis de la pelicula  Un Buen AñoSintesis de la pelicula  Un Buen Año
Sintesis de la pelicula Un Buen AñoGuidito Naranjo
 
Arquitectura y diseño de aplicaciones Java EE
Arquitectura y diseño de aplicaciones Java EEArquitectura y diseño de aplicaciones Java EE
Arquitectura y diseño de aplicaciones Java EECarlos Gavidia-Calderon
 
Arquitecturas de software - Parte 2
Arquitecturas de software - Parte 2Arquitecturas de software - Parte 2
Arquitecturas de software - Parte 2Marta Silvia Tabares
 

Destacado (15)

Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)
Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)
Tema2: Tecnologías de desarrollo web (Desarrollo Aplicaciones Web)
 
Web app
Web appWeb app
Web app
 
Optimización JavaScript y CSS
Optimización JavaScript y CSSOptimización JavaScript y CSS
Optimización JavaScript y CSS
 
Bases de datos distribuidas
Bases de datos distribuidasBases de datos distribuidas
Bases de datos distribuidas
 
Unidad 1
Unidad 1Unidad 1
Unidad 1
 
Base de datos distribuidas
Base de datos distribuidasBase de datos distribuidas
Base de datos distribuidas
 
Sintesis de la pelicula Un Buen Año
Sintesis de la pelicula  Un Buen AñoSintesis de la pelicula  Un Buen Año
Sintesis de la pelicula Un Buen Año
 
Presentacion BD NoSQL
Presentacion  BD NoSQLPresentacion  BD NoSQL
Presentacion BD NoSQL
 
Arquitectura y diseño de aplicaciones Java EE
Arquitectura y diseño de aplicaciones Java EEArquitectura y diseño de aplicaciones Java EE
Arquitectura y diseño de aplicaciones Java EE
 
Arquitectura de aplicaciones
Arquitectura de aplicacionesArquitectura de aplicaciones
Arquitectura de aplicaciones
 
Arquitectura cliente servidor
Arquitectura cliente servidorArquitectura cliente servidor
Arquitectura cliente servidor
 
Probabilidad clásica
Probabilidad clásicaProbabilidad clásica
Probabilidad clásica
 
Arquitecturas de software - Parte 2
Arquitecturas de software - Parte 2Arquitecturas de software - Parte 2
Arquitecturas de software - Parte 2
 
DIAGRAMAS DE VENN, OPERACIONES CON CONJUNTOS.
DIAGRAMAS DE VENN, OPERACIONES CON CONJUNTOS.DIAGRAMAS DE VENN, OPERACIONES CON CONJUNTOS.
DIAGRAMAS DE VENN, OPERACIONES CON CONJUNTOS.
 
reveal.js 3.0.0
reveal.js 3.0.0reveal.js 3.0.0
reveal.js 3.0.0
 

Similar a Optimización de aplicaciones web con base de datos NoSQL In-Memory

Aplicaciones web enriquecidas "RIA"
Aplicaciones web enriquecidas "RIA"Aplicaciones web enriquecidas "RIA"
Aplicaciones web enriquecidas "RIA"Erick Cerna
 
Presentacion cloud computer
Presentacion cloud computerPresentacion cloud computer
Presentacion cloud computerCielo Gris
 
Servidores web de altas prestaciones. Tema 1
Servidores web de altas prestaciones. Tema 1Servidores web de altas prestaciones. Tema 1
Servidores web de altas prestaciones. Tema 1pacvslideshare
 
TEMAS RELACIONADOS WEB2
TEMAS RELACIONADOS WEB2TEMAS RELACIONADOS WEB2
TEMAS RELACIONADOS WEB2guest33bc33
 
Trabajo fin de master Dirección TI
Trabajo fin de master Dirección TITrabajo fin de master Dirección TI
Trabajo fin de master Dirección TIManolo Crespo
 
Visual Studio 2010 Ligthswitch + AZURE + Zero Code
Visual Studio 2010 Ligthswitch + AZURE + Zero CodeVisual Studio 2010 Ligthswitch + AZURE + Zero Code
Visual Studio 2010 Ligthswitch + AZURE + Zero CodeBruno Capuano
 
Mapa Conceptual Servidores web
Mapa Conceptual Servidores webMapa Conceptual Servidores web
Mapa Conceptual Servidores webArturo_09
 
Puntos clave para optimizar Wordpress by Raiola Networks
Puntos clave para optimizar Wordpress by Raiola NetworksPuntos clave para optimizar Wordpress by Raiola Networks
Puntos clave para optimizar Wordpress by Raiola NetworksRaiola Networks
 
cloud computic y seo
cloud computic y seocloud computic y seo
cloud computic y seolessy1997
 
Implementación de Cloud Computing con Software Libre y medidas de seguridad p...
Implementación de Cloud Computing con Software Libre y medidas de seguridad p...Implementación de Cloud Computing con Software Libre y medidas de seguridad p...
Implementación de Cloud Computing con Software Libre y medidas de seguridad p...campus party
 
63997661 tecnologia-cliente-servidor-con-java
63997661 tecnologia-cliente-servidor-con-java63997661 tecnologia-cliente-servidor-con-java
63997661 tecnologia-cliente-servidor-con-javaGilberto Garcia Zavaleta
 
Cliente servidor
Cliente   servidorCliente   servidor
Cliente servidorwilmersp04
 

Similar a Optimización de aplicaciones web con base de datos NoSQL In-Memory (20)

Apuntes entorno cliente servidor
Apuntes entorno cliente   servidorApuntes entorno cliente   servidor
Apuntes entorno cliente servidor
 
Backbeam
BackbeamBackbeam
Backbeam
 
Aplicaciones web enriquecidas "RIA"
Aplicaciones web enriquecidas "RIA"Aplicaciones web enriquecidas "RIA"
Aplicaciones web enriquecidas "RIA"
 
Escalabilidad de Websites
Escalabilidad de WebsitesEscalabilidad de Websites
Escalabilidad de Websites
 
Presentacion cloud computer
Presentacion cloud computerPresentacion cloud computer
Presentacion cloud computer
 
computacion en nube
computacion en nubecomputacion en nube
computacion en nube
 
computacion en la nube
computacion en la nubecomputacion en la nube
computacion en la nube
 
¿Cómo elegir servidor web?
¿Cómo elegir servidor web?¿Cómo elegir servidor web?
¿Cómo elegir servidor web?
 
Cómo elegir un servidor Web
Cómo elegir un servidor WebCómo elegir un servidor Web
Cómo elegir un servidor Web
 
Servidores web de altas prestaciones. Tema 1
Servidores web de altas prestaciones. Tema 1Servidores web de altas prestaciones. Tema 1
Servidores web de altas prestaciones. Tema 1
 
Nuevas tendencias
Nuevas tendenciasNuevas tendencias
Nuevas tendencias
 
TEMAS RELACIONADOS WEB2
TEMAS RELACIONADOS WEB2TEMAS RELACIONADOS WEB2
TEMAS RELACIONADOS WEB2
 
Trabajo fin de master Dirección TI
Trabajo fin de master Dirección TITrabajo fin de master Dirección TI
Trabajo fin de master Dirección TI
 
Visual Studio 2010 Ligthswitch + AZURE + Zero Code
Visual Studio 2010 Ligthswitch + AZURE + Zero CodeVisual Studio 2010 Ligthswitch + AZURE + Zero Code
Visual Studio 2010 Ligthswitch + AZURE + Zero Code
 
Mapa Conceptual Servidores web
Mapa Conceptual Servidores webMapa Conceptual Servidores web
Mapa Conceptual Servidores web
 
Puntos clave para optimizar Wordpress by Raiola Networks
Puntos clave para optimizar Wordpress by Raiola NetworksPuntos clave para optimizar Wordpress by Raiola Networks
Puntos clave para optimizar Wordpress by Raiola Networks
 
cloud computic y seo
cloud computic y seocloud computic y seo
cloud computic y seo
 
Implementación de Cloud Computing con Software Libre y medidas de seguridad p...
Implementación de Cloud Computing con Software Libre y medidas de seguridad p...Implementación de Cloud Computing con Software Libre y medidas de seguridad p...
Implementación de Cloud Computing con Software Libre y medidas de seguridad p...
 
63997661 tecnologia-cliente-servidor-con-java
63997661 tecnologia-cliente-servidor-con-java63997661 tecnologia-cliente-servidor-con-java
63997661 tecnologia-cliente-servidor-con-java
 
Cliente servidor
Cliente   servidorCliente   servidor
Cliente servidor
 

Optimización de aplicaciones web con base de datos NoSQL In-Memory

  • 1. Optimización de aplicaciones web con Base de Datos NoSQL In-Memory Ing. Gonzalo Chacaltana gchacaltanab Julio 2015
  • 3. Optimizar es buscar la mejor manera de realizar una actividad. Según el diccionario de la RAE:
  • 4. La pregunta ahora es… ¿Por qué debemos …. ¿Cuándo debemos… ¿Cómo puedo… ¿Quién debe… optimizar una aplicación web?
  • 5. Existen múltiples maneras de optimizar una aplicación web
  • 6. Arquitectura web tradicional Servidor web IP: 200.151.2.90 Servidor Base de Datos IP: 200.151.2.201 Navegador webUsuario TCPHTTP Request Response Tiempos en conectividad y procesamiento 3 5 2 4 6 1 7 8 Front-End Back-End
  • 7. Consejos para optimizar - Front-End Minimizar HTTP Request
  • 8. Uso de Content Delivery Network (CDN) Consejos para optimizar - Front-End
  • 9. Expiración y control de cache - HTTP Headers Consejos para optimizar - Front-End
  • 10. Minimizar CSS y Javascript Consejos para optimizar - Front-End
  • 11. Archivos comprimidos GZIP Consejos para optimizar - Front-End
  • 12. CSS al inicio del Header JS al final del Body Consejos para optimizar - Front-End
  • 13. Imágenes pesadas = sitio web lento Optimice sus imágenes Consejos para optimizar - Front-End
  • 14. Consejos para optimizar - Back-End Para optimizar el back-end hay que revisar la arquitectura de nuestra aplicación Servidor web IP: 200.151.2.90 Apache Server Servidor Base de Datos IP: 200.151.2.201 MySQL Server Navegador webUsuario TCPHTTP Request Response
  • 15. Consejos para optimizar - Back-End Servidor Base de Datos MySQL Server Servidor web Apache Server + PHP  Correcta configuración del httpd.conf  Utilizar best practices del lenguaje de programación (PHP).  Reutilización de código (POO).  Optimización de código.  Derivar cálculos matemáticos y/o fechas a servidor de base de datos.  Enviar múltiples sentencias SQL en pocas conexiones a la base de datos.  En una consulta SQL selecciona los campos que necesites.  Utiliza índices para mejorar el tiempo de respuesta de las consultas SQL.  Correcta configuración del my.conf  Utilizar MyISAM si tu prioridad son las consultas SQL. ¡Para una aplicación tradicional estos consejos son válidos pero las aplicaciones web han evolucionado!
  • 16. Revisemos como ha sido evolución de las aplicaciones web
  • 17. Evolución de las aplicaciones web Hace aproximadamente 20 años nacieron las primeras aplicaciones web ejecutadas en servidores de PC de oficina. Servidores PC de oficina Estos servidores generaban mucho calor y requerían de un ventilador cada vez mayor.
  • 18. Luego, las aplicaciones fueron aumentando de tamaño y se necesitaban servidores más potentes y que ocupen menos espacio. Así surgió el servidor en forma de caja de pizza. Servidores Blade Estas se podrían apilar unas encima de otras.
  • 19. La infraestructura se veía resuelta, pero a pesar de tener con muchos servidores, había un problema. Servidores apilados Una aplicación solo se ejecutaba desde un servidor. Servidor N° 1 Servidor N° 2 Servidor N° 3 App N° 1 App N° 2 App N° 3
  • 20. Esto se convirtió en un gran problema, por que con el continuo crecimiento de Internet, estas aplicaciones se volvieron más populares. Servidores apilados Servidor N° 1 Servidor N° 2 Servidor N° 3 Servidor N° 4 Servidor N° 5 Servidor N° 6 App N° 1 App N° 2 App N° 3 App N° 4 App N° 5 App N° 6
  • 21. Y más y más populares. Servidores apilados Servidor N° 1 Servidor N° 2 Servidor N° 3 Servidor N° 4 Servidor N° 5 Servidor N° 6 App N° 1 App N° 2 App N° 3 App N° 4 App N° 5 App N° 6 Y como hay un límite en la ejecución de un servidor. Esta arquitectura no era sostenible y debía ser cambiada.
  • 22. ¿Cuáles son las opciones para aumentar la capacidad de nuestra aplicación web? Opción N° 1: ¿Comprar un hardware más poderoso? Opción N° 2: ¿Optimizar el software? Opción N° 3: ¿Copiar y ejecutar el software en más servidores? Opción N° 4: ¿Cambiar el software para ejecutarlo en más servidores?
  • 23. ¿Cuáles son las opciones para aumentar la capacidad de nuestra aplicación web? Al cambiar el software para que se ejecute en más servidores, comienzas a trabajar con una arquitectura escalable. Con esto haces que la capacidad no se limite por el hardware que utilices o por cuanto optimices tu aplicación. Cuando necesites crecer, puedes agregar más servidores. Opción N° 1: ¿Comprar un hardware más poderoso?. Opción N° 2: ¿Optimizar el software? Opción N° 3: ¿Copiar y ejecutar el software en más servidores? Opción N° 4: ¿Cambiar el software para ejecutarlo en más servidores?
  • 24. Desasociar la ejecución Servidores apilados Servidor N° 1 Servidor N° 2 Servidor N° 3 Servidor N° 4 Servidor N° 5 Servidor N° N Desasociar la ejecución de una aplicación convierte a nuestro diseño en una arquitectura escalable scale-out o también llamada escalabilidad horizontal.
  • 25. ¿Cuándo una aplicación web es escalable? Para que un sistema sea escalable, tiene que cumplir 3 condiciones:
  • 26. Condición N°1 : Tiene que poder adaptarse a un incremento de números de usuarios.
  • 27. Condición N° 2 : Tiene que poder adaptarse a un incremento en el tamaño de datos que maneja.
  • 28. Condición N° 3 : Tiene que ser mantenible.
  • 30. Y que sucede con la base de datos? Base de Datos
  • 33. Sharding de base de datos
  • 34. Arquitectura Share Nothing Para que nuestra aplicación web pueda escalar horizontalmente, suele utilizarse una arquitectura “Share Nothing”, es decir que cada nodo de la aplicación son:  Independientes  Auto contenidos  Autosuficientes Importante: Estado de la aplicación es compartida por todo el Sistema
  • 35. Mitos sobre la escalabilidad 2. La escalabilidad no es lo mismo que el rendimiento del sistema. 1. La escalabilidad depende del diseño de la arquitectura, no de la tecnología utilizada.
  • 36. Con un Internet que crece rápidamente, la optimización de una aplicación web se enfoca en atender la alta demanda del objetivo estratégico de muchas organizaciones digitales, como es el… USER EXPERIENCE
  • 37. User Experience en una aplicación web Dependiendo del objetivo de nuestra aplicación web, es importante ofrecerle al usuario: Velocidad Usabilidad Utilidad Disponibilidad 24x7 Seguridad
  • 38. ¿Cómo podemos mejorar la velocidad de nuestra aplicación web?
  • 39. Motor avanzado de base de datos key-value Servidor de Base de datos NoSQL de alta velocidad. Servidor de estructuras de datos escalable. ¿Es mejor cambiar nuestras base de datos relacionales a una base de datos NoSQL? REmote Dictionary Server
  • 40.  Salvattore Sanfilippo @antirez  Apareció en Diciembre 2009  Escrito en ANSI C, open source, licencia Free BSD  Soporte oficial en plataformas UNIX.  Diseñado para escalar horizontalmente.  Se ejecuta en un solo proceso de forma asíncrona.  Transacciones atómicas.  Conexión TCP / Port Listen 6379  LUA Scripting  Redis Cluster  Memoria RAM  Página Oficial: http://redis.io
  • 41. “Memory is the new disk. Disk is the new Tape” Jim Gray Recibió premio Turing en 1998 por sus contribuciones originales a la investigación de base de datos y procesamiento de transacciones.
  • 42. 1. Snapshotting: La data es transferida asíncronamente desde la memoria al disco duro.1. Ff Persistencia en Redis Arquitectura Master-Slave por replicación. Persistencia en disco vía snapshots. 10,000 conexiones concurrentes por default.
  • 43. 2. Append Only File (AOF): • Cada operación de modificación en las estructuras de datos de Redis es escrito a un archivo. • Ventaja: Disponibilidad de cambios en los datos ante una caída de Redis. • Desventaja: La performance baja al escribir constantemente al disco. IMPORTANTE: Si Redis necesita reiniciar, le tomará entre 10 a 20 segundos aproximadamente volver a cargar 1 GB de data en memoria RAM. 1. Ff Persistencia en Redis
  • 44. Notificaciones en tiempo real con el servicio Publish / Subscriber Publish/Subscriber en Redis
  • 47.  Proyectos de analítica en tiempo real.  Almacenar colas de tareas.  Memoria compartida por aplicaciones, servidores, procesos.  Apps con alta demanda I/O.  Contadores.  Notificaciones en tiempo real. ¿Cuándo usar Redis?
  • 49. Instalando Apache/MySQL/PHP/Redis Para el presente taller trabajaremos sobre la distribución Linux CentOS. 1. Instalando herramienta wget $> yum -y install wget 2. Instalando MySQL-Server $> yum -y install mysql mysql-server 3. Instalando Apache Server $> yum -y install httpd 4. Instalando PHP y modulos. $> yum -y install php $> yum -y install php-mysql php-devel php-xml php-mbstring php-mcrypt php-soap 5. Descargando RPM e instalando redis. $> wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm $> rpm -Uvh epel-release*rpm $> yum -y install redis
  • 50. Instalando PHPRedis PHPRedis es una extensión que proporciona una API para comunicarnos con Redis desde PHP. 1. Instalando herramienta git $> yum -y install git 2. Descargando phpredis $> git clone https://github.com/gchacaltana/phpredis.git 3. Instalando PHPRedis $> cd phpredis $> phpize $> ./configure $> make $> make test $> make install $> echo 'extension=redis.so' | tee --append /etc/php.ini $> touch /var/www/html/info.php $> echo '<?php phpinfo(); ?> ' | tee --append /var/www/html/info.php
  • 51. Levantando servicios 1. Iniciando servicio de Apache Server $> service httpd start 2. Iniciando servicio de MySQL Server $> service mysqld start 3. Iniciando servicio de Redis Server $> service redis start
  • 52. Conociendo Redis Servidor > redis-server Cliente > redis-cli Ingresando al cliente de redis. $> redis-cli Información de Redis. $> info
  • 53. Keys en Redis Creando un string key-value redis > SET nombre “Gonzalo” redis > SET apellido “Chacaltana” Obteniendo valor de string redis > GET nombre “Gonzalo” redis > GET apellido “Chacaltana” El valor de un string puede tener como máximo 512 MB.
  • 54. Keys en Redis Creando un string key-value con ORDEN Esquema: proyecto:entidad:instancia:atributo Ejemplo: redis > SET intranet:alumno:20150201:nombre “Luisa” redis > SET intranet:alumno:20150201:apellidos “Loo Sang” redis > GET intranet:alumno:20150201:nombre “Luisa” redis > GET intranet:alumno:20150201:apellidos “Loo Sang”
  • 55. Keys en Redis Trabajar con una base de datos NoSQL nos obliga a pensar menos en modelos relacionales y más en estructuras key : value
  • 56. Validar existencia de Key (string) redis > EXITS sys:cliente:name 0 Concatenar string redis > SET sys:cliente:name “Mario” redis > APPEND sys:cliente:name “ Fernando” redis > GET sys:cliente:name “Mario Fernando” Keys en Redis
  • 57. Visualizar todos los Keys (Llaves) redis > KEYS * redis > KEYS intranet:alumno:* Tener precaución de usarlo en producción. Eliminar un Key redis > DEL key Eliminar todos los Key por patrón de coincidencia desde consola Linux. $ > redis-cli KEYS “session:*” | xargs –n 10 redis-cli DEL Keys en Redis
  • 58. Cantidad de Keys (Llaves) redis > DBSIZE Cantidad de Keys desde la consola de linux $ > redis-cli KEYS "*" | wc –l Expirar un Key redis > SET user:pepito “loged” redis > EXPIRE user:pepito 25 Visualizar tiempo de expiración redis > TTL user:pepito Keys en Redis
  • 59. Quitar tiempo de expiración redis > SET user:jaimito “loged” redis > EXPIRE user:jaimito 50 redis > TTL user:jaimito redis > PERSIST user:jaimito redis > GET user:jaimito Obtener múltiples KEY (string) redis > SET factura:001543:cliente “Cemento Lima S.A.C” redis > SET factura:001543:fecha “11/07/2015” redis > SET factura:001543:importe “25500.50” redis > MGET factura:001543:cliente factura:001543:fecha factura:001543:importe Keys en Redis
  • 60. Insertar múltiples KEYs redis > MSET auto:marca “Toyota” auto:modelo “Corola” Incrementar/Disminuir valor de KEY (número) redis > SET contador:usuarios “0” redis > INCR contador:usuarios 1 redis > INCR contador:usuarios 2 redis > GET contador:usuarios 2 redis > DECR contador:usuarios 1 Keys en Redis
  • 61. Incrementar/Disminuir valor de KEY (número) con valor fijo. redis > SET jugadores:vivos “5” redis > INCRBY jugadores:vivos 4 9 redis > INCRBY jugadores:vivos 2 11 redis > DECRBY jugadores:vivos 6 5 redis > GET jugadores:vivos 5 Obtener valor e inicializar KEY (contador numérico) redis > GETSET jugadores:vivos 5 Keys en Redis
  • 62. Tipos de estructuras de datos avanzadas
  • 63. Implementando una cola de tareas redis > LPUSH queue:efact “E001245” redis > LPUSH queue:efact “E001244” redis > LRANGE queue:efact 0 -1 “E001244” “E001245” redis > RPUSH queue:efact “E001246” redis > LRANGE queue:efact 0 -1 “E001244” “E001245” “E001246” Sintaxis: LRANGE KEY start stop List en Redis
  • 64. Obteniendo y eliminando automáticamente de la cola al primer elemento. No devolverá hasta que halla un elemento que devolver. (version bloqueante del LPOP) Consola 1 redis > BLPOP queue:efact 0 “E001244” Consola 2 redis > LRANGE queue:efact 0 -1 “E001245” “E001246 List en Redis La longitud máxima de una lista es de 4 Billones de elementos.
  • 65. Eliminar/contar elementos de una lista. redis > RPUSH lista:alumnos “Ana” redis > RPUSH lista:alumnos “Camila” redis > RPUSH lista:alumnos “David” redis > RPUSH lista:alumnos “Ana” redis > RPUSH lista:alumnos “Fernando” redis > LLEN lista:alumnos 5 redis > LREM lista:alumnos -1 “Ana” Sintaxis: LREM lista count value • count > 0: Elimina “count” elementos del HEAD a TAIL. • count < 0: Elimina “count” elementos del TAIL a HEAD. • count = 0: Elimina todos los elementos igual al valor. List en Redis
  • 66. Un Set en Redis es un conjunto desordenado de strings. Tienen la propiedad de no repetir sus elementos. redis > SADD productos “Televisor LG” redis > SADD productos “Refrigeradora Coldex” redis > SADD productos “Licuadora Oster” redis > SADD productos “Televisor LG” 0 redis > SMEMBERS productos “Televisor LG” “Refrigedora Coldex” “Licuadora LG” redis > SCARD productos Set en Redis
  • 67. Validación de existencia de miembro de conjunto (Set). redis > SADD facturas “F001-005421” redis > SISMEMBER facturas “F002-9999” 0 redis > SISMEMBER facturas “F001-005421” 1 Cantidad de elementos de una lista. redis > SCARD productos Set en Redis
  • 68. Operaciones entre conjuntos. redis > SADD simcard:stock "996545212" redis > SADD simcard:stock "987542155" redis > SADD simcard:stock "987454454" redis > SADD simcard:stock "954544545“ redis > SADD simcard:vendidos "987454454" redis > SADD simcard:vendidos "987542155“ redis > SADD simcard:vendidos "978451500“ redis > SINTER simcard:stock simcard:vendidos “987454454” “987542155” redis > SDIFF simcard:stock simcard:vendidos “996545212” “954544545” Set en Redis
  • 69. Similares a los Set, a diferencia que cada miembro tiene asignado un score para ser ordenado. redis > ZADD user:followers 250 barackobama redis > ZADD user:followers 85 ollantahumala redis > ZADD user:followers 185 paologuerrero redis > ZINCRBY user:followers 4580 barackobama redis > ZINCRBY user:followers 398 ollantahumala redis > ZINCRBY user:followers 3890 paologuerrero redis > ZRANGE user:followers 0 -1 WITHSCORES redis > ZRANK user:followers barackobama redis > ZREVRANGE users:followers 0 -1 WITHSCORES redis > ZRANGEBYSCORE users:followers –inf 4000 redis > ZRANGEBYSCORE users:followers 3000 5000 Sorted Set en Redis
  • 70. Son estructuras de datos key-value que se asemejan más al almacenamiento de objetos. redis > HMSET twitter:user:1354 username “@paolo_guerrero_” name “Paolo Guerrero” joindate “2008-07-12” redis > HGETALL twitter:user:1354 redis > HGET twitter:user:1354 name redis > HEXISTS twitter:user:1354 surname redis > HEXISTS twitter:user:1354 surname redis > HKEYS twitter:user:1354 redis > HLEN twitter:user:1354 redis > HMGET twitter:user:1354 name joindate redis > HVALS twitter:user:1354 Hashes en Redis
  • 71. Eliminando campos de Hash redis > HSET twitter:user:1354 fecha “12/02/1988” redis > HDEL twitter:user:1354 fecha Contadores en campos de Hash redis > HINCRBY twitter:user:1354 following 8 redis > HINCRBY twitter:user:1354 following -62 redis > HVALS twitter:user:1354 Hashes en Redis
  • 72. ¿Ya quieren salir a almorzar?
  • 73. Verificando PHPInfo Ingresamos a la URL: http://localhost/phpinfo.php
  • 74. Creando una librería Creamos una librería donde centralizar todos los métodos para acceder al servidor de redis. Class RedisLibrary { private $server; private $port; public function __construct($server = NULL, $port = NULL) { $this->server = (isset($server)) ? $server : "127.0.0.1"; $this->port = (isset($server)) ? $server : "6379"; } }
  • 75. Creando una librería Dentro de nuestra librería, creamos los métodos. private function connect() { try { if (!class_exists('Redis')) { throw new Exception("Redis extension not found."); } $connection = new Redis(); $connection->connect($this->server, $this->port); } catch (Exception $e) { throw new Exception("There was a problem connecting to redis server."); } //validate redis connection if (isset($connection->socket)) { return $connection; } else { throw new Exception("The redis server is turned off."); } }
  • 76. Creando una librería Dentro de nuestra librería, creamos los métodos. public function setSortedSet($set, $key, $value) { $redis = $this->connect(); //El metodo zAdd agrega un elemento a una lista ordenada de Redis $redis->zadd($set, $key, $value); //cerramos la conexion a Redis. $redis->close(); return true; } public function zIncrBy($set, $value, $member) { $redis = $this->connect(); //El metodo zIncrBy incrementa score de un elemento del sorted set $redis->zIncrBy($set, $value, $member); //cerramos la conexion a Redis. $redis->close(); return true; }
  • 77. Creando script cliente require_once 'RedisLibrary.php'; $obj = new RedisLibrary(); $users = array("Marlon", "Fresita", "Angelito", "Winner", "Zylex", "Gatito"); $number_games = 100; for ($game = 1; $game <= $number_games; $game++) { $key = mt_rand(0, count($users) - 1); $score = mt_rand(0, 10); if ($obj->zIncrBy("players:score", $score, $users[$key])) { echo sprintf("%s ganó %d punto(s) en la partida %d<br/>", $users[$key], $score, $game); } }
  • 78. Conclusiones 1. Redis es una poderosa herramienta para almacenar grandes cantidades de datos en tiempo real. 2. Redis ofrece un rápido servicio de lectura y escritura concurrente. 3. Podemos realizar monitoreo y detección de eventos de nuestra colección de datos almacenamos en Redis. 4. Redis nos ofrece estabilidad funcional, escalabilidad, un sistema de notificaciones real-time usando un canal publish/suscriber
  • 79. Referencias Building Scalable Web Sites Cal Henderson Redis Cookbook Tiago Macedo Fred Oliveira Scaling PHP Applications Steve Corona Seven Databases in Seven Weeks Eric Redmond Jim R. Wilson
  • 80. Optimización de aplicaciones web con Base de Datos NoSQL In-Memory Gracias ¿PREGUNTAS? Ing. Gonzalo Chacaltana gchacaltanab Julio 2015