From 7d86972e58374566278bc8d164b32a3018d6f194 Mon Sep 17 00:00:00 2001 From: pictuga Date: Sat, 11 Sep 2021 21:36:14 +0200 Subject: [PATCH] Add Redis cache backend --- README.md | 6 ++++-- morss/cache.py | 25 +++++++++++++++++++++++++ setup.py | 2 +- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a44c460..4955eb5 100644 --- a/README.md +++ b/README.md @@ -60,8 +60,8 @@ Full installation (including optional dependencies) pip install git+https://git.pictuga.com/pictuga/morss.git#[full] ``` -The full install includes mysql (possible cache backend). Otherwise, only -in-memory and sqlite3 caches are available. +The full install includes mysql and redis (possible cache backends). Otherwise, +only in-memory and sqlite3 caches are available. The dependency `lxml` is fairly long to install (especially on Raspberry Pi, as C code needs to be compiled). If possible on your distribution, try installing @@ -372,6 +372,8 @@ will be cleared every time the program is run). Path can be defined with `SQLITE_PATH`. - `CACHE=mysql`: MySQL cache. Connection can be defined with the following environment variables: `MYSQL_USER`, `MYSQL_PWD`, `MYSQL_DB`, `MYSQL_HOST` +- `CACHE=redis`: Redis cache. Connection can be defined with the following +environment variables: `REDIS_HOST`, `REDIS_PORT`, `REDIS_DB`, `REDIS_PWD` To limit the size of the cache: diff --git a/morss/cache.py b/morss/cache.py index ad655ff..6bc18ac 100644 --- a/morss/cache.py +++ b/morss/cache.py @@ -141,6 +141,23 @@ class CappedDict(OrderedDict, BaseCache): OrderedDict.__setitem__(self, key, data) +try: + import redis # isort:skip +except ImportError: + pass + + +class RedisCacheHandler(BaseCache): + def __init__(self, host='localhost', port=6379, db=0, password=None): + self.r = redis.Redis(host=host, port=port, db=db, password=password) + + def __getitem__(self, key): + return self.r.get(key) + + def __setitem__(self, key, data): + self.r.set(key, data) + + if 'CACHE' in os.environ: if os.environ['CACHE'] == 'mysql': default_cache = MySQLCacheHandler( @@ -159,5 +176,13 @@ if 'CACHE' in os.environ: default_cache = SQLiteCache(path) + elif os.environ['CACHE'] == 'redis': + default_cache = RedisCacheHandler( + host = os.getenv('REDIS_HOST', 'localhost'), + port = int(os.getenv('REDIS_PORT', 6379)), + db = int(os.getenv('REDIS_DB', 0)), + password = os.getenv('REDIS_PWD', None) + ) + else: default_cache = CappedDict() diff --git a/setup.py b/setup.py index 2c72ed4..40e22cf 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ setup( license = 'AGPL v3', packages = [package_name], install_requires = ['lxml', 'bs4', 'python-dateutil', 'chardet'], - extras_require = {'full': ['pymysql']}, + extras_require = {'full': ['pymysql', 'redis']}, package_data = {package_name: ['feedify.ini']}, data_files = [ ('share/' + package_name, ['README.md', 'LICENSE']),