Una de las formas de aliviar la tensión en un servidor es mediante el almacenamiento en caché de los datos. Esto se hace mediante el almacenamiento en caché de los datos una vez que se han procesado y luego se sirven desde la caché la próxima vez que se solicitan. Este tutorial le dará una discusión detallada de Redis, explicando cómo instalar Redis y almacenar datos en caché en las aplicaciones Python..
El almacenamiento en caché se refiere al almacenamiento de la respuesta del servidor en el propio cliente, de modo que un cliente no necesita realizar una solicitud del servidor para el mismo recurso una y otra vez. Una respuesta del servidor debe tener información sobre cómo se debe hacer el almacenamiento en caché, de modo que un cliente almacene en caché la respuesta durante un período de tiempo o nunca almacene en caché la respuesta del servidor..
Un caché, por otro lado, es un componente de hardware o software que se utiliza para almacenar datos, por lo que las futuras solicitudes de los mismos datos se pueden atender más rápido.
En esta era en la que los usuarios esperan resultados dentro de un segundo, es aconsejable atender las solicitudes mediante la lectura de datos del caché, que en última instancia es más rápido que la lectura de un almacén de datos más lento; por lo tanto, el rendimiento del sistema depende de cuántas solicitudes se pueden atender desde el caché.
Redis es un almacén de estructura de datos en memoria, de código abierto, que se utiliza como base de datos, caché y agente de mensajes. Funciona almacenando datos en un caché y proporcionándolos la próxima vez que se solicitan, en lugar de consultar la base de datos cada vez..
El primer paso es poner a Redis en funcionamiento localmente en su máquina. La forma más sencilla de instalar Redis es a través del administrador de paquetes del sistema operativo, de este modo:
sudo apt-get install redis-server
También puedes seguir las instrucciones del sitio oficial de Redis..
Descargar y extraer tar de Redis 4.0.6 de la siguiente manera:
$ wget http://download.redis.io/releases/redis-4.0.6.tar.gz $ tar xzf redis-4.0.6.tar.gz $ cd redis-4.0.6 $ make
Los binarios que ahora están compilados están disponibles en el directorio src. Ejecutar Redis con:
$ src / redis-server
Puedes interactuar con Redis usando el cliente incorporado:
$ src / redis-cli redis set foo bar OK redis get foo "bar"
Para verificar si el servidor redis se está ejecutando, emita el siguiente comando en el terminal:
$ sudo redis-server * Listo para aceptar conexiones
Vamos a crear nuestro proyecto Django. Nuestro proyecto podrá almacenar en caché todos los productos en una tienda, lo que facilita y agiliza la recuperación de datos en consultas posteriores..
Para utilizar Redis en nuestra aplicación, debemos hacer lo siguiente:
Antes de comenzar, cree un directorio e instale un entorno virtual. Un entorno virtual le permitirá instalar las versiones de biblioteca requeridas por su aplicación.
mkdir myprojects cd myprojects
A continuación, active el entorno virtual e instale los requisitos del proyecto..
fuente venv / bin / activar pip instalar django == 1.9 pip instalar django-redis pip instalar djangorestframework
django-admin startproject django_cache
Cree una nueva aplicación llamada tienda, que manejará la gestión de productos en nuestra tienda.
cd django_cache python manage.py startapp store
Agregue la aplicación de tienda y rest_framework a la lista de aplicaciones instaladas en el settings.py
expediente.
# settings.py INSTALLED_APPS = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django. contrib.staticfiles ',' store ', # agregar aquí' rest_framework ', # agregar aquí también]
En tienda / modelos.py
, Comenzamos creando el modelo del producto para almacenar los detalles del producto de la siguiente manera:
desde __future__ importar unicode_literals desde django.db importar modelos importar fecha / hora # Crea tus modelos aquí. clase Producto (models.Model): name = models.CharField (max_length = 255) description = models.TextField (null = True, blank = True) price = models.IntegerField (null = True, blank = True) date_created = models. DateTimeField (auto_now_add = True, blank = True) date_modified = models.DateTimeField (auto_now = True, blank = True) def __unicode __ (self): return self.name def to_json (self): return 'id': self.id, 'name': self.name, 'desc': self.description, 'price': self.price, 'date_created': self.date_created, 'date_modified': self.date_modified
Cree una migración inicial para nuestro modelo de productos y sincronice la base de datos por primera vez.
python manage.py makemigration store python manage.py migrate
Cree un superusuario, inicie sesión en el panel de administración y complete su base de datos con algunos datos de muestra que utilizaremos para realizar nuestras pruebas..
Python manage.py creasusuperusuario
Para utilizar Redis con una aplicación Django, necesitamos configurar Redis para almacenar los datos de caché de la aplicación. Y lo siguiente a tu settings.py
expediente:
CACHES = 'default': 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis: //127.0.0.1: 6379 /', 'OPTIONS': 'CLIENT_CLASS': 'django_redis.client .DefaultClient ',
A continuación, vamos a crear un punto final que recupera todos los productos de nuestra base de datos. Primero probaremos el rendimiento de la aplicación en términos de cuánto tiempo se tarda en recuperar los datos de la base de datos sin tener que almacenarlos en caché. Luego, implementaremos otro punto final que recupere datos de un caché y comparemos el rendimiento.
En tienda / views.py
, agregue el siguiente código que recupera todos los productos presentes en la base de datos.
desde django.shortcuts importar procesamiento desde rest_framework.decorators importar api_view desde rest_framework.response import Respuesta desde rest_framework estado de importación # Crea tus vistas aquí. @api_view (['GET']) def view_books (request): products = Product.objects.all () results = [product.to_json () para product in products] return Respuesta (results, status = status.HTTP_201_CREATED)
Crear un archivo tienda / urls.py
y agrega el siguiente código.
# store / urls.py desde django.conf.urls importar url desde .views importar view_books urlpatterns = [url (r '^ $', view_books),]
También necesitamos importar las URL de la aplicación de usuarios a la principal django_cache / urls.py
expediente.
# django_cache / urls.py desde django.conf.urls importar url, incluir desde django.contrib importar admin urlpatterns = [url (r '^ admin /', admin.site.urls), url (r '^ store /', incluir ('store.urls'))]
Hagamos una prueba y veamos si vamos por buen camino. Estaremos utilizando loadtest. Si no está familiarizado con loadtest, es una herramienta para probar el rendimiento..
Instalar loadtest como root es simple:
sudo npm install -g loadtest
$ loadtest -n 100 -k http: // localhost: 8000 / store / # result INFO Solicitudes por segundo: 55
Como se ve en lo anterior, se procesan 55 solicitudes por segundo..
Vamos a crear otro punto final para recuperar datos después del almacenamiento en caché con Redis. Editar usuarios / views.py
para que coincida con lo siguiente:
desde rest_framework.decorators importan api_view desde rest_framework importan estado desde rest_framework.response import Respuesta desde django.core.cache import cache desde django.conf importan settings desde django.core.cache.backends.base import DEFAULT_TIMEOUT CACHE_TTL = getattr (settings) ', DEFAULT_TIMEOUT) desde .models import Product # Crea tus vistas aquí. @api_view (['GET']) def view_books (request): # resto del código @api_view (['GET']) def view_cached_books (request): si 'product' en caché: # obtener resultados de cache products = cache .get ('producto') devolver Respuesta (productos, status = status.HTTP_201_CREATED) else: products = Product.objects.all () results = [product.to_json () para product in products] # almacenar datos en caché cache.set (producto, resultados, tiempo de espera = CACHE_TTL) devolver respuesta (resultados, estado = estado.HTTP_201_CREATED)
El código anterior verificará si el producto clave está presente en el caché y, si se encuentra, los datos representados se devolverán al navegador. En el caso de que no haya datos presentes en el caché, primero recuperamos los datos de la base de datos, los almacenamos en el caché y luego devolvemos los datos consultados al navegador..
Actualizar tienda / urls.py
como sigue.
desde django.conf.urls importar url desde .views importar view_books, view_cached_books urlpatterns = [url (r '^ $', view_books), url (r '^ cache /', view_cached_books),]
Vamos a realizar las pruebas..
$ loadtest -n 100 -k http: // localhost: 8000 / store / cache / # results INFO Solicitudes por segundo: 233
La primera vez que llegue al punto final localhost: 8000 / store / cache, la aplicación consultará desde la base de datos y devolverá los datos, pero las llamadas posteriores a la URL omitirán la base de datos y la consulta de la caché, ya que los datos ya están disponibles en la caché..
En este tutorial, usamos Redis para dar a una aplicación la ilusión de velocidad. Aprovechamos el uso de RAM en Redis para almacenar los resultados de las consultas y luego devolvemos esos resultados de la memoria caché en consultas posteriores en lugar de hacer el viaje de ida y vuelta a la base de datos..
Hay otras herramientas de almacenamiento en caché disponibles, como Memcached, que es similar a Redis. Sin embargo, Redis es más popular que Memcached porque solo toma unos minutos configurar y comenzar a trabajar en las aplicaciones. Redis tiene mecanismos más sofisticados, ya que se ha descrito como un "almacén de estructura de datos", lo que lo hace más poderoso y flexible. Redis también tiene una ventaja más grande porque puede almacenar datos en cualquier forma.
Con suerte, este tutorial le ha mostrado lo fácil que es agregar una capa de almacenamiento en caché a su aplicación, por lo tanto, mejorar el rendimiento. El almacenamiento en caché debe ser algo a tener en cuenta cuando necesita reducir los tiempos de carga y los costos del servidor.