¡Aumenta el rendimiento de tu Node JS con técnicas de almacenamiento en caché! Aprende cómo implementar el almacenamiento en caché en tus proyectos y mejorar la velocidad de tu aplicación.
¿Está cansado de las consultas de bases de datos lentas y que consumen muchos recursos en su aplicación Node.js? Puede deshacerse de estos problemas y mejorar el rendimiento almacenando en caché su aplicación node js. El almacenamiento en caché es una técnica importante en el desarrollo de software que se ha utilizado para mejorar el rendimiento de las aplicaciones, lo que conduce a un proceso de recuperación de datos eficiente y proporciona un mecanismo de almacenamiento intermedio. Implica almacenar datos y objetos a los que se accede con frecuencia en un área de almacenamiento temporal para que puedan recuperar rápidamente los datos cuando sea necesario.
Este artículo cubrirá los conceptos básicos del almacenamiento en caché, una descripción general del servidor Redis, la implementación del almacenamiento en caché en Redis y las diferentes soluciones disponibles en el mercado. Al final de este artículo, comprenderá mejor los escenarios en los que el almacenamiento en caché es útil, qué almacenar en caché y las técnicas apropiadas para implementar el almacenamiento en caché en sus aplicaciones Node.js según su caso de uso específico.
¿Qué es Node.js?
Node.js es un entorno de ejecución de JavaScript del lado del servidor de código abierto construido sobre el motor JavaScript V8 de Google Chrome que permite a los desarrolladores escribir código del lado del servidor utilizando la sintaxis de JavaScript en lugar de otro lenguaje como Java o Python. Hace la vida más fácil para los desarrolladores front-end que están familiarizados con la programación del lado del cliente al permitirles trabajar en el código back-end y viceversa, lo que permite a los desarrolladores back-end que se sienten más cómodos trabajando en tareas del lado del servidor, como bases de datos. o API, accede fácilmente a los mismos lenguajes y bibliotecas disponibles para los navegadores web, lo que significa menos tiempo dedicado a aprender nuevas tecnologías simplemente porque cambiaste entre codificación del lado cliente/servidor.
Esto hace que NodeJS sea muy popular entre los marcos de aplicaciones web modernos, tal como lo introdujo Ryan Dahl en 2009, debido en gran parte al hecho de que utiliza operaciones de E/S asíncronas sin bloqueo, que permiten que los programas escritos en Node js utilicen los recursos mucho mejor que los sincrónicos tradicionales. métodos donde todas las solicitudes deben esperar hasta que se complete una solicitud.
¿Por qué almacenar datos en caché en primer lugar?
El almacenamiento en caché de datos es una práctica común para un proceso de recuperación de datos eficiente. Los datos almacenados en caché reducen la latencia al acceder a grandes conjuntos de datos. Al tener a mano los elementos solicitados recientemente, los tiempos de recuperación son más rápidos que si tuvieran que recuperarse de su origen cada vez que se realiza una solicitud. Además, esto permite un uso más eficiente de los recursos, ya que se pueden manejar múltiples solicitudes de datos similares con una sola consulta, en lugar de realizar solicitudes separadas cada vez.
Por ejemplo, si una aplicación necesita información meteorológica cada hora, almacenar en caché estos datos ahorraría tiempo porque no sería necesario descargar nuevos pronósticos repetidamente a lo largo del día. En cambio, podrían recuperar datos al comienzo de cada hora utilizando datos almacenados en caché en la memoria.
Otro beneficio del almacenamiento en caché es la mejora de la escalabilidad, ya que es necesario realizar menos llamadas remotas, lo que reduce la carga del servidor y amplía la capacidad, lo que permite que más usuarios accedan sin disminuir los tiempos de respuesta debido a la presión excesiva sobre los recursos del sistema, ya que conduce al almacenamiento en caché de los datos consultados con frecuencia. . También garantiza que cuando se produzcan picos de tráfico debido a una mayor demanda, todavía habrá suficientes niveles de servicio disponibles ya que el caché almacena consultas de alta frecuencia localmente, evitando así ralentizaciones asociadas con interrupciones de fuentes remotas como API o bases de datos que pueden no hacerlo. han sido diseñados para esperar que se realicen un gran número de llamadas simultáneas a la vez.
El almacenamiento en caché también aumenta la seguridad al evitar que la información confidencial del usuario, como contraseñas o detalles de tarjetas de crédito, quede expuesta en redes abiertas donde partes no autorizadas pueden interceptarla antes de que llegue al objetivo previsto: otra capa adicional de protección que puede prevenir ataques maliciosos a los sistemas de alojamiento. registros confidenciales de clientes. asegurándose de que sólo aquellos autorizados a acceder a lo que hay dentro
Los datos almacenados en caché pueden proporcionar ahorros de costos, ya que no es necesario realizar numerosas operaciones de almacenamiento y recuperación de datos, lo que resulta en un menor uso de recursos y al mismo tiempo mantiene el mismo nivel de calidad de servicio que esperan los clientes que esperan experiencias rápidas y con capacidad de respuesta, independientemente de cuántas personas estén utilizando. un producto o servicio determinado.
Tipos de caché
Existen varios tipos de caché que se pueden utilizar en diversos contextos, incluido el almacenamiento en caché del lado del cliente, el almacenamiento en caché del lado del servidor y las redes de entrega de contenido (CDN). Cada tipo de caché tiene ventajas y se adapta a diferentes casos de uso, por lo que es importante comprender sus diferencias para elegir la estrategia de almacenamiento en caché adecuada para sus necesidades específicas.
tipo de caché | Definición | Ejemplos |
Caché del lado del cliente | Almacenamiento en caché de páginas web y recursos en la computadora del usuario. | Caché de imágenes del navegador, CSS y JavaScript |
Almacenamiento en caché del lado del servidor | Almacene los componentes del sitio web o de la aplicación en un servidor externo. | Memcached, Redis y LevelDB |
Redes de entrega de contenido (CDN) | Grandes sistemas distribuidos que sirven contenido estático almacenado en caché. | Cloudflare, Akamai y Amazon CloudFront |
La tabla describe las ventajas y desventajas de cada tipo de caché en términos de factores como capacidad, disponibilidad, escalabilidad y complejidad de implementación. En última instancia, la elección de la estrategia de almacenamiento en caché dependerá de las necesidades y requisitos específicos de un proyecto o aplicación determinado.
¿Cuándo utilizar Redis para el almacenamiento en caché?
La caché de Redis es un tipo de almacenamiento de base de datos que proporciona acceso de alta velocidad a los datos almacenados en la memoria. Los cachés de Redis son una excelente opción para aplicaciones donde se deben recuperar y almacenar rápidamente grandes cantidades de datos. Esto los hace particularmente adecuados para aplicaciones basadas en web, como las utilizadas por sitios web de comercio electrónico o sistemas de gestión de contenidos (CMS).
Al decidir utilizar el almacenamiento en caché de Redis, es importante considerar el tamaño y la complejidad de su aplicación. Por ejemplo, si tiene un sitio web pequeño con tráfico mínimo, es posible que no sea necesario el almacenamiento en caché de Redis, ya que sus beneficios pueden no superar el costo involucrado en la configuración del sistema. Sin embargo, usar Redis puede tener sentido si tiene un sitio web más grande con visitantes habituales o clientes que requieren tiempos de respuesta rápidos de su servidor.
Otro factor al considerar el uso de la caché de Redis es la frecuencia con la que se debe acceder y actualizar los datos en el lado del servidor, lo que agiliza las operaciones de acceso a los datos. Si los datos cambian con frecuencia, el uso de Redis puede proporcionar un mejor rendimiento en comparación con otros métodos, como la base de datos basada en disco, debido a su capacidad para manejar múltiples solicitudes simultáneamente sin una ralentización significativa. También permite a los desarrolladores tener más control sobre cómo se manejan las actualizaciones para garantizar que la nueva información se distribuya entre todos los clientes conectados de manera rápida y confiable, en lugar de esperar hasta que se procese cada solicitud antes de actualizarla en todos los servidores simultáneamente, lo que puede llevar más tiempo dependiendo de Latencia de conexion. etc.
Además, otro beneficio importante que ofrece el uso de la caché de Redis es la escalabilidad; Esto significa que si su sitio experimenta aumentos repentinos en la base de usuarios o los niveles de actividad, expandir la capacidad a través de nodos adicionales se vuelve mucho más simple que configurar manualmente una base de datos tradicional, lo que consume tiempo y recursos de otros aspectos, como la creación de nuevas características/funcionalidades para usuarios, etc
Debido a que las versiones almacenadas en caché de los objetos permanecen almacenadas en la RAM, los tiempos de carga de la página generalmente disminuirán junto con un mayor rendimiento debido nuevamente a la reducción de la latencia asociada con la recuperación de información directamente desde las unidades de disco en lugar de ubicaciones de memoria donde todo sucede casi instantáneamente, lo que conduce a mayores mejoras en la capacidad de respuesta general. . visto por los usuarios finales, lo que hace que sus interacciones sean más fluidas y rápidas, lo que ayuda a crear mejores experiencias en general, independientemente del dispositivo a través del cual ven las cosas: teléfonos móviles, tabletas, computadoras portátiles, de escritorio, etc.
Implementar el almacenamiento en caché en Node JS
Digamos que tenemos un sitio web de comercio electrónico que muestra una lista de usuarios. Cada vez que se accede a la URL, la aplicación consulta la base de datos para encontrar los usuarios más recientes, lo que puede ser lento y consumir muchos recursos. Podemos usar el caché de Redis para almacenar los resultados de las consultas de la base de datos y servirlos directamente desde el caché para solicitudes posteriores.
A continuación se explica cómo implementar el almacenamiento en caché de Redis en una aplicación Node.js:
Requisitos previos
- Redis: Redis es un almacén de estructura de datos en memoria que se puede utilizar como base de datos, caché y agente de mensajes.
- Node.js: Node.js es un entorno de ejecución de JavaScript multiplataforma y de código abierto que permite a los desarrolladores crear aplicaciones del lado del servidor utilizando JavaScript.
- Cliente Redis para Node.js: para usar Redis en Node.js, debe instalar una biblioteca cliente de Redis como "redis" a través de npm.
- Conocimientos básicos de los comandos de Redis: antes de ejecutar el almacenamiento en caché con Redis, debe tener un conocimiento básico de los comandos de Redis como SET, GET y EXPIRE, que se utilizan para almacenar, recuperar y caducar datos respectivamente.
Paso 1: instalar el servidor Redis
Puede descargar el instalador utilizando el sitio web oficial de Redis . Siga las instrucciones de su sistema operativo para instalar Redis.
Alternativamente, puede utilizar un administrador de paquetes para instalar Redis. Por ejemplo, en Ubuntu o Debian Linux, puede utilizar el siguiente comando:
sudo apt-get instalar redis-server
En macOS, puedes usar Homebrew para instalar Redis:
instalar redis
En Linux, después de instalar Redis, puede iniciar el servidor Redis ejecutando el siguiente comando en una terminal:
servidor redis
En macOS, puede iniciar el servidor Redis ejecutando el siguiente comando en una terminal:
servidor redis /usr/local/etc/redis.conf
En Windows, después de instalar el sitio web, puede iniciar el servidor Redis ejecutando el siguiente comando en una ventana del símbolo del sistema:
redis-servidor.exe
Esto inicia Redis con la configuración predeterminada.
Paso 2: crea un nuevo proyecto de Node.js.
- Cree un nuevo directorio para su proyecto y navegue hasta él en su terminal.
- Ejecute el siguiente comando para crear un nuevo archivo package.json:
inicio npm -y
Su archivo package.json debería verse así:
{ "nombre": "redis-nodejs", "versión": "1.0.0", "descripción": "", "principal": "index.js", "guiones": { "prueba": "echo \"Error: no se ha especificado ninguna prueba\" && salida 1" }, "palabras clave": , "autor": "", "licencia": "ISC", }
Paso 3: instalar las dependencias requeridas
Luego deberá instalar los siguientes paquetes:
- express: un marco de servidor web para Node.js.
- node-redis: un cliente de Redis que le permite almacenar y acceder a datos en Redis.
Instale el marco web Express y el cliente Redis para Node.js usando el siguiente comando:
npm instala express redis axios
Su archivo package.json debería verse así después de instalar los paquetes necesarios:
{ "nombre": "redis-nodejs", "versión": "1.0.0", "descripción": "", "principal": "index.js", "guiones": { "prueba": "echo \"Error: no se ha especificado ninguna prueba\" && salida 1" }, "palabras clave": , "autor": "", "licencia": "ISC", "dependencias": { "axios": "^1.3.4", "expreso": "^4.18.2", "redis": "^4.6.5" } }
Paso 4: Configure un cliente Redis en su aplicación Node.js
En su aplicación Node.js, cree un nuevo archivo llamado server.js y agréguele el siguiente código:
const expresar = requerir('expresar'); const redis = requerir('redis'); const {createClient} = require('redis'); aplicación constante = expreso; puerto constante = proceso.env.PORT 3000;
En el fragmento de código anterior, importa los módulos necesarios para configurar un servidor Express y un cliente Redis en Node.js.
Luego cree una instancia de la aplicación Express usando const app = express y establezca la variable de puerto en el valor de la variable de entorno definida en el archivo .env, o 3000 si no está definida.
Ahora está listo para comenzar a construir su sistema de almacenamiento en caché usando Redis y Express.
Este código configura un cliente Redis utilizando la biblioteca Node.js Redis y se conecta a un servidor Redis.
Paso 5: cree un cliente Redis y conéctese a un servidor Redis
Ahora agregue el siguiente código al archivo server.js:
dejar redisCliente; (asíncrono => { redisClient = crearCliente; redisClient.on("error", (error) => console.error(`Error: ${error}`)); espere redisClient.connect; }) ;
La primera línea declara una variable llamada redisClient, que almacenará el objeto del cliente Redis.
Luego, el código define una expresión de función invocada inmediatamente (IIFE) usando la sintaxis async/await, que hace lo siguiente:
- Crea un cliente Redis usando la función createClient. Esta función la proporciona la biblioteca Node.js Redis y crea un nuevo objeto de cliente Redis que se puede utilizar para interactuar con un servidor Redis.
- Registra un controlador de errores en el objeto del cliente de Redis, que registra cualquier error en la consola.
- Llama al método de conexión en el objeto del cliente de Redis mediante await, que establece una conexión con el servidor de Redis. Este método devuelve una promesa, por lo que es necesario esperarla.
Paso 6: obtener datos de una API externa
Ahora agregue la siguiente función para recuperar datos de la API.
función asíncrona fetchApiData { const apiResponse = esperar axios.get( ` ); console.log("Solicitud enviada a la API"); devolver apiResponse.data; }
Paso 7: Almacenamiento en caché de las solicitudes del servidor JS del nodo
Agregue la siguiente función getUsersData, que primero extrae el parámetro de usuarios del objeto de solicitud mediante req.params.users. Luego declara resultados de dos variables e isCached, inicializando este último en falso, ya que inicialmente no habría caché.
función asíncrona getUsersData(req, res) { usuarios constantes = req.params.users; dejar resultados; let isCached = falso; intentar { const cacheResults = await redisClient.get(usuarios); si (resultados de caché) { está en caché = verdadero; resultados = JSON.parse(cacheResultados); } demás { resultados = esperar fetchApiData; si (resultados.longitud === 0) { throw "API devolvió una matriz vacía"; } espere redisClient.set (usuarios, JSON.stringify (resultados)); } res.enviar({ fromCache: está en caché, datos: resultados, }); } captura (error) { consola.error(error); res.status(404).send("Datos no disponibles"); } }
Luego, la función intenta recuperar los resultados almacenados en caché de una base de datos de Redis mediante la llamada a la función redisClient.get(usuarios). Si existen resultados almacenados en caché, la variable isCached se establece en verdadero y los resultados almacenados en caché se analizan a partir de una cadena JSON utilizando JSON.parse(cacheResults).
Si no se encuentran resultados almacenados en caché, la función llama a otra función asincrónica fetchApiData para obtener resultados. Si fetchApiData devuelve una matriz vacía, se generará una excepción con el mensaje "API devolvió una matriz vacía".
Si fetchApiData devuelve resultados que no están vacíos, la función almacena los resultados como una cadena JSON en la caché de Redis usando redisClient.set(users, JSON.stringify(results)).
Finalmente, la función envía una respuesta al cliente con un objeto que contiene la variable isCached y los datos de los resultados, usando res.send({ fromCache: isCached, data: results }). Si se detecta una excepción durante la ejecución del bloque try, la función registra un error en la consola y envía una respuesta 404 con el mensaje "Datos no disponibles" usando res.status(404).send("Datos no disponibles").
Paso 8: configurar las rutas de la aplicación
Agregue las siguientes rutas a la aplicación.
app.get("/usuarios/:usuarios", getUsersData); aplicación.listen(puerto, => { console.log(`Aplicación escuchando en el puerto ${port}`); });
El archivo server.js consolidado debería verse así.
const expresar = requerir('expresar'); const redis = requerir('redis'); const {createClient} = require('redis'); aplicación constante = expreso; puerto constante = proceso.env.PORT 3000; dejar redisCliente; (asíncrono => { redisClient = crearCliente; redisClient.on("error", (error) => console.error(`Error: ${error}`)); espere redisClient.connect; }) ; función asíncrona fetchApiData { const apiResponse = esperar axios.get( ` ); console.log("Solicitud enviada a la API"); devolver apiResponse.data; } función asíncrona getUsersData(req, res) { usuarios constantes = req.params.users; dejar resultados; let isCached = falso; intentar { const cacheResults = await redisClient.get(usuarios); si (resultados de caché) { está en caché = verdadero; resultados = JSON.parse(cacheResultados); } demás { resultados = esperar fetchApiData; si (resultados.longitud === 0) { throw "API devolvió una matriz vacía"; } espere redisClient.set (usuarios, JSON.stringify (resultados)); } res.enviar({ fromCache: está en caché, datos: resultados, }); } captura (error) { consola.error(error); res.status(404).send("Datos no disponibles"); } } app.get("/usuarios/:usuarios", getUsersData); aplicación.listen(puerto, => { console.log(`Aplicación escuchando en el puerto ${port}`); });
Paso 9: inicie el servidor y pruebe la caché de Redis
Inicie el servidor ejecutando el siguiente comando en su terminal:
servidor de nodo.js
Paso 10: acceder a los datos recuperados
Tendrás que visitar para ver los datos solicitados. El servidor recuperará los datos.
Vuelva a cargar la página varias veces. Ahora puede ver que los datos solicitados que muestra fromCache son verdaderos. Esto significa que ve los datos del caché.
¡Es eso! Con estos pasos, ahora debería tener una implementación básica de almacenamiento en caché usando Redis con Node.js en su aplicación de comercio electrónico.
Alternativas
Redis es un almacén de estructuras de datos en memoria potente y popular. Se ha vuelto cada vez más popular como alternativa a los sistemas de bases de datos tradicionales debido a su escalabilidad, alto rendimiento y flexibilidad. Es posible que Redis no siempre sea la mejor solución para cada aplicación o caso de uso específico. Existen varias alternativas a Redis en Node.js, cada una con características, ventajas y limitaciones. Estas son algunas de las alternativas más populares a Redis:
Memcached
Memcached es un sistema de almacenamiento en caché de objetos de memoria distribuida de alto rendimiento. Está diseñado para almacenar en caché los datos a los que se accede con frecuencia en la memoria para reducir el tiempo que una aplicación debe recuperar datos de una base de datos u otra fuente. Memcached se utiliza a menudo para aplicaciones web a gran escala que requieren acceso a los mismos datos a alta velocidad.
Una de las ventajas de Memcached sobre Redis es su simplicidad. Es fácil de usar y ocupa poco espacio en la memoria, lo que lo hace ideal para proyectos más pequeños o aplicaciones con recursos limitados. Sin embargo, Memcached no ofrece algunas de las funciones más avanzadas de Redis, como la persistencia o los tipos de datos avanzados.
MongoDB
MongoDB es una base de datos NoSQL popular que se puede utilizar como alternativa a Redis. MongoDB está diseñado para almacenar y administrar grandes cantidades de datos no estructurados, lo que lo convierte en una buena opción para aplicaciones que requieren flexibilidad de almacenamiento de datos.
Una de las ventajas de MongoDB sobre Redis es su escalabilidad. MongoDB puede manejar grandes cantidades de datos y está diseñado para escalar horizontalmente en múltiples servidores. También ofrece capacidades de consulta más avanzadas que Redis, lo que lo convierte en una mejor opción para aplicaciones complejas de recuperación de datos.
apache casandra
Apache Cassandra es una base de datos NoSQL altamente escalable que puede utilizarse como alternativa a Redis. Cassandra está diseñada para manejar grandes cantidades de datos en múltiples servidores y puede proporcionar alta disponibilidad y tolerancia a fallas.
Una de las ventajas de Cassandra sobre Redis es su escalabilidad. Cassandra puede manejar grandes cantidades de datos y está diseñada para escalar horizontalmente en múltiples servidores. También ofrece capacidades de consulta más avanzadas que Redis, lo que lo convierte en una mejor opción para aplicaciones complejas de recuperación de datos.
NivelDB
LevelDB es un almacén de valores clave de código abierto que se puede utilizar como alternativa a Redis. LevelDB está diseñado para ser liviano y rápido, lo que lo convierte en una buena opción para proyectos más pequeños o aplicaciones con recursos limitados.
Una de las ventajas de LevelDB sobre Redis es su simplicidad. Es fácil de usar y ocupa poco espacio en la memoria, lo que lo hace ideal para proyectos más pequeños o aplicaciones con recursos limitados. Sin embargo, LevelDB no ofrece algunas de las funciones más avanzadas de Redis, como la persistencia o los tipos de datos avanzados.
En conclusión, elegir una alternativa a Redis en Node.js dependerá de los requisitos específicos de su proyecto, como el tamaño de los datos, la escalabilidad y las capacidades de consulta requeridas. Cada alternativa tiene su propio conjunto de características y limitaciones, y es fundamental evaluarlas en función de las necesidades específicas de su proyecto.
Conclusión
En conclusión, el almacenamiento en caché con Redis es una excelente manera de optimizar las operaciones de acceso a datos en aplicaciones Node.js. Con la capacidad de almacenar y recuperar datos rápidamente, el almacenamiento en caché puede mejorar significativamente el rendimiento de las aplicaciones y la experiencia del usuario. Además, Redis ofrece varias funciones útiles, como replicación, agrupación en clústeres, transacciones, mensajería de publicación/subscripción y más, que pueden ayudar a los desarrolladores a crear arquitecturas avanzadas para sistemas distribuidos.
También proporciona soluciones de alta disponibilidad que le permiten implementar su aplicación en múltiples servidores o proveedores de nube sin preocuparse por el tiempo de inactividad o problemas de latencia debido a fallas de red u otros problemas del sistema. Todas estas ventajas hacen de Redis una de las opciones más populares para el almacenamiento en caché en aplicaciones Node.js en la actualidad, como se describe en una descripción de trabajo típica de Node.
Si le gustó este artículo, consulte nuestras otras guías a continuación;
- Cambiar la versión del nodo: una guía paso a paso
- Caché de Node JS: aumento del rendimiento y la eficiencia
- Libere el poder de los microservicios Node.JS
- Liberando el poder de Websocket Nodejs
- Los mejores editores de texto y Node JS IDE para el desarrollo de aplicaciones