Ajouter un cache en Python
Tags: python, tutorial, beginners, french
Published: 2023-05-29 11:19:23

Quand on bosse sur des apis, notamment pour visualiser des informations, ça arrive rapidement qu'on ait plein d'appels identiques. Du coup, pour éviter une surutilisation inutile de nos ressources on peut mettre en place un cache directement dans notre api en Python.

Donc aujourd'hui, on va voir comment faire ça avec **lru_cache**.

---

## Installation
Comme beaucoup de librairie python, lru_cache est disponible via pip.

PIP - Lru_cache : https://pypi.org/project/lru_cache/

```bash
pip install lru_cache
```

---

## Utilisation
```python
from cache import LruCache  
  
@LruCache(maxsize=2, timeout=1)  
def foo(num):  
	return num  
```

Comme vous pouvez le constater, son utilisation est très simple. Il s'agit d'une  **annotation à ajouter au dessus de la déclaration de la méthode que vous voulez cacher**.

### Paramètres
#### maxsize
`maxsize` correspond au **nombre maximum d'appels différents de la méthode `foo` que l'on veut cacher en même temps.** 

Par appels différents, on entend qu'il y a au moins un paramètre qui change. 

*Exemple*
```python
foo(1) # Foo est appelé et le résultat est mis dans le cache
foo(1) # La valeur est directement retournée du cache
foo(2) # Foo est appelé et le résultat est mis dans le cache
foo(3) # Foo est appelé et le résultat est mis dans le cache à la place du résultat de 1 vu que la taille maximale du cache est 2.
foo(2) # La valeur est directement retournée du cache
```

Si **aucune valeur n'est donnée**, alors **toutes les informations seront cachées**.

#### timeout
`timeout` correspond **au nombre de secondes où le résultat d'un appel doit être conservée dans le cache**.

```python
foo(1) # Appel fait à 10:00:00 - La méthode est appelée et le résultat est stockée dans le cache
foo(1) # Appel fait à 10:00:00 - Le résultat vient du cache
foo(2) # Appel fait à 10:00:00 - La méthode est appelée et le résultat est stockée dans le cache
foo(2) # Appel fait à 10:00:00 - Le résultat vient du cache
foo(1) # Appel fait à 10:00:01 - Le résultat vient du cache
foo(1) # Appel fait à 10:00:02 - La valeur précédente du cache a expiré, la méthode sera donc appelée à nouveau et le résultat sera stocké dans le cache.
```

Si **aucune valeur n'est donnée pour ce paramètre, toutes les informations seront conservées jusqu'au redémarrage du service.**

---

## Invalider le cache
Si jamais vous avez besoin d'invalider une valeur dans le cache *(rendre une valeur "invalide" dans le cache, forçant son remplacement au prochain appel)*, vous pouvez utiliser le traitement suivant:

```python
foo.invalidate(num)
```

---

Et voilà! En simplement quelques lignes, on a été capable de mettre en place un cache permettant d'améliorer les performances de notre api!

J'espère que ça vous aidera et si jamais vous avez des questions, quelles qu'elles soient *(Il n'y a jamais de questions bêtes!)* ou des points qui ne sont pas clairs pour vous, n'hésitez pas à laisser un message dans les commentaires ou à me joindre directement sur [LinkedIn](https://www.linkedin.com/in/maxime-guilbert-14b6a5128/) *(même pour parler d'autres sujets!)*.

---

<center><h3>Vous voulez me supporter?</h3></center>
<a href="https://www.buymeacoffee.com/mxguilbert7" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="41" width="174"></a>