"""Connector for Redis.""" import json from typing import List import redis from ddtrace import tracer from owsresponse.adaptors.flask_encoder import FlaskEncoder from permissions import config if not config.REDIS_URL: import fakeredis client = fakeredis.FakeStrictRedis() else: client = redis.Redis(host=config.REDIS_URL) def set(key, data, ttl=config.REDIS_CACHE_TTL): # noqa: A001 """Save data to Redis client.""" if isinstance(data, str): return client.set(key, value=data, ex=ttl) return client.set(key, json.dumps(data, cls=FlaskEncoder), ex=ttl) def get(key): """Get data from Redis client.""" data = client.get(key) if data is None: return None try: data = json.loads(data.decode('utf8')) return data except json.decoder.JSONDecodeError: return data def delete(key): """Delete a key from Redis client.""" return client.delete(key) def delete_keys(keys: List[str]) -> None: """Delete a list of keys from Redis.""" return client.delete(*keys) @tracer.wrap('delete_all_matching_pattern', service='redis') def delete_all_matching_pattern(pattern): """Delete keys matching pattern from Redis client.""" keys = client.keys(pattern) for k in keys: client.delete(k)