Remplace memcached par Redis

This commit is contained in:
Emmanuel Viennet 2021-07-27 15:33:11 +03:00
parent da4cea0316
commit 3b5b449a8a
6 changed files with 27 additions and 14 deletions

View File

@ -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): En tant qu'utilisateur `scodoc` (pour avoir accès aux bases départements de ScoDoc7):
1. Lancer memcached: Dans un terminal, lancer le serveur:
memcached
2. Dans un autre terminal, lancer le serveur:
export FLASK_APP=scodoc.py export FLASK_APP=scodoc.py
export FLASK_ENV=development export FLASK_ENV=development

View File

@ -33,7 +33,12 @@ mail = Mail()
bootstrap = Bootstrap() bootstrap = Bootstrap()
moment = Moment() 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): def create_app(config_class=Config):

View File

@ -974,7 +974,7 @@ def MonthTableBody(
# #
# Cache absences # 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é. # (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 # Le cache peut être invalidé soit par étudiant/semestre, soit pour tous
# les étudiant d'un semestre. # les étudiant d'un semestre.

View File

@ -27,7 +27,7 @@
"""Gestion des caches """Gestion des caches
-écrite pour ScoDoc8, utilise flask_caching et memcached -écrite pour ScoDoc8, utilise flask_caching et REDIS
ScoDoc est maintenant multiprocessus / mono-thread, avec un cache en mémoire partagé. ScoDoc est maintenant multiprocessus / mono-thread, avec un cache en mémoire partagé.
""" """
@ -57,7 +57,6 @@
import time import time
import traceback import traceback
import pylibmc
from flask import g from flask import g
from app.scodoc import notesdb as ndb from app.scodoc import notesdb as ndb
@ -84,8 +83,8 @@ class ScoDocCache:
"""Returns cached evaluation, or None""" """Returns cached evaluation, or None"""
try: try:
return CACHE.get(cls._get_key(oid)) return CACHE.get(cls._get_key(oid))
except pylibmc.Error: except:
log("Warning: memcached error in get") log("XXX CACHE Warning: error in get")
log(traceback.format_exc()) log(traceback.format_exc())
return None return None
@ -98,8 +97,8 @@ class ScoDocCache:
status = CACHE.set(key, value, timeout=cls.timeout) status = CACHE.set(key, value, timeout=cls.timeout)
if not status: if not status:
log("Error: cache set failed !") log("Error: cache set failed !")
except pylibmc.Error: except:
log("Warning: memcached error in set") log("XXX CACHE Warning: error in set !!!")
return status return status
@ -207,12 +206,21 @@ class NotesTableCache(ScoDocCache):
@classmethod @classmethod
def get(cls, formsemestre_id, compute=True): def get(cls, formsemestre_id, compute=True):
"""Returns NotesTable for this formsemestre """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. 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) key = cls._get_key(formsemestre_id)
nt = CACHE.get(key) nt = CACHE.get(key)
if nt or not compute: if nt or not compute:
return nt return nt
# Recompute asked table:
from app.scodoc import notes_table from app.scodoc import notes_table
t0 = time.time() t0 = time.time()
@ -220,6 +228,7 @@ class NotesTableCache(ScoDocCache):
dt = time.time() - t0 dt = time.time() - t0
log("caching formsemestre_id=%s (%gs)" % (formsemestre_id, dt)) log("caching formsemestre_id=%s (%gs)" % (formsemestre_id, dt))
_ = cls.set(formsemestre_id, nt) _ = cls.set(formsemestre_id, nt)
g.nt_cache[formsemestre_id] = nt
return nt return nt

View File

@ -52,9 +52,12 @@ apt-get install -y python3-wheel
apt-get -y install libpq-dev apt-get -y install libpq-dev
apt-get -y install libcrack2-dev apt-get -y install libcrack2-dev
apt-get -y install postgresql apt-get -y install postgresql
apt-get -y install redis
apt-get -y install curl apt-get -y install curl
apt-get -y install graphviz apt-get -y install graphviz
systemctl start redis
# ------------ CREATION DU VIRTUALENV # ------------ CREATION DU VIRTUALENV
echo "Creating python3 virtualenv..." echo "Creating python3 virtualenv..."
python3 -m venv venv || die "can't create Python 3 virtualenv" python3 -m venv venv || die "can't create Python 3 virtualenv"

View File

@ -19,7 +19,7 @@
# 3- Fichiers de données et config locale: # 3- Fichiers de données et config locale:
# archives, photos: /opt/scodoc/var/ => /opt/scodoc-data # 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 source config.sh