Nouveau : Datasets open source gratuits disponibles !Decouvrir →
Intermediaire 20 min Spring Boot

Caching avec Spring Boot et Redis

Pourquoi Caching avec Spring Boot et Redis ?

Dans un environnement d'application Web, la performance est cruciale pour offrir une meilleure expérience utilisateur. L'un des moyens les plus efficaces de renforcer la performance est l'utilisation du caching. Avec Spring Boot et Redis, nous pouvons mettre en œuvre un système de caching robuste et performant.

Un cas concret serait le site e-commerce d'une grande entreprise. Chaque fois qu'un utilisateur visite une page produit, il faut généralement récupérer les détails du produit depuis la base de données. Cela peut entraîner un délai de réponse important si la base de données est saturée ou si le nombre de requêtes est élevé.

En utilisant Spring Boot et Redis, nous pouvons stocker temporairement les détails des produits en mémoire vive (Redis) pour une accès rapide. Ainsi, lorsqu'un utilisateur visite à nouveau la même page produit, nous pouvons récupérer directement les données depuis Redis, ce qui réduit significativement le délai de réponse et augmente l'expérience utilisateur.

Prerequis

  • Connaissance de base de Spring Boot
  • Connaissance des bases de données relationnelles (SQL)
  • Connaissance du langage Java 8 ou supérieur
  • Installation de JDK 1.8+
  • Installation d'IDE comme IntelliJ IDEA ou Eclipse
  • Installation de Docker pour Redis (optionnel, mais recommandé pour une mise en production plus facile)

Concepts fondamentaux

1. Caching avec Spring Boot

Le caching est un mécanisme qui permet de stocker les résultats des opérations longues ou coûteuses dans la mémoire vive afin d'éviter leur réexécution lorsqu'elles sont nécessaires une nouvelle fois.

Schema mental :

+-------------------+
|    Application    |
+---------+---------+
          |
          v
+---------+---------+
|   Cache (Redis)     |
+---------+---------+

2. Intégration de Redis avec Spring Boot

Pour intégrer Redis avec Spring Boot, nous avons besoin de quelques dépendances dans notre fichier pom.xml.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3. Configuration du Cache

Nous devons configurer Redis en tant que cache manager.

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("products");
    }
}

4. Utilisation du Caching

Nous pouvons utiliser les annotations de Spring pour activer le caching sur nos méthodes.

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class ProductService {

    @Cacheable(value = "products", key = "#id")
    public Product getProductById(Long id) {
        // Simuler une requête à la base de données
        return new Product(id, "Product Name");
    }
}

5. Configuration de Redis

Nous devons également configurer Redis dans notre application Spring Boot.

spring:
  redis:
    host: localhost
    port: 6379

Mise en pratique : projet fil rouge

Commençons par créer un simple gestionnaire de tâches avec caching. Nous allons utiliser Spring Boot pour le backend et Redis pour le caching.

Étape 1 : Création du Projet

Créer un nouveau projet Spring Boot via l'Assistant Spring Initializr (https://start.spring.io/) avec les dépendances suivantes :

  • Spring Web
  • Spring Data Redis

Étape 2 : Configuration de Redis

Ajoutez la configuration de Redis dans le fichier application.yml :

spring:
  redis:
    host: localhost
    port: 6379

Étape 3 : Création des Entités et Repositories

Créer une entité Task :

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Task {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String description;
    private boolean completed;

    // Getters and Setters
}

Créer un repository TaskRepository :

import org.springframework.data.jpa.repository.JpaRepository;

public interface TaskRepository extends JpaRepository<Task, Long> {
}

Étape 4 : Configuration du Cache

Ajoutez la configuration de cache dans le fichier CacheConfig.java :

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("tasks");
    }
}

Étape 5 : Service et Contrôleur

Créer un service TaskService avec caching :

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class TaskService {

    @Autowired
    private TaskRepository taskRepository;

    @Cacheable(value = "tasks", key = "#id")
    public Task getTaskById(Long id) {
        return taskRepository.findById(id).orElse(null);
    }
}

