Frappe Framework
Cache
Chaînes et hashes couvrent l’usage courant. Un calcul déterministe se range sous une clé unique, avec une durée de vie ou un effacement manuel.
Rôle
Redis, en mémoire, accélère un calcul répété ou évite une lecture qui change peu. Bench le lance à part. Chaque worker s’y connecte par frappe.cache. Sur les anciennes versions, c’est frappe.cache(). Le Procfile le démarre avec le bench.
Types
Chaînes : set_value("key", "value") puis get_value. Hashes, comme des dictionnaires dont on met à jour un champ : hset("user|admin", "name", "Admin"), hget, hgetall.
frappe.get_cached_doc("System Settings") lit le document dans le cache, usage cité pour des réglages. L’invalidation est « best-effort ». doc.save ou frappe.db.set_value vide le cache du document. Une requête SQL brute ne le fait pas. À la main : frappe.clear_document_cache(doctype, name).
Calcul maison
slow_add dort une seconde puis additionne. La clé doit être unique, ici slow_addition|{a}+{b}. Si get_value renvoie une valeur, on la rend. Sinon on calcule et set_value. L’opérateur := est dans l’exemple.
Deux façons d’éviter le périmé : expires_in_sec=60*60 (une heure), ou delete_value. Pour un hash, hdel.
Décorateur
from frappe.utils.caching import redis_cache. @redis_cache sur slow_function : le premier appel de (40, 2) prend une seconde et renvoie 42, le suivant 897 µs. @redis_cache(ttl=60) expire au bout de 60 secondes. Sinon slow_function.clear_cache().
Installation
La config est dans {bench}/config/. Le Procfile contient redis_cache: redis-server config/redis_cache.conf. L’exemple : dbfilename redis_cache.rdb, répertoire et pid sous config/pids, bind 127.0.0.1, port 13000, maxmemory 737mb, politique allkeys-lru, appendonly no, save "". Seul maxmemory est à ajuster pour donner plus de mémoire. Le reste de la syntaxe est dans la doc Redis.
Détails
frappe.cache préfixe par le site : la même clé sur deux sites du bench fait deux entrées. Voir frappe.cache.make_key. pickle sérialise les objets complexes, donc pas de conversion à la main. pickle.
frappe.local.cache évite de rappeler Redis dans la même requête ou le même job. Les ajouts Frappe enveloppent le client dans frappe.utils.redis_wrapper.
Point d’attention
Une écriture SQL directe laisse un document en cache. Deux sites ne partagent pas les clés, malgré le même Redis.
