⚡ Mise en cache (Caching)
Accélérer votre bot en mettant en cache les résultats des commandes fréquemment utilisées
Pourquoi utiliser le cache ?
Les commandes de votre bot doivent s'exécuter rapidement — idéalement entre 100 et 250 ms. Si une commande prend trop de temps, les utilisateurs auront une mauvaise expérience.
Le cache permet de stocker le résultat d'une commande pour le réutiliser sans la re-exécuter à chaque fois.
Exemple concret : votre serveur traite 1 requête/seconde. Avec des commandes de 250 ms, il gère 4 requêtes par seconde. Mais avec une commande d'1 seconde, une seule requête est traitée, et les suivantes s'accumulent en file d'attente.
Commandes qui risquent d'être lentes
Certaines opérations sont naturellement lentes et bénéficient du cache :
- Requêtes HTTP vers des APIs externes
- Appels API Telegram longs (
sendVideo,getChatMember, etc.) - Diffusion massive de messages
- Lecture/écriture de nombreuses propriétés (plus de 20 en une commande)
- Boucles volumineuses ou mal optimisées
setCache — Activer le cache
Mettez en cache le résultat d'une commande pour une durée déterminée (en secondes).
Cache global (pour tous les utilisateurs)
bot.sendMessage("Bonjour !")
# Mettre en cache pendant 1 heure (3600 secondes)
bot.setCache(3600)
Cache utilisateur (par personne)
bot.sendMessage("Bonjour, " + u["prenom"])
# Cache pendant 1 heure, propre à chaque utilisateur
User.setCache(3600)
Cache global (pour tous les utilisateurs)
Bot.sendMessage("Bonjour !");
// Mettre en cache pendant 1 heure
Bot.setCache(
60 * 60 // durée en secondes = 1 heure
);
Cache utilisateur (par personne)
User.sendMessage("Bonjour, " + user.first_name);
// Cache propre à chaque utilisateur, pendant 1 heure
User.setCache(
60 * 60
);
clearCache — Vider le cache
Utile quand vos données changent et que vous voulez forcer la commande à se re-exécuter.
# Vider le cache global d'une commande Bot.clearCache("/macommande") # Vider le cache utilisateur d'une commande User.clearCache("/macommande")
// Vider le cache global d'une commande Bot.clearCache("/macommande"); // Vider le cache utilisateur d'une commande User.clearCache("/macommande");
Quels types de commandes peuvent être mises en cache ?
Le cache est puissant mais ne convient pas à tout. Voici les critères :
| Critère | Détail |
|---|---|
| Réponse stable | Le message du bot ne change pas souvent |
| Sans paramètres | La commande n'accepte pas de paramètres variables, ou alors ils changent rarement |
| Non critique | Si une ancienne valeur est retournée, ce n'est pas grave |
Si votre commande ne remplit pas ces critères, essayez de la diviser en plusieurs sous-commandes. Certaines pourront être mises en cache tandis que d'autres s'exécuteront en temps réel.
Techniques avancées
Vous pouvez pré-charger le cache en arrière-plan pour des commandes longues :
Commande /start — lance le pré-chargement
bot.sendMessage("Bienvenue dans mon bot !")
# Lancer une tâche longue en arrière-plan
# (à implémenter selon votre logique)
Exemple : afficher l'heure (avec cache)
now = time.strftime("%H:%M:%S")
bot.sendMessage("Heure : " + now)
# Cache pendant 2 minutes — l'heure ne sera mise à jour
# qu'après expiration du cache
bot.setCache(120)
Commande /start — lance le pré-chargement
Bot.sendMessage("Bienvenue dans mon bot !");
Bot.run({
command: "/longBackgroundTask",
run_after: 1 // exécuté en arrière-plan après 1 seconde
});
Commande /longBackgroundTask
// Effectuer les tâches longues ici... Bot.getProperty("myJSON_1"); Bot.getProperty("myJSON_2"); // ... etc ... // Mettre en cache pendant 1 semaine User.setCache( 60 * 60 * 24 * 7 // 604800 secondes );
Exemple : afficher l'heure (avec cache)
var date = new Date();
var time = "Heure : "
+ date.getHours() + ":"
+ date.getMinutes() + ":"
+ date.getSeconds();
Bot.sendMessage(time);
Bot.setCache(120); // cache pendant 120 secondes
🌡️ Exemple concret : cache d'une API météo
Une API météo gratuite limite souvent à quelques requêtes par minute. Le cache divise les appels par 100× — même si 1000 utilisateurs demandent la météo de Paris dans la même heure, l'API n'est appelée qu'une seule fois.
# meteo.py — cache global 30 minutes ville = params or "Paris" res = HTTP.get(f"https://wttr.in/{ville}?format=j1") temp = res["current_condition"][0]["temp_C"] desc = res["current_condition"][0]["weatherDesc"][0]["value"] Bot.sendMessage(f"🌡️ {ville} : {temp}°C, {desc}") # Cache 30 minutes pour TOUS les utilisateurs Bot.setCache(60 * 30)
Résultat utilisateur :
🌡️ Paris : 14°C, Partly cloudy
// meteo.js — cache global 30 minutes let ville = params || "Paris"; let res = HTTP.get(`https://wttr.in/${ville}?format=j1`); let temp = res.current_condition[0].temp_C; let desc = res.current_condition[0].weatherDesc[0].value; Bot.sendMessage(`🌡️ ${ville} : ${temp}°C, ${desc}`); // Cache 30 minutes pour TOUS les utilisateurs Bot.setCache(60 * 30);
📊 Récapitulatif des 4 niveaux de cache
| Fonction | Portée | Usage typique |
|---|---|---|
Bot.setCache(s) | Global — même réponse pour tous | Météo, FAQ, infos publiques |
User.setCache(s) | Par utilisateur | Solde, profil, dashboard perso |
Bot.clearCache(cmd) | Vide le cache global d'une commande | Après mise à jour des données |
User.clearCache(cmd?) | Vide le cache utilisateur (cmd ou tous) | Après achat/transaction |
Bot.clearCache("/macommande").