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é
- Instal·lació de Redis
Si encara no tens Redis instal·lat, pots seguir les instruccions del Mòdul 1: Instal·lant Redis.
- 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-lrusignifica que Redis eliminarà les claus menys recentment utilitzades quan s'arribi al límit de memòria.
- 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'
- 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.
Curs de Redis
Mòdul 1: Introducció a Redis
Mòdul 2: Estructures de Dades de Redis
Mòdul 3: Comandes i Operacions de Redis
Mòdul 4: Persistència de Redis
- Instantànies (RDB)
- Fitxers Només de Afegeix (AOF)
- Configuració de la Persistència
- Còpia de Seguretat i Restauració
Mòdul 5: Seguretat de Redis
Mòdul 6: Optimització del Rendiment de Redis
Mòdul 7: Clúster i Alta Disponibilitat de Redis
Mòdul 8: Mòduls i Extensions de Redis
- Introducció als Mòduls de Redis
- Mòduls Populars de Redis
- Creant Mòduls Personalitzats
- Utilitzant Redis amb Altres Tecnologies
