Cum se utilizează Redis în aplicațiile Django

Una dintre modalitățile de a calma tulpina pe un server este prin cache-ul datelor. Aceasta se face prin cache-ul datelor după ce a fost procesat și apoi servind-l din cache la următoarea solicitare. Acest tutorial va oferi o discuție detaliată despre Redis, explicând modul de instalare a datelor Redis și cache în aplicațiile Python.

Introducere în Redis și Caching

Caching-ul se referă la stocarea răspunsului serverului în client însuși, astfel încât un client nu trebuie să facă o solicitare de server pentru aceeași resursă din nou și din nou. Un răspuns de la server trebuie să aibă informații despre modul în care trebuie să se facă cache-ul, astfel încât un client să cacheze răspunsul pentru o perioadă de timp sau să nu cacheze răspunsul serverului.

Un cache, pe de altă parte, este o componentă hardware sau software utilizată pentru stocarea datelor, astfel încât cererile viitoare pentru aceleași date pot fi difuzate mai repede.

În această vârstă, în care utilizatorii se așteaptă la rezultate într-o secundă, este bine să se servească cererile prin citirea datelor din memoria cache, ceea ce este în cele din urmă mai rapid decât citirea dintr-un magazin de date mai lent; astfel, performanța sistemului depinde de câte cereri pot fi trimise din memoria cache.

Redis este un open-source, stocat în memorie structura de date, folosit ca bază de date, cache și broker de mesaje. Funcționează prin stocarea datelor într-o memorie cache și furnizarea acesteia la următoarea solicitare, în loc să interogheze baza de date de fiecare dată.

Instalați Redis

Primul pas este să-l puneți pe Redis în funcțiune pe mașina dvs. Cea mai simplă modalitate de a instala Redis este prin intermediul managerului de pachete al sistemului de operare, astfel:

sudo apt-get instalați redis-server

De asemenea, puteți urma instrucțiunile de pe site-ul oficial Redis.

Descărcați și extrageți Redis 4.0.6 gudron după cum urmează:

$ 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

Binarele care sunt acum compilate sunt disponibile în directorul src. Rulați Redis cu:

$ src / redis-server

Puteți interacționa cu Redis utilizând clientul încorporat:

$ src / redis-cli redis set foo bar OK redisare pentru foo "bar"

Pentru a verifica dacă serverul Redis rulează, lansați următoarea comandă pe terminal:

$ sudo redis-server * Gata să accepte conexiuni 

Exemplu API pentru Django

Să creăm proiectul nostru Django. Proiectul nostru va putea să cacheze toate produsele dintr-un magazin, făcând-o ușor și rapidă pentru a prelua datele în interogările ulterioare.

Pentru a utiliza Redis în aplicația noastră, trebuie să facem următoarele:

  1. Verificați dacă rezultatele interogării curente există în memoria cache.
  2. Dacă există rezultate în memoria cache, recuperați-le.
  3. Dacă rezultatele nu există, preluați-le, păstrați-le în memoria cache și apoi le transmiteți entității solicitante.

cerinţe

  • Django
  • django-Redis
  • Redis
  • loadtest

Creați-vă proiectul

Înainte de a începe, creați un director și instalați un mediu virtual. Un mediu virtual vă va permite să instalați versiuni de bibliotecă solicitate de aplicația dvs..

mkdir myprojects cd myprojects

Apoi, activați mediul virtual și instalați cerințele proiectului.

 sursă venv / bin / activa pip instalare django == 1.9 pip instalare django-redis pip instalare djangorestframework

Creați un proiect Django

django-admin startproject django_cache

Creați o nouă aplicație denumită magazin, care se va ocupa de gestionarea produselor din magazinul nostru.

cd django_cache magazinul python manage.py startapp

Adăugați aplicația de magazin și rest_framework la lista de aplicații instalate din settings.py fişier.

# settings.py INSTALLED_APPS = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django. contrib.staticfiles ',' store ', # adauga aici' rest_framework ', # adauga aici si aici]

Crearea modelelor

În magazin / models.py, începem prin crearea modelului de produs pentru stocarea detaliilor produsului după cum urmează:

de la __future__ import unicode_literals de la modelele de import django.db importtime datetime # Creați-vă modelele aici. Clasa Produs (modele.Model): nume = modele.CharField (max_length = 255) description = models.TextField (null = True, blank = True) pret = models.IntegerField (null = True = blank) date_created = DateTimeField (auto_now_add = True, blank = adevărat) date_modified = models.DateTimeField (auto_now = True, blank = True) def __unicode __ (self) 'nume': auto.name, 'desc': auto.description, 'price': self.price, 'date_created': self.date_created, 'date_modified': self.date_modified 

migraţii

Creați o migrare inițială pentru modelul de produse și sincronizați baza de date pentru prima dată.

administrarea python manage.py makemigration migrație python manage.py

Creați superutilizator

Creați un superuser, conectați-vă la panoul de administrare și completați baza de date cu unele date de probă pe care le vom folosi pentru a face testele noastre.

python manage.py createsuperuser

Configurarea aplicației Redis în aplicațiile Python

Pentru a folosi Redis cu o aplicație Django, trebuie să configuram Redis pentru a stoca datele cache-ului aplicației. Și următoarele pentru dvs. settings.py fişier:

CACHES = 'default': 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis: //127.0.0.1: 6379 /', 'OPTIONS': 'CLIENT_CLASS': 'django_redis.client .DefaultClient ',

Apoi, vom crea un punct final care va prelua toate produsele din baza noastră de date. Vom încerca mai întâi performanța aplicației în ceea ce privește durata de preluare a datelor din baza de date fără a fi cacheată. Apoi vom implementa un alt parametru care va prelua datele din memoria cache și va compara performanța.

În magazin / views.py, adăugați următorul cod care preia toate produsele prezente în baza de date.

de la django.shortcuts importați render de la rest_framework.decorators importați api_view din rest_framework.response importați Răspunsul de la starea de import a rest_framework # Creați-vă vizualizările aici. @api_view (['GET ']) def view_books (request): products = Product.objects.all () results = [product.to_json () pentru produs în produse] return Response (results, status = status.HTTP_201_CREATED)

Configurarea adreselor URL

Creați un fișier magazin / urls.py și adăugați următorul cod.

# store / urls.py de la django.conf.urls import url de la .views import view_books urlpatterns = [url (r '^ $', view_books),]

De asemenea, trebuie să importem adrese URL din aplicația utilizatorilor în principal django_cache / urls.py fişier.

# django_cache / urls.py de la adresa de import django.conf.urls, includeți de la django.contrib importul admin urlpatterns = [url (r '^ admin /', admin.site.urls), url (r '^ store / include ('store.urls'))] 

Să facem un test și să vedem dacă suntem pe drumul cel bun. Vom folosi testul de încărcare. Dacă nu sunteți familiarizat cu testul de încărcare, este un instrument pentru testarea performanței.

Instalarea testului de încărcare ca root este simplă:

sudo npm instalați -g loadtest
$ loadtest -n 100 -k http: // localhost: 8000 / store / # rezultat INFO Cereri pe secundă: 55 

După cum reiese din cele de mai sus, 55 de cereri sunt procesate pe secundă.

Să creați un alt punct final pentru preluarea datelor după cache-ul cu Redis. Editați | × utilizatorii / views.py pentru a se potrivi cu următoarele:

de la rest_framework.decorators importa api_view din rest_framework starea importului din importul rest_framework.response Răspunsul din cache-ul de import django.core.cache din setările de import django.conf de la importul django.core.cache.backends.base DEFAULT_TIMEOUT CACHE_TTL = getattr (setările "CACHE_TTL ', DEFAULT_TIMEOUT) din .models import Product # Creați vizualizările dvs. aici. @api_view (['GET']) def view_books (request): # restul codului @api_view (['GET']) def view_cached_books (cerere): if 'product' in cache: .get ('product') return Response (produse, status = status.HTTP_201_CREATED) else: products = Product.objects.all () results = [product.to_json () (produs, rezultate, timeout = CACHE_TTL) return Response (rezultate, status = status.HTTP_201_CREATED) 

Codul de mai sus va verifica dacă produsul cheie este prezent în memoria cache și dacă este găsit, datele reprezentate vor fi returnate browserului. În cazul în care nu există date în cache, vom prelua mai întâi datele din baza de date, vom stoca în memoria cache și apoi vom returna datele solicitate în browser.

Actualizați magazin / urls.py după cum urmează.

de la django.conf.urls import url de la .views import view_books, view_cached_books urlpatterns = [url (r '^ $', view_books), url (r '^ cache /', view_cached_books) 

Să facem testele.

$ loadtest -n 100 -k http: // localhost: 8000 / store / cache / # results INFO Cererile pe secundă: 233 

Prima dată când ați atins punctul final localhost: 8000 / store / cache, aplicația va interoga din baza de date și va returna datele, dar apelurile ulterioare la adresa URL vor ocoli baza de date și interogarea din memoria cache, deoarece datele sunt deja disponibile în memoria cache.

Concluzie

În acest tutorial, am folosit Redis pentru a da o aplicație iluzia vitezei. Folosim RAM-ul în Redis pentru a stoca rezultatele interogărilor și apoi pentru a returna aceste rezultate din memoria cache în interogările ulterioare, în loc să faceți călătoria înapoi în baza de date.

Există și alte instrumente de caching disponibile, cum ar fi Memcached, care este similar cu Redis. Cu toate acestea, Redis este mult mai popular decât Memcached, deoarece durează doar câteva minute pentru a configura și de a lucra în aplicații. Redis are mecanisme mai sofisticate, așa cum a fost descris ca un "magazin de structuri de date", făcându-l mai puternic și mai flexibil. Redis are, de asemenea, un avantaj mai mare, deoarece puteți stoca date sub orice formă.

Sperăm că acest tutorial vă arată cât de ușor este să adăugați un strat de cache aplicației dvs., îmbunătățind astfel performanța. Caching-ul trebuie să fie ceva de luat în considerare când trebuie să reduceți timpul de încărcare și costurile serverului.

Cod