En aquest tema, explorarem com utilitzar Redis com a sistema de caché. Redis és àmpliament utilitzat per la seva velocitat i eficiència, i és una opció popular per a la caché de dades en aplicacions web i altres sistemes. Aprendrem els conceptes bàsics de la caché, com configurar Redis per a la caché, i veurem exemples pràctics.

Què és la Caché?

La caché és una tècnica d'emmagatzematge temporal que permet accedir ràpidament a dades que es consulten freqüentment. Els beneficis principals de la caché són:

  • Reducció de la latència: Les dades es poden recuperar més ràpidament des de la memòria caché que des d'una base de dades o un sistema d'emmagatzematge persistent.
  • Descarregar la base de dades: Redueix la càrrega de treball de la base de dades principal, ja que les consultes repetides es poden servir des de la caché.
  • Millora del rendiment: Augmenta el rendiment general de l'aplicació, especialment en entorns amb alta concurrència.

Configurant Redis com a Caché

  1. Instal·lació de Redis

Si encara no tens Redis instal·lat, pots seguir les instruccions del Mòdul 1: Instal·lant Redis.

  1. Configuració Bàsica

Per utilitzar Redis com a caché, és important configurar correctament els paràmetres de Redis. Aquí tens un exemple de configuració bàsica:

# redis.conf

# Estableix el màxim de memòria que Redis pot utilitzar
maxmemory 256mb

# Defineix la política d'evicció de memòria
maxmemory-policy allkeys-lru
  • maxmemory: Defineix la quantitat màxima de memòria que Redis pot utilitzar. En aquest exemple, hem establert un límit de 256 MB.
  • maxmemory-policy: Defineix la política d'evicció de memòria. allkeys-lru significa que Redis eliminarà les claus menys recentment utilitzades quan s'arribi al límit de memòria.

  1. Emmagatzematge de Dades a la Caché

Per emmagatzemar dades a la caché, utilitzarem les comandes bàsiques de Redis. Aquí tens un exemple en Python utilitzant la biblioteca redis-py:

import redis

# Connecta a Redis
r = redis.Redis(host='localhost', port=6379, db=0)

# Emmagatzema una clau-valor a la caché
r.set('clau', 'valor')

# Recupera el valor de la clau
valor = r.get('clau')
print(valor)  # Output: b'valor'

  1. Establint un Temps de Caducitat

És important establir un temps de caducitat per a les dades emmagatzemades a la caché per evitar que ocupin memòria indefinidament. Això es pot fer utilitzant la comanda SETEX:

# Emmagatzema una clau-valor amb un temps de caducitat de 60 segons
r.setex('clau_temporal', 60, 'valor_temporal')

# Recupera el valor de la clau
valor_temporal = r.get('clau_temporal')
print(valor_temporal)  # Output: b'valor_temporal'

Exemples Pràctics

Exemple 1: Caché de Resultats de Consultes a la Base de Dades

Suposem que tenim una aplicació web que consulta freqüentment una base de dades per obtenir informació d'usuari. Podem utilitzar Redis per emmagatzemar els resultats de les consultes a la caché:

import redis
import sqlite3

# Connecta a Redis
r = redis.Redis(host='localhost', port=6379, db=0)

# Connecta a la base de dades SQLite
conn = sqlite3.connect('base_de_dades.db')
cursor = conn.cursor()

def obtenir_informacio_usuari(usuari_id):
    # Comprova si la informació de l'usuari està a la caché
    info_usuari = r.get(f'usuari:{usuari_id}')
    if info_usuari:
        return info_usuari

    # Si no està a la caché, consulta la base de dades
    cursor.execute('SELECT * FROM usuaris WHERE id = ?', (usuari_id,))
    info_usuari = cursor.fetchone()

    # Emmagatzema el resultat a la caché amb un temps de caducitat de 300 segons
    r.setex(f'usuari:{usuari_id}', 300, str(info_usuari))

    return info_usuari

