From a69e013fb5c70795e4d3a84bdf19edf9bede9d9b Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Tue, 23 Dec 2014 15:55:48 -0800 Subject: [PATCH] Continue functioning even if Redis is down --- rophako/jsondb.py | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/rophako/jsondb.py b/rophako/jsondb.py index 89cfd46..ba1028a 100644 --- a/rophako/jsondb.py +++ b/rophako/jsondb.py @@ -187,23 +187,35 @@ def write_json(path, data): # Redis Caching Functions # ############################################################################ +disable_redis = False def get_redis(): """Connect to Redis or return the existing connection.""" global redis_client - if not redis_client: - redis_client = redis.StrictRedis( - host = Config.db.redis_host, - port = Config.db.redis_port, - db = Config.db.redis_db, - ) + global disable_redis + + if not redis_client and not disable_redis: + try: + redis_client = redis.StrictRedis( + host = Config.db.redis_host, + port = Config.db.redis_port, + db = Config.db.redis_db, + ) + redis_client.ping() + except Exception as e: + logger.error("Couldn't connect to Redis; memory caching will be disabled! {}".format(e.message)) + redis_client = None + disable_redis = True return redis_client def set_cache(key, value, expires=None): """Set a key in the Redis cache.""" key = Config.db.redis_prefix + key + client = get_redis() + if not client: + return + try: - client = get_redis() client.set(key, json.dumps(value)) # Expiration date? @@ -217,8 +229,11 @@ def get_cache(key): """Get a cached item.""" key = Config.db.redis_prefix + key value = None + client = get_redis() + if not client: + return + try: - client = get_redis() value = client.get(key) if value: value = json.loads(value) @@ -232,6 +247,8 @@ def del_cache(key): """Delete a cached item.""" key = Config.db.redis_prefix + key client = get_redis() + if not client: + return client.delete(key) @@ -243,8 +260,9 @@ def lock_cache(key, timeout=5, expire=20): The `expire` is how long a lock may exist before it's considered stale. Returns True on success, None on failure to acquire lock.""" - lock_key = key + "_lock" - client = get_redis() + client = get_redis() + if not client: + return # Take the lock. lock = client.lock(key, timeout=expire) @@ -255,5 +273,6 @@ def lock_cache(key, timeout=5, expire=20): def unlock_cache(lock): """Release the lock on a cache key.""" - lock.release() - logger.debug("Cache lock released") + if lock: + lock.release() + logger.debug("Cache lock released")