From 3b5b449a8ad675ef9f4efd9a215ae8d80a47a6bc Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Tue, 27 Jul 2021 15:33:11 +0300 Subject: [PATCH] Remplace memcached par Redis --- README.md | 6 +----- app/__init__.py | 7 ++++++- app/scodoc/sco_abs.py | 2 +- app/scodoc/sco_cache.py | 21 +++++++++++++++------ tools/install_debian10.sh | 3 +++ tools/migrate_from_scodoc7.sh | 2 +- 6 files changed, 27 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index b9581834b8..608b980b4b 100644 --- a/README.md +++ b/README.md @@ -150,11 +150,7 @@ de votre installation ScoDoc 7 pour passer à ScoDoc 8 (*ne pas utiliser en prod En tant qu'utilisateur `scodoc` (pour avoir accès aux bases départements de ScoDoc7): - 1. Lancer memcached: - - memcached - - 2. Dans un autre terminal, lancer le serveur: +Dans un terminal, lancer le serveur: export FLASK_APP=scodoc.py export FLASK_ENV=development diff --git a/app/__init__.py b/app/__init__.py index 6ebf1b3d30..bcb5c567ac 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -33,7 +33,12 @@ mail = Mail() bootstrap = Bootstrap() moment = Moment() -cache = Cache(config={"CACHE_TYPE": "MemcachedCache"}) # XXX TODO: configuration file +cache = Cache( # XXX TODO: configuration file + config={ + # "CACHE_TYPE": "MemcachedCache" + "CACHE_TYPE": "RedisCache" + } +) def create_app(config_class=Config): diff --git a/app/scodoc/sco_abs.py b/app/scodoc/sco_abs.py index 24c61d4a5e..65e1f9d5b7 100644 --- a/app/scodoc/sco_abs.py +++ b/app/scodoc/sco_abs.py @@ -974,7 +974,7 @@ def MonthTableBody( # # Cache absences # -# On cache (via memcached ou autre, voir sco_cache.py) les _nombres_ d'absences +# On cache (via REDIS ou autre, voir sco_cache.py) les _nombres_ d'absences # (justifiées et non justifiées) de chaque etudiant dans un semestre donné. # Le cache peut être invalidé soit par étudiant/semestre, soit pour tous # les étudiant d'un semestre. diff --git a/app/scodoc/sco_cache.py b/app/scodoc/sco_cache.py index 193ebd68c2..61e5424001 100644 --- a/app/scodoc/sco_cache.py +++ b/app/scodoc/sco_cache.py @@ -27,7 +27,7 @@ """Gestion des caches - Ré-écrite pour ScoDoc8, utilise flask_caching et memcached + Ré-écrite pour ScoDoc8, utilise flask_caching et REDIS ScoDoc est maintenant multiprocessus / mono-thread, avec un cache en mémoire partagé. """ @@ -57,7 +57,6 @@ import time import traceback -import pylibmc from flask import g from app.scodoc import notesdb as ndb @@ -84,8 +83,8 @@ class ScoDocCache: """Returns cached evaluation, or None""" try: return CACHE.get(cls._get_key(oid)) - except pylibmc.Error: - log("Warning: memcached error in get") + except: + log("XXX CACHE Warning: error in get") log(traceback.format_exc()) return None @@ -98,8 +97,8 @@ class ScoDocCache: status = CACHE.set(key, value, timeout=cls.timeout) if not status: log("Error: cache set failed !") - except pylibmc.Error: - log("Warning: memcached error in set") + except: + log("XXX CACHE Warning: error in set !!!") return status @@ -207,12 +206,21 @@ class NotesTableCache(ScoDocCache): @classmethod def get(cls, formsemestre_id, compute=True): """Returns NotesTable for this formsemestre + Search in local cache (g.nt_cache) or global app cache (eg REDIS) If not in cache and compute is True, build it and cache it. """ + # try local cache (same request) + if not hasattr(g, "nt_cache"): + g.nt_cache = {} + else: + if formsemestre_id in g.nt_cache: + return g.nt_cache[formsemestre_id] + # try REDIS key = cls._get_key(formsemestre_id) nt = CACHE.get(key) if nt or not compute: return nt + # Recompute asked table: from app.scodoc import notes_table t0 = time.time() @@ -220,6 +228,7 @@ class NotesTableCache(ScoDocCache): dt = time.time() - t0 log("caching formsemestre_id=%s (%gs)" % (formsemestre_id, dt)) _ = cls.set(formsemestre_id, nt) + g.nt_cache[formsemestre_id] = nt return nt diff --git a/tools/install_debian10.sh b/tools/install_debian10.sh index 04446f9126..aaa1aa5f15 100755 --- a/tools/install_debian10.sh +++ b/tools/install_debian10.sh @@ -52,9 +52,12 @@ apt-get install -y python3-wheel apt-get -y install libpq-dev apt-get -y install libcrack2-dev apt-get -y install postgresql +apt-get -y install redis apt-get -y install curl apt-get -y install graphviz +systemctl start redis + # ------------ CREATION DU VIRTUALENV echo "Creating python3 virtualenv..." python3 -m venv venv || die "can't create Python 3 virtualenv" diff --git a/tools/migrate_from_scodoc7.sh b/tools/migrate_from_scodoc7.sh index 3e433ecebc..c7a65b560b 100755 --- a/tools/migrate_from_scodoc7.sh +++ b/tools/migrate_from_scodoc7.sh @@ -19,7 +19,7 @@ # 3- Fichiers de données et config locale: # archives, photos: /opt/scodoc/var/ => /opt/scodoc-data # -# 4- TODO migrer de Apache à nginx, installer memcached, scripts service systemd +# 4- TODO migrer de Apache à nginx, scripts service systemd # source config.sh