# Exemple d'ús
usuari_id = 1
info = obtenir_informacio_usuari(usuari_id)
print(info)

Exemple 2: Caché de Respostes d'API

Podem utilitzar Redis per emmagatzemar les respostes d'API que es consulten freqüentment:

import redis
import requests

# Connecta a Redis
r = redis.Redis(host='localhost', port=6379, db=0)

def obtenir_dades_api(url):
    # Comprova si la resposta de l'API està a la caché
    resposta = r.get(url)
    if resposta:
        return resposta

    # Si no està a la caché, fa la consulta a l'API
    resposta = requests.get(url).text

    # Emmagatzema la resposta a la caché amb un temps de caducitat de 600 segons
    r.setex(url, 600, resposta)

    return resposta

# Exemple d'ús
url = 'https://api.exemple.com/dades'
dades = obtenir_dades_api(url)
print(dades)

Exercicis Pràctics

Exercici 1: Implementar una Caché per a Consultes de Productes

Implementa una funció que utilitzi Redis per emmagatzemar i recuperar informació de productes d'una base de dades. La funció ha de comprovar primer si la informació del producte està a la caché i, si no ho està, ha de consultar la base de dades i emmagatzemar el resultat a la caché amb un temps de caducitat de 5 minuts.

Solució

import redis
import sqlite3

# Connecta a Redis
r = redis.Redis(host='localhost', port=6379, db=0)

# Connecta a la base de dades SQLite
conn = sqlite3.connect('base_de_dades.db')
cursor = conn.cursor()

def obtenir_informacio_producte(producte_id):
    # Comprova si la informació del producte està a la caché
    info_producte = r.get(f'producte:{producte_id}')
    if info_producte:
        return info_producte

    # Si no està a la caché, consulta la base de dades
    cursor.execute('SELECT * FROM productes WHERE id = ?', (producte_id,))
    info_producte = cursor.fetchone()

    # Emmagatzema el resultat a la caché amb un temps de caducitat de 300 segons
    r.setex(f'producte:{producte_id}', 300, str(info_producte))

    return info_producte

# Exemple d'ús
producte_id = 1
info = obtenir_informacio_producte(producte_id)
print(info)

Exercici 2: Implementar una Caché per a Respostes d'API amb Paràmetres

Implementa una funció que utilitzi Redis per emmagatzemar i recuperar respostes d'API que accepten paràmetres. La funció ha de construir una clau única per a cada combinació d'URL i paràmetres, i emmagatzemar la resposta a la caché amb un temps de caducitat de 10 minuts.

Solució

import redis
import requests
import hashlib

# Connecta a Redis
r = redis.Redis(host='localhost', port=6379, db=0)

def obtenir_dades_api(url, params):
    # Construeix una clau única per a l'URL i els paràmetres
    clau = f'{url}:{hashlib.md5(str(params).encode()).hexdigest()}'

    # Comprova si la resposta de l'API està a la caché
    resposta = r.get(clau)
    if resposta:
        return resposta

    # Si no està a la caché, fa la consulta a l'API
    resposta = requests.get(url, params=params).text

    # Emmagatzema la resposta a la caché amb un temps de caducitat de 600 segons
    r.setex(clau, 600, resposta)

    return resposta

# Exemple d'ús
url = 'https://api.exemple.com/dades'
params = {'param1': 'valor1', 'param2': 'valor2'}
dades = obtenir_dades_api(url, params)
print(dades)

Conclusió

En aquest tema, hem après com utilitzar Redis com a sistema de caché per millorar el rendiment de les aplicacions. Hem vist com configurar Redis per a la caché, com emmagatzemar i recuperar dades, i hem explorat exemples pràctics d'ús. També hem proporcionat exercicis pràctics per reforçar els conceptes apresos. En el següent tema, explorarem com utilitzar Redis per a l'emmagatzematge de sessions.

© Copyright 2024. Tots els drets reservats