Créer un contrôleur TaskController :

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/tasks")
public class TaskController {

    @Autowired
    private TaskService taskService;

    @GetMapping("/{id}")
    public Task getTask(@PathVariable Long id) {
        return taskService.getTaskById(id);
    }
}

Étape 6 : Exécution et Tests

Exécutez l'application Spring Boot et accédez à http://localhost:8080/tasks/1 plusieurs fois. Vous devriez voir que la première requête est plus longue, tandis que les suivantes sont instantanées.

Erreurs frequentes et debugging

1. Cache non mis à jour

Erreur :

TaskService.getTaskById(Long id) {
    return taskRepository.findById(id).orElse(null);
}

Le cache n'est pas mis à jour lorsqu'une tâche est mise à jour.

Correction :

Ajoutez une méthode pour mettre à jour le cache après la modification d'une tâche :

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class TaskService {

    @Autowired
    private TaskRepository taskRepository;

    @Cacheable(value = "tasks", key = "#id")
    public Task getTaskById(Long id) {
        return taskRepository.findById(id).orElse(null);
    }

    @CacheEvict(value = "tasks", key = "#id")
    public void updateTask(Task task) {
        taskRepository.save(task);
    }
}

2. Cache non utilisé

Erreur :

@GetMapping("/{id}")
public Task getTask(@PathVariable Long id) {
    return taskService.getTaskById(id);
}

Le cache n'est pas utilisé.

Correction :

Ajoutez l'annotation @Cacheable sur la méthode du service :

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class TaskService {

    @Autowired
    private TaskRepository taskRepository;

    @Cacheable(value = "tasks", key = "#id")
    public Task getTaskById(Long id) {
        return taskRepository.findById(id).orElse(null);
    }
}

3. Cache expiré

Erreur :

Le cache est expiré et les données ne sont pas actualisées.

Correction :

Ajoutez une politique de expiration appropriée dans la configuration du cache :

@Bean
public CacheManager cacheManager() {
    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .entryTtl(Duration.ofMinutes(10));
    return RedisCachingConfigurerSupport.builder().cacheDefaults(config).build();
}

Pour aller plus loin

1. Utilisation de Redis Cluster

Pour une mise à l'échelle, vous pouvez utiliser Redis Cluster.

Lien vers la documentation officielle

2. Sérialization personnalisée

Vous pouvez personnaliser la sérialization pour les objets stockés dans le cache.

Lien vers la documentation officielle

3. Utilisation de Cache Invalidation via Pub/Sub

Vous pouvez utiliser Redis Pub/Sub pour invalider le cache lorsqu'une modification est effectuée.

Lien vers la documentation officielle

Défi pratique

Implémentez un système de caching pour une application d'API RESTful qui récupère des données à partir d'une base de données relationnelle. Assurez-vous que le cache est mis à jour et mis en œuvre une politique de expiration appropriée.

Indice :

  • Utilisez Spring Boot et Spring Data JPA.
  • Intégrez Redis pour le caching.
  • Ajoutez des méthodes pour mettre à jour et invalider le cache.

Besoin d'aide sur Spring Boot ?

Besoin d'aide sur un projet technique ? Decrivez-le pour des conseils personnalises.

Recevoir des conseils

Questions frequentes

Quelle est l'utilité du caching dans une application Spring Boot?
Le caching améliore les performances d'une application en stockant temporairement des données fréquemment requises, réduisant ainsi le temps de réponse et la charge sur les ressources.
Comment configurer Redis pour être utilisé comme cache dans Spring Boot?
Pour configurer Redis comme cache dans Spring Boot, vous devez ajouter des dépendances Spring Data Redis et Lettuce (ou Jedis) dans votre fichier pom.xml ou build.gradle, puis configurer le bean de connexion Redis dans une classe de configuration.
Quelles sont les avantages d'utiliser Redis comme backend pour le caching?
Redis offre des performances élevées et est en mémoire, ce qui le rend idéal pour le caching. Il prend également en charge diverses structures de données et offertices avancées comme la réplication et l'expiration des clés.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.