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-lru
significa